Spring Boot集成JWT时token过期如何刷新并为用户颁发新token?
Spring Boot JWT 过期自动刷新Token实现方案
核心实现思路
采用双Token机制拆分鉴权能力:
- 短有效期的access_token:用来做业务接口鉴权,有效期建议调整为1~2小时,降低泄露风险
- 长有效期的refresh_token:仅用来刷新access_token,有效期可设置为7~30天,不支持直接访问业务接口
具体实现步骤
1. 调整登录接口的Token签发逻辑
用户登录成功后,同时下发两个Token,同时将refresh_token和用户ID的绑定关系存入Redis(设置和refresh_token相同的过期时间),方便后续校验和主动作废。
2. 全局捕获Token过期异常
在JWT请求过滤器或者全局异常处理器中,捕获ExpiredJwtException异常,返回约定好的特殊状态码(比如4011)给前端,前端识别到该状态码后自动调用刷新Token接口,无需用户手动重新登录。
3. 开发刷新Token专用接口
接口逻辑如下:
- 接收前端传入的refresh_token,首先校验其签名合法、未过期
- 到Redis中校验该refresh_token是否和对应用户的存储记录一致,排除伪造、已作废的refresh_token
- 校验通过后,生成新的access_token返回给前端,也可根据需求生成新的refresh_token(滚动刷新机制),旧refresh_token直接从Redis中删除
- 前端拿到新token后替换本地存储的旧token,用新token重新发起之前失败的请求即可
4. 可选优化:配置时钟偏移容错
你当前报错信息显示允许的时钟偏移为0,服务端和客户端的少量时间差就会触发过期误判,可以在JWT解析逻辑中增加时钟偏移配置:
// io.jsonwebtoken 版本的配置示例 Jwts.parserBuilder() .setSigningKey(yourSecretKey) .setAllowedClockSkewSeconds(60) // 允许60秒的时钟误差 .build() .parseClaimsJws(token);
注意事项
- refresh_token泄露会带来安全风险,需要支持主动作废能力:用户登出、修改密码时,直接删除Redis中对应的refresh_token
- 若refresh_token也已过期,直接返回需要重新登录的状态码,引导用户重新走登录流程
- 业务接口不允许使用refresh_token进行鉴权,避免长有效期Token被滥用
内容的提问来源于stack exchange,提问作者hanjiman
相关产品推荐
相关产品推荐

