Access Token 与 Refresh Token 拆分

一个 Token 的矛盾

如果只有一个 Token,你会陷入两难:

  • 有效期短(如 15 分钟):安全,但用户每 15 分钟就要重新登录,体验崩溃。
  • 有效期长(如 30 天):方便,但 Token 一旦泄露,30 天内都能被滥用。

生产系统的答案是拆成两个 Token,各司其职:

Token有效期职责泄露风险窗口
Access Token分钟 ~ 小时级访问 API,每次请求携带短,可接受
Refresh Token天级(如 30 天)换取新的 Access Token长,需严格保护

工作方式

  1. 登录成功后,签发一个短期 Access Token + 一个长期 Refresh Token。
  2. 客户端用 Access Token 访问 API。
  3. Access Token 过期后,请求会失败。
  4. 客户端拿 Refresh Token 换一个新的 Access Token(同时一般也换新的 Refresh Token)。
  5. Refresh Token 也过期了,才要求用户重新登录。

这样用户大部分时间无感,而真正暴露在每次请求里的 Access Token 生命周期很短。

亲手体验一下

下面这个模拟器可以演示 Access / Refresh Token 的生命周期:登录、推进时间、跨过过期点、刷新、登出,观察 Token 状态的变化:

Token 生命周期模拟器

t = 0 分钟
Access Token(15 分钟)无有效 Access Token
Refresh Token(30 天)已失效,需重新登录
理解
  • Access Token 过期后,请求会失败
  • 用 Refresh Token 换取新 Token,旧值轮换失效
  • 登出或改密后所有 Token 立即撤销
点击「模拟登录」开始演示 Token 的生命周期。

Refresh Token 的保护

Refresh Token 有效期长,是攻击者的高价值目标,必须额外保护:

  • 轮换(Rotation):每次刷新都签发新的 Refresh Token,旧的立即作废。这样即使 Refresh Token 泄露,只要被用过一次,新旧一起失效,攻击者无法复用。
  • 绑定设备:Refresh Token 和登录时的设备指纹绑定,跨设备使用触发风控。
  • 可撤销:登出、改密、冻结时,对应的 Refresh Token 立即失效。
  • 重放检测:同一个 Refresh Token 被使用两次,直接判定为泄露,撤销整条会话链。

组合起来的安全边界

这套组合把风险控制得很清晰:

  • 每次请求暴露的 Access Token:生命周期短,泄露损失有限。
  • 长期凭证 Refresh Token:不随每次请求暴露,且可轮换、可撤销。
  • 会话兜底:即使两个 Token 都被拿到,还有设备绑定、风控和强制下线。

下一节回答一个很实际的问题:这些 Token 到底存放在哪里(Cookie 还是 Header)。

发现内容有问题?

告诉我们哪里需要改进。