这三个都是在**Web 开发中用于实现用户登录状态保持(认证)**的机制,各有不同的原理和应用场景。
| 特性 | Cookie | Session | JWT(JSON Web Token) |
|---|---|---|---|
| 存储位置 | 浏览器 | 服务器内存/数据库 | 浏览器(本地)+ 服务端验证 |
| 状态类型 | 客户端存状态 | 服务器存状态(服务端会话) | 无状态(token 自包含) |
| 是否依赖 Cookie | 是(用于传 Session ID) | 是(默认) | 不一定(也可放在 Header) |
| 安全性 | 容易被劫持 | 比较安全 | 若暴露,风险大(需签名验证) |
| 可扩展性 | 一般 | 较低(需共享 session) | 高(支持分布式系统) |
| 是否易失 | 持久化(浏览器控制) | 默认短期(内存中) | 可长期保存(有过期时间) |
Set-Cookie: token=abc123; Path=/; HttpOnly; Secure;
下一次请求时:
Cookie: token=abc123
Cookie(如 JSESSIONID)保存
Session ID,服务端据此找到该用户对应的数据。user_id=1)Set-Cookie: session_id=abc123session_id=abc123 对应的登录状态xxxxx.yyyyy.zzzzz
Header.Payload.Signature
用户登录,服务端生成 JWT token,发送给前端
前端保存到 Cookie 或 LocalStorage 中
后续每次请求时将 token 放到请求头:
Authorization: Bearer xxxxx.yyyy.zzzz服务端验证签名 → 通过则认为用户已登录
exp)| 场景 | 推荐使用 |
|---|---|
| 简单小网站 | Cookie + Session(传统方式) |
| 分布式系统/微服务 | JWT(无状态、跨服务) |
| 前后端分离项目 | JWT 或 Session + Redis |
| 需要高安全要求 | Session(可立即失效 + HttpOnly) |
Cookie是客户端保存数据的机制,Session是服务端保存用户状态的方法,JWT是一种无状态、可自验证的身份令牌,更适合现代前后端分离和分布式系统。