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
。 ✅ 认证流程: 1️⃣ 用户登录,服务器生成 sessionID
。 2️⃣ sessionID
存入 浏览器 Cookie。 3️⃣ 客户端请求时携带 sessionID
,服务器验证身份。
✅ 特点:
- 更安全(数据存于服务器)。
- 生命周期短(默认会话级,可配置过期时间)。
- 存储大小远大于 Cookie(但占服务器资源)。
✅ Session 共享方案(分布式架构):
方案 | 优缺点 |
---|---|
Session 复制 | 🚀 容错性高 ❌ 网络负担大 |
粘性 Session(IP 绑定) | 🚀 低成本 ❌ 服务器宕机会丢失 |
Redis / Memcached 共享 Session | 🚀 高性能,持久化 ❌ 需额外维护 Redis |
Session 持久化(数据库) | 🚀 可恢复 ❌ 读写性能低 |
4️⃣ 什么是 Token?🎫
✅ 定义:用户身份认证凭证,服务器无状态存储。 ✅ 认证流程: 1️⃣ 用户 登录,服务器生成 token
(uid + 时间戳 + 签名
)。 2️⃣ token
存入客户端(Cookie
/ localStorage
/ SessionStorage
)。 3️⃣ 客户端每次请求时,携带 token
(放 Authorization
头部)。 4️⃣ 服务器 校验 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
)。
✅ 认证流程: 1️⃣ 用户登录,服务器生成 JWT
并返回客户端。 2️⃣ 客户端 存储 JWT
并在 请求头 发送 Authorization: Bearer <token>
。 3️⃣ 服务器解析 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 登录)。
🚀 面试时牢记:安全性、适用场景、优势 & 劣势!