JWT
JWT
Cookie、Session、Token、JWT 面试八股文
1. 认证(Authentication) vs 授权(Authorization)
- 认证(身份验证):确认 “你是你自己”(登录、指纹识别)。
- 授权(访问权限):确认 “你能访问什么”(应用权限、OAuth 授权)。
- 凭证(Credentials):证明身份的媒介,如 Cookie、Session、Token、JWT。
2. 什么是 Cookie?
定义:存储在客户端的 小型数据文件,用于 记录用户身份。
特点:
- 存储位置:浏览器端(
document.cookie)。 - 大小限制:单个
cookie不超过 4KB,单域最多存 300 个 cookie。 - 作用域
- 不可跨域(
domain绑定单一域名)。 - 一级 & 二级域名可共享(
domain=.example.com)。
- 不可跨域(
- 生命周期
- 会话 Cookie(
Session Cookie):浏览器关闭后消失。 - 持久化 Cookie(
Persistent Cookie):可设置expires/max-age。
- 会话 Cookie(
- 存储位置:浏览器端(
常见属性:
| 属性 | 作用 |
|---|---|
expires | 过期时间(UTC 时间) |
max-age | 多少秒后过期 |
domain | 允许访问的域 |
path | 允许访问的路径 |
secure | 仅 HTTPS 传输 |
httpOnly | 防止 JS 读取(防 XSS 攻击) |
SameSite | 防止跨站请求伪造(CSRF) |
- 安全性: 容易被劫持 & 窃取,应 配合
httpOnly&Secure保护。
3. 什么是 Session?
定义:存储在服务器端的会话数据,客户端只存
sessionID。认证流程:
- 用户登录,服务器生成
sessionID。 sessionID存入 浏览器 Cookie。- 客户端请求时携带
sessionID,服务器验证身份。
- 用户登录,服务器生成
特点:
更安全(数据存于服务器)。
生命周期短(默认会话级,可配置过期时间)。
存储大小远大于 Cookie(但占服务器资源)。
Session 共享方案(分布式架构):
| 方案 | 优缺点 |
|---|---|
| Session 复制 | 容错性高 网络负担大 |
| 粘性 Session(IP 绑定) | 低成本 服务器宕机会丢失 |
| Redis / Memcached 共享 Session | 高性能,持久化 需额外维护 Redis |
| Session 持久化(数据库) | 可恢复 读写性能低 |
4. 什么是 Token?
定义:用户身份认证凭证,服务器无状态存储。
认证流程:
- 用户登录,服务器生成
token(uid + 时间戳 + 签名)。 token存入客户端(Cookie/localStorage/SessionStorage)。- 客户端每次请求时,携带
token(放Authorization头部)。 - 服务器校验
token,成功则返回数据。
- 用户登录,服务器生成
优缺点:
| 特点 | Session | Token |
|---|---|---|
| 存储方式 | 服务器端 | 客户端 |
| 跨域支持 | 依赖 Cookie | 可直接传递 |
| 安全性 | 服务端管理 | 客户端存储易被窃取 |
| 适用场景 | Web 站点 | 微服务 & 移动端 |
Refresh Token(刷新令牌):
Access Token有效期较短,Refresh Token用于刷新Access Token,无需用户重新登录。- 避免频繁输入用户名密码,提高安全性。
5. 什么是 JWT(JSON Web Token)?
定义:基于 JSON 的身份认证方式,用于无状态认证(API 调用)。
组成(
header.payload.signature):header:算法(如HS256)。payload:用户信息(如userId、exp)。signature:防篡改签名(HMACSHA256)。
认证流程:
- 用户登录,服务器生成
JWT并返回客户端。 - 客户端存储
JWT,并在请求头发送Authorization: Bearer <token>。 - 服务器解析
JWT,验证身份。
- 用户登录,服务器生成
JWT vs Token 区别
| 特点 | Token | JWT |
|---|---|---|
| 存储方式 | 服务端 | 客户端 |
| 跨域支持 | 是 | 是 |
| 是否包含用户信息 | 否 | 是 |
| 服务器是否需要存储 | 是 | 否 |
| 适用场景 | 微服务认证 | 单点登录(SSO) |
JWT 优缺点:
无状态:服务端不存储 Session,适合微服务 & SSO。
高效:减少数据库查询次数。
无法废弃:一旦签发,无法主动撤销。
安全性:
JWT一旦泄露,任何人都可使用。优化 JWT
HTTPS 传输(防止中间人攻击)。
Token 过期时间要短(防止长期滥用)。
黑名单机制(如存储废弃
JWT)。
6. 常见前后端鉴权方式
- Session-Cookie(适合 Web 站点)。
- Token 认证(适合移动端 / API 认证)。
- OAuth 2.0(适合第三方授权)。
- JWT(适合微服务 & SSO)。
7. 防攻击技巧
防止 CSRF 攻击:
使用
SameSite属性,限制 Cookie 发送范围。使用 Token 认证,避免依赖 Cookie。
防止 XSS 攻击:
设置
httpOnly,防止 JS 读取 Cookie。对输入进行转义处理(防止注入)。
防止 Cookie 窃取:
启用
Secure,仅 HTTPS 传输。Cookie 过期时间尽量短。
防止 Token 泄露:
使用短 Token + Refresh Token(定期更新)。
Token 存储位置:不建议 localStorage(易受 XSS 攻击),可以放 httpOnly Cookie。
8. 结论:如何选择?
| 适用场景 | 推荐方式 |
|---|---|
| 普通 Web 登录 | Session + Cookie |
| 前后端分离 API 认证 | Token(存 httpOnly Cookie) |
| 移动端 / 微服务 / SSO | JWT |
| OAuth 授权 | OAuth 2.0 + JWT |
如果是 Web 项目,优先考虑
Session + Cookie(简单 & 安全)。如果是微服务 / 移动端,推荐
JWT(无状态 & 跨域支持)。如果涉及第三方授权,使用
OAuth 2.0(如 GitHub、Google 登录)。面试时牢记:安全性、适用场景、优势 & 劣势!