三者都用于在无状态的 HTTP 之上维持会话,区别在于状态存哪里:

  • Cookie:浏览器按域名保存的小段键值数据,每次请求自动携带,本身只是载体,可设 HttpOnly/Secure/SameSite。
  • Session:会话数据存服务端(内存、Redis 等),Cookie 里只放 session id,服务端凭 id 查会话。
  • Token:把用户信息编码进令牌本身,服务端无状态,客户端每次请求携带(常放 Authorization 头)。

JWT 原理:由三段 Base64URL 编码组成——Header(算法)、Payload(用户 id、过期时间等声明)、Signature(用密钥对前两段签名)。服务端收到后验签并检查过期时间即可,无需查库。

对比与易错点

  • Session 方案服务端可控(可随时踢人下线),但分布式下要共享存储;JWT 天然支持水平扩展,但签发后难以主动失效,只能等过期或维护黑名单。
  • JWT 只是编码不是加密,Payload 可被任何人解码,绝不能放敏感信息;签名密钥泄露则全线失守。
  • Token 放 localStorage 易受 XSS 窃取,放 Cookie 则要防 CSRF(SameSite、双重提交)。

追问方向:刷新令牌(refresh token)机制、单点登录如何落地。