Cookie / Session / JWT 的差异是什么?登录态方案怎么选?
先澄清一个常见误区:Cookie 是“存/带数据的方式”,Session 和 JWT 是“登录态实现方式”。
| 项目 | Cookie | Session | JWT |
|---|---|---|---|
| 本质 | 浏览器存储+自动随请求发送 | 服务端保存登录状态 | 自包含的签名令牌 |
| 状态存哪 | 客户端(浏览器) | 服务端(Redis/内存/DB) | 主要在令牌里(客户端持有) |
| 服务端每次查库/查存储 | 视内容而定 | 通常要(按 sessionId 查) | 通常不用(验签即可) |
| 失效/登出控制 | 通过过期或删除 | 很容易,删 session 即可 | 较难,常靠短期过期+黑名单/轮换 |
| 典型风险 | 被窃取、CSRF(若自动带) | 会话固定、会话存储压力 | 泄露后可被重放到过期,撤销困难 |
关键差异:
Session:最容易做“可控下线/封禁/踢人”,但有服务端状态成本。JWT:跨服务、无状态扩展好,但撤销难,设计不当安全风险更高。Cookie:可承载sessionId或JWT;不是 Session/JWT 的对立面。
怎么选(实战):
- 传统 Web 后台、管理系统:优先
Session + HttpOnly + Secure + SameSite Cookie。 - 多端/API 网关/微服务:
短期 Access JWT + Refresh Token(刷新令牌要轮换)。 - 安全要求高且要随时失效:优先 Session 或“opaque token + introspection”。
- Web 端尽量不要把长期 token 放
localStorage(XSS 风险高)。