JWT(JSON Web Token)
JWT是一种基于JSON的开放标准(RFC 7519),用于在各方之间安全传输信息。它由三部分组成:头部(Header)、载荷(Payload)和签名(Signature),通常以Header.Payload.Signature的形式传输。
优点
- 无状态:服务端无需存储会话信息,适合分布式系统。
- 跨域支持:适用于前后端分离或微服务架构。
- 自包含:载荷可存储用户信息,减少数据库查询。
缺点
- 无法废止:一旦签发,在过期前无法强制失效(需结合黑名单或短期有效期)。
- 安全性依赖签名:密钥泄露可能导致伪造。
Session
Session是服务端存储的用户会话数据,通常通过Cookie传递Session ID来关联用户。
优点
- 可控性强:服务端可随时销毁会话。
- 安全性高:敏感信息存储在服务端,客户端仅持有ID。
缺点
- 有状态:需集中存储Session数据,扩展性受限(需Redis等解决方案)。
- 跨域限制:需额外配置CORS或反向代理。
Cookie
Cookie是客户端存储的小型文本数据,由服务端通过HTTP响应头Set-Cookie设置,每次请求自动携带。
优点
- 简单易用:浏览器自动管理,无需前端显式处理。
- 兼容性好:所有浏览器支持。
缺点
- 容量限制:单个Cookie通常不超过4KB。
- 安全性风险:易受CSRF攻击(需配合
HttpOnly、SameSite属性)。
对比总结
| 特性 | JWT | Session | Cookie |
|---|---|---|---|
| 存储位置 | 客户端(LocalStorage等) | 服务端 | 客户端 |
| 状态管理 | 无状态 | 有状态 | 无状态(但依赖服务端) |
| 安全性 | 依赖签名 | 依赖Session ID | 需防护CSRF/XSS |
| 适用场景 | API认证、跨服务通信 | 传统Web应用 | 会话跟踪、简单状态保持 |
选择建议
- 需要无状态和跨域时选JWT,但需处理过期和注销问题。
- 需要高安全性和可控性时选Session,但需解决扩展性问题。
- Cookie适合简单场景,但需加强安全配置。