用户认证是每个 Web 应用的基础设施。传统的 Session 方案依赖服务端存储,而 JWT 提供了无状态方案——Token 本身携带用户信息,服务器不需要查数据库就能验证身份。

JWT 的结构

JWT 由三部分组成,用 . 分隔:Header(签名算法)、Payload(携带信息如 sub/iat/exp)、Signature(防篡改签名)。

Access Token + Refresh Token 双令牌策略

这是生产环境的标准方案:

  • Access Token 有效期短(15 分钟),暴露风险低
  • Refresh Token 有效期长(7-30 天),用于静默续签
  • Refresh Token 应存储在 httpOnly Cookie 中而不是 localStorage

用户在 Access Token 过期后,前端自动用 Refresh Token 换取新的 Access Token,整个过程对用户完全透明。

安全防线

密钥管理

永远不要把 JWT Secret 硬编码在代码里。使用环境变量 + 密钥轮换策略——部署时同时支持新旧两个密钥,过渡期结束后废弃旧密钥。

Token 存储对比

存储方式 XSS 风险 CSRF 风险 建议
localStorage 不推荐
sessionStorage 不推荐
httpOnly Cookie 推荐(需 CSRF 防护)
内存变量 最安全

CSRF 防护

如果使用 Cookie,必须加 CSRF Token 双重验证——请求头和 Cookie 各带一份 token,服务端比对一致才放行。

OAuth2.0 授权码流程

OAuth2.0 不是认证协议而是授权协议——让第三方应用在用户授权下访问受保护资源。

流程:用户授权 -> 返回授权码(一次性)-> 客户端用授权码换 Access Token + ID Token(JWT)。

最关键的安全要点:永远在服务端验证 ID Token 的签名和声明(iss/aud/exp),不要信任客户端传来的任何身份信息。

总结

JWT 让认证变得无状态,但无状态不等于无顾虑。双令牌策略平衡安全与体验,httpOnly Cookie + CSRF Token 是大规模应用的标准配置,密钥轮换是长期维护的必需手段。认证安全没有银弹——但有一层又一层的防线。