前端进阶之旅前端进阶之旅
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
首页程序员面试题库Refresh Token Rotation 重放检测
身份身份与权限身份认证与授权

Refresh Token 轮换(Rotation)如何工作,重放检测发现旧令牌被复用时应该怎么处理?

Refresh Token Rotation 在刷新时作废旧令牌并签发新令牌,旧令牌被再次使用通常视为重放,应撤销会话令牌族并重新认证,但需先排除并发误判。

前端进阶之旅 · 一题精讲更新于 2026.09.05
身份与权限#身份认证与授权#安全#并发编程
先看核心答案
理解线索

令牌族与重放信号

  1. 令牌族由同一登录会话产生的 Refresh Token 链
  2. 轮换每次刷新时旧令牌失效并生成新令牌
  3. 重用检测服务端记录被使用过的旧令牌状态

检测到重放时,严格策略是撤销整族令牌,但需考虑客户端并发请求的误判。

核心回答

先记住这个答案

Refresh Token Rotation 是令牌刷新策略:每次用 Refresh Token 换取新 Access Token 时,服务端同时签发一个新的 Refresh Token,并使旧 Refresh Token 失效。若检测到已作旧的 Refresh Token 被重放,通常视为攻击,服务端应撤销该用户会话关联的整个令牌族,强制重新登录;但需先排除客户端并发请求导致的误判,可设置短期宽限或要求客户端互斥。这能限制令牌泄露后的横向移动窗口。

  • 刷新时作废旧令牌、签发新令牌,可限制泄露影响。
  • 检测到旧令牌复用通常视为重放,应撤销整个令牌族(排除并发场景)。
  • 处理并发刷新需允许短暂宽限期并记录异常。

轮换与重放检测的信号机制

Refresh Token Rotation 的核心是服务端为每个会话维护一个令牌族。当客户端用 Refresh Token RT1 换取新 Access Token 时,服务端验证 RT1 有效后,生成新的 RT2 并返回,同时将 RT1 标记为已使用。此后只有 RT2 能继续刷新。这样攻击者即使拿到 RT1,也无法用它获取新令牌。

重放检测依赖一个状态存储:服务端保存每个 Refresh Token 的状态(有效、已使用、已撤销)。当收到一个标记为已使用的 Refresh Token 时,通常可判定为重放,此时服务端应撤销该令牌族中所有有效令牌并通知客户端重新认证,但需先确认非客户端并发所致;可设置短期宽限窗口以容忍并发误判。检测时机是校验令牌存在且有效后,再检查其状态标志。

移动端并发刷新导致误判的工程场景

假设一个 App 在启动时同时发起了两个并发 API 请求,两个请求都因 Access Token 过期而触发了刷新逻辑。两个线程几乎同时使用同一个 Refresh Token RT1 调用刷新端点。服务端处理第一个请求成功,生成 RT2,并标记 RT1 已使用;接着处理第二个请求时发现 RT1 已使用,按重放处理,撤销整个令牌族,导致用户被强制登出。

解决方式是引入短期并发容忍:服务端为刚被使用的旧令牌保留一个短期宽限窗口(如30秒),在这个窗口内重复使用只返回新的 RT2(或提示客户端重试),但不立即撤销整族。更可靠的是客户端做刷新互斥:在同一时间只允许一个刷新请求进行,其他请求等待或共享结果。服务端可同时记录异常,若超过宽限仍重放则触发撤销。

失效边界与安全策略权衡

严格的撤销整族策略在大多数场景有效,但在用户多设备登录时会有问题:每台设备各有独立 Refresh Token,但它们属于同一用户会话族吗?通常设计为每个设备独立令牌族,这样撤销某设备令牌不影响其他设备。若将同一账号所有登录视为一整个族,用户在一台设备重放会导致全家桶登出,体验糟糕。因此族粒度应按会话而非账号。

另一个边界是:若攻击者已在宽限期内使用了旧令牌并获得了新令牌,服务端无法察觉。为了增强检测,可绑定令牌指纹(如设备信息、IP),异常变更时触发告警。但过分严格的 IP 检测会导致移动网络切换频繁触发重放,所以应结合风险评分,而不是一有变化就撤销。实现时需权衡安全性和可用性。

回答前,多想一步

容易答错的地方

轮换等于每次刷新都完全改动令牌串
轮换关键是状态作废,而不只是随机生成新令牌。若仅生成新令牌却不使旧令牌失效,攻击者仍可重放旧令牌。真正的轮换必须将旧令牌标记为已使用,并在检测到重放时撤销整个族。
重放检测发现后只撤销当前被重放的那一个令牌
攻击者重放旧令牌通常意味着已获取该令牌,可能已经用过或即将用其他令牌。只撤销一个令牌无法阻止攻击者使用同族中其他有效令牌。安全做法是撤销整个令牌族,即该会话下的所有 Refresh Token 和 Access Token。
试着用自己的话回答

面试官还会怎么问?

Refresh Token 轮换时如何预防并发请求导致误杀?

客户端应做刷新互斥,只允许一个刷新请求在途,其他请求等待新 Access Token。服务端可提供短期宽限:旧令牌在短时间内重用仅返回最新令牌,不触发撤销,但记录异常。宽限时长需低于攻击者利用时间窗口(通常30秒~1分钟)。

撤销整个令牌族时,已经发出的 Access Token 如何立即失效?

Access Token 若为 JWT 无状态,本身无法立即撤销。可依赖短期过期(如5分钟),或服务端维护可撤销的访问令牌列表(黑名单),每次请求校验。也可用结合 Refresh Token 族状态:当检测到重放时,将族内所有令牌标记为撤销,并拒绝后续请求。

Refresh Token 轮换与使用唯一 refresh token ID 有什么区别?

轮换是每次刷新都生成新令牌,并作废旧令牌;而固定 refresh token ID 是令牌不变,仅更新最后使用时间。轮换能主动限制泄露窗口,配合重放检测可形成家族撤销机制,安全性更高。固定 ID 若泄露,攻击者可长期使用,除非另设设备指纹。

从一道题,走向一组知识

把知识连起来

身份认证与授权

HS256 的 JWT 密钥应该如何生成、存储和轮换,硬编码在代码里有什么风险?

同属「身份认证与授权」专题,接着看 JWT 密钥管理 轮换 硬编码风险 在具体场景中的处理方式。

身份认证与授权

为什么需要 Refresh Token,它与 Access Token 在有效期、存储和传输上有哪些不同设计要求?

同属「身份认证与授权」专题,接着看 Refresh Token 与 Access Token 区别 设计 在具体场景中的处理方式。

参考资料

  • ¶

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 轮换与重放检测的信号机制
  3. 移动端并发刷新导致误判的工程场景
  4. 失效边界与安全策略权衡
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑