这三个都是在**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=abc123
session_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
是一种无状态、可自验证的身份令牌,更适合现代前后端分离和分布式系统。