告别频繁登录:打造用户无感的 Token 刷新机制

🧠 什么是"无痛刷新 Token"?

无痛刷新 Token 指的是:

当前端发送请求时,如果 access token 过期,系统会自动、悄无声息地用 refresh token 换一个新的 access token ,并自动重试原始请求 ,整个过程对用户是完全无感知的,无需手动刷新页面或重新登录。

🚶‍♂️举个例子

🚉 地铁进站场景

  • 你买了一张短期票(access token),有效期是 15 分钟。
  • 同时,你还有一张长期通行证(refresh token),可以用来换新的短期票。

✅ 正常使用

  • 你在地铁站刷短期票进闸(发请求)。
  • 时间没过,成功通过(请求成功)。

⛔ 短期票过期

  • 你在站台等了太久,15 分钟过去了,想继续转线。
  • 这时候短期票(access token)过期了,不能继续用。

🤖 "无痛刷新"登场!

  • 你身上有长期通行证(refresh token)。
  • 系统自动帮你在后台排队 → 换了一张新的短期票(新 access token)。
  • 你重新刷一下 → 顺利进闸(自动重试请求)。
  • 你自己根本没感觉到有票换了,完全无感知,整个过程"无痛"完成 ✅

❌ 如果连通行证也失效了呢?

  • 比如你长期没上地铁,通行证(refresh token)也过期了。
  • 这时候,系统说:"请重新购票(登录)。"

🧠 实现思路:无痛刷新 Token

  1. 使用双token机制
  • 短期token(accessToken):用于接口调用,有效期短,一般是分钟级。
  • 长期token(refreshToken):用于刷新短期token,有效期较长,一般周或月级。
  1. 每次请求时 在header中携带accessToken
  • 如果accessToken过期(条件为约定的状态码 一般为401),调用服务的刷新短期token的接口,携带refreshToken
  • 获取到新的accessToken后,将新的accessToken放到header中,继续请求接口
  • 如果长期token也过期,则跳转到登录页面,重新登录(下面使用滑动过期时间来延长有效期)
  1. 前端在相应拦截器中判断是否过期,如果过期则调用刷新接口,获取新的token,并继续请求接口
txt 复制代码
[客户端发起请求]
    |
    v
[Access Token 还有效?]
    ├─✔ 是 → 直接请求接口
    └─✘ 否 → 进入刷新逻辑
            |
            v
        [Refresh Token 有效?]
            ├─✔ 是 → 刷新 Access Token → 重新发起原始请求
            └─✘ 否 → 引导用户重新登录

🧠 实现步骤

  1. 服务端设置三个必要接口
  • 没有token时,获取生成两个token的接口
  • 刷新token的接口
  • 清除token的接口
  1. 滑动过期时间
  • 在请求刷新接口时候,返回新的短期token,同时重置长期token的过期时间 使其在活跃状态不过期

长期token一般使用redis管理存储

如果我们把 Refresh Token 存在 Redis 里,并设置了滑动过期(每次续签就 EXPIRE 延长 7 天),

但 Refresh Token 本身(JWT)也有固定的 exp 过期时间,

那当它 JWT 内部过期了(比如 7 天后),Redis 即使还存着,也没用了?

✅ 做法

  1. 在生成长期token时 不设置过期时间 或设置极长的过期时间 (比如10年)
  2. redis来控制长期token的过期时间, 如果redis过期则token过期
  3. 在刷新token时,先判断refreshToken是否过期,如果过期则清除长期token,并引导用户重新登录
  4. 如果长期token未过期,则刷新短期token,并在redis重置长期token的存储时间

🔐 安全性

不再相信token自己的过期时间

而是相信redis的过期时间

redis中存在即有效,不存在即过期

所以即使token被截获,没有redis的配合,也是无效的

🧠 小结:

"无痛刷新"是前后端联手打造的,兼顾安全和体验的 Token 续期机制:短期 token 安全、长期 token 稳定、整个过程用户无感知。

相关推荐
2501_9160074716 分钟前
Flutter与游戏App加固避坑指南:如何为混合开发与高交互应用选对安全方案?
安全·flutter·游戏·ios·小程序·uni-app·iphone
IT小白杨18 分钟前
TikTok小店防封号浏览器实战:2026年多店铺环境隔离与账号安全运营技术解析
开发语言·数据库·安全·php·chrome devtools·指纹浏览器
小五传输39 分钟前
【一文解读】汽车制造业协同,跨网跨区域文件传输如何落地?
大数据·运维·安全
国科安芯44 分钟前
卫星电源管理系统中高可靠MCU的功耗特性与电源监控功能分析
人工智能·单片机·嵌入式硬件·mcu·安全·电源管理系统·抗辐射
CoderYanger1 小时前
A.每日一题:3345. 最小可整除数位乘积 I
java·数据结构·程序人生·算法·leetcode·面试·学习方法
云祺vinchin1 小时前
医疗行业灾备实践:一套方案实现HIS、EMR、PACS系统安全闭环
数据库·安全·数据备份·医疗安全·容灾备份
虎王物联1 小时前
Docker容器安全加固:securityContext与seccomp在IoT边缘节点的隔离实践
物联网·安全·docker
测试19981 小时前
软件测试面试八股文【2026最新版】
自动化测试·软件测试·功能测试·测试工具·面试·职场和发展·测试用例
小鹿软件办公2 小时前
微软官方提示:Windows 安全中心出现 Defender 已关闭为虚假告警
安全·microsoft
数智启示录2 小时前
Apache Doris 4.0.8 一致性实战(第 3 篇):Checkpoint 一直成功,Exactly-Once 为什么仍可能是假的
大数据·经验分享·面试·flink