研发
精选

JWT 认证与 Refresh Token 最佳实践

站长发布于 2026/09/06更新于 2026/09/172060 次阅读

Token 结构

// Header
{ "alg": "HS256", "typ": "JWT" }
// Payload(示意)
{
  "sub": "1",              // 用户 ID
  "role": "ADMIN",
  "type": "access",        // 区分 access / refresh
  "iat": 1700000000,
  "exp": 1700001800
}

关键认知:Payload 只是 Base64 编码,不是加密。不要放敏感信息。

Access + Refresh 双 Token 流程

  1. 登录成功,颁发 Access Token(短寿命,15-30 分钟)+ Refresh Token(长寿命,7 天)
  2. Access 过期后,用 Refresh 换新
  3. Refresh 存数据库(可撤销),支持登出 / 封禁立即生效
浏览器 ──登录──▶ 服务端 ──▶ 返回 access + refresh
       ──Bearer access──▶ 校验 JWT(无 DB 查询,快)
       ──refresh──▶ 校验 DB 中的 refresh ──▶ 轮换颁发新对

安全清单

  1. 短寿命 access:泄露窗口小
  2. Refresh 轮换(Rotation):每次刷新作废旧 refresh,检测重放
  3. HttpOnly Cookie 存 refresh(Web 场景),或至少不放在 URL
  4. 服务端校验 type claim:refresh 不能用于调用 API,access 不能用于换新
  5. 登出撤销:删除 DB 中 refresh 记录
  6. 不要在 JWT 里存权限明细:只存 role / userId,权限查库(可随时吊销)

Spring Security 中常见的坑

  • exp 必须校验(jjwt 默认校验,自己解析别漏)
  • 算法不允许 none,密钥长度 ≥ 256 位
  • 不要信任 Header 里的用户 ID,一切以 token 解析结果为准

小结

JWT 解决的是「无状态快速校验」,Refresh Token 解决的是「可控撤销」。两者配合,才是一套完整的认证体系。