如何在 JWT 过期前自动静默刷新 Token 机制?

文章导读
实现 JWT 过期前自动静默刷新的最推荐方案是采用 Access Token 与 Refresh Token 双令牌机制。Access Token 设置短有效期用于业务请求,Refresh Token 设置长有效期并存入服务端数据库,用于在 Access Token 过期时无感换取新令牌。
📋 目录
  1. 快速处理思路
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

实现 JWT 过期前自动静默刷新的最推荐方案是采用 Access Token 与 Refresh Token 双令牌机制。Access Token 设置短有效期用于业务请求,Refresh Token 设置长有效期并存入服务端数据库,用于在 Access Token 过期时无感换取新令牌。

先说结论:双令牌机制能平衡安全性与用户体验,避免频繁登录。

  • 适合:前后端分离架构、对安全性有要求的公开 API 系统。
  • 优先做:将 Refresh Token 存入服务端数据库或 Redis 并设置过期时间。
  • 再验证:确认 Access Token 过期后,携带 Refresh Token 请求刷新接口能获取新令牌。

快速处理思路

1. 后端配置 JWT 短过期(如 15 分钟)。

2. 生成随机 UUID 作为 Refresh Token 存入数据库。

3. 前端拦截 401 响应,调用刷新接口。

4. 刷新接口验证 Refresh Token 后返回新 Access Token。

为什么会这样

JWT 无状态特性导致无法主动撤销令牌。双令牌机制通过服务端存储 Refresh Token 状态,既保留了 JWT 的高效验证,又增加了控制令牌生命周期的能力。JWT 载荷中包含 exp 声明定义过期时间,服务器验证时若当前时间超过 exp 值则拒绝请求并返回 401 未授权状态。

分步处理

1. 令牌拆分:Access Token 有效期设为 15 分钟,Refresh Token 有效期设为 7 天。

2. 存储策略:Refresh Token 关联 UserID 存入数据库表或 Redis,不直接暴露在客户端逻辑中。

如何在 JWT 过期前自动静默刷新 Token 机制?

3. 刷新接口:创建/api/auth/refreshtoken 接口,接收 Refresh Token,校验有效性后生成新 Access Token。

4. 前端拦截:在 HTTP 请求拦截器中监听 401 状态码,触发静默刷新逻辑。

怎么验证是否生效

1. 等待 Access Token 自然过期。

2. 发起业务请求,观察是否自动触发刷新接口。

3. 检查响应头或 Body 中是否返回新的 Access Token。

4. 确认后续请求能携带新令牌正常访问。

常见坑

1. 并发请求导致多次刷新:需加锁或判断刷新状态。

2. Refresh Token 泄露:建议存入 HttpOnly Cookie 而非 localStorage。

3. 刷新死循环:刷新接口失败应强制跳转登录页。

如何在 JWT 过期前自动静默刷新 Token 机制?

常见问题

Refresh Token 过期了怎么办?

用户需要重新登录获取新的令牌对。

为什么 Refresh Token 要存服务端?

为了方便撤销被盗令牌和控制会话生命周期。

前端如何预判 Token 即将失效?

客户端可解析 JWT 载荷中的 exp 字段,提前 30 分钟请求刷新。

参考来源

业务实战:JWT Token 过期、被盗怎么处理?基于 Spring Boot 的双 Token 刷新方案解析

JWT 自动刷新机制:如何平衡安全性与用户体验

若依框架 JWT Token 过期了怎么办?手把手教你实现无感刷新与动态续期

(ASP.NET Core JWT 过期处理终极指南):从原理到自动刷新完整实现

JWT 登录过期 - 自动刷新 token 方案介绍 - 有度科技 - 博客园