这是 Beta 探索课程,内容结构、实验步骤和示例可能会继续调整。
Access Token 与 Refresh Token 拆分
一个 Token 的矛盾
如果只有一个 Token,你会陷入两难:
- 有效期短(如 15 分钟):安全,但用户每 15 分钟就要重新登录,体验崩溃。
- 有效期长(如 30 天):方便,但 Token 一旦泄露,30 天内都能被滥用。
生产系统的答案是拆成两个 Token,各司其职:
| Token | 有效期 | 职责 | 泄露风险窗口 |
|---|---|---|---|
| Access Token | 分钟 ~ 小时级 | 访问 API,每次请求携带 | 短,可接受 |
| Refresh Token | 天级(如 30 天) | 换取新的 Access Token | 长,需严格保护 |
工作方式
- 登录成功后,签发一个短期 Access Token + 一个长期 Refresh Token。
- 客户端用 Access Token 访问 API。
- Access Token 过期后,请求会失败。
- 客户端拿 Refresh Token 换一个新的 Access Token(同时一般也换新的 Refresh Token)。
- 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)。
发现内容有问题?
告诉我们哪里需要改进。
