研发
精选
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 流程
- 登录成功,颁发 Access Token(短寿命,15-30 分钟)+ Refresh Token(长寿命,7 天)
- Access 过期后,用 Refresh 换新
- Refresh 存数据库(可撤销),支持登出 / 封禁立即生效
浏览器 ──登录──▶ 服务端 ──▶ 返回 access + refresh
──Bearer access──▶ 校验 JWT(无 DB 查询,快)
──refresh──▶ 校验 DB 中的 refresh ──▶ 轮换颁发新对
安全清单
- 短寿命 access:泄露窗口小
- Refresh 轮换(Rotation):每次刷新作废旧 refresh,检测重放
- HttpOnly Cookie 存 refresh(Web 场景),或至少不放在 URL
- 服务端校验 type claim:refresh 不能用于调用 API,access 不能用于换新
- 登出撤销:删除 DB 中 refresh 记录
- 不要在 JWT 里存权限明细:只存 role / userId,权限查库(可随时吊销)
Spring Security 中常见的坑
exp必须校验(jjwt 默认校验,自己解析别漏)- 算法不允许
none,密钥长度 ≥ 256 位 - 不要信任 Header 里的用户 ID,一切以 token 解析结果为准
小结
JWT 解决的是「无状态快速校验」,Refresh Token 解决的是「可控撤销」。两者配合,才是一套完整的认证体系。