结论:session-cookie 是有状态方案——服务端存会话,天然支持单点登出、踢人、权限实时变更,适合单体和第一方 Web 应用;JWT 是无状态自包含令牌——服务端免存储、天然跨服务跨域传递,适合微服务间调用、第三方 API、移动端,代价是吊销困难(令牌有效期内无法作废)和体积大。
展开:对比关键维度:1)吊销与风控——session 删记录即失效,JWT 只能等过期(缓解:缩短 access token 寿命 + refresh token 换发,或维护黑名单——但黑名单又把状态请回来了);2)存储与扩展性——session 集中存储(Redis)是共享状态,多机房要同步;JWT 验证只需公钥,无中心依赖;3)传输与 CSRF/XSS——cookie 模式要防 CSRF(SameSite/token),Authorization header 携带 JWT 免疫 CSRF 但放 localStorage 后 XSS 可窃取,两头各有功课;4)载荷——JWT 里放 claims(用户 ID、角色)减少查库,但权限变更要等 token 过期才生效,别放敏感数据(payload 只是 base64 不是加密)。经验结论:第一方 Web 应用 session-cookie 依然最稳;服务间 mTLS 或短寿命 JWT(几分钟)是云原生主流;给用户发"长期有效 JWT 存 localStorage"是最差的组合。易错点:JWT 的 kid/jku header 注入和 alg confusion(RS256→HS256)是验证库配置层面的经典漏洞,算法必须服务端固定白名单。
追问方向:PASETO 对 JWT 的算法套件修正、OAuth2 access token 用 JWT 与 introspection 的取舍。