详细、清晰地讲解一下 Access Token 和 Refresh Token 的区别。这是一个理解现代身份认证(尤其是 OAuth 2.0 和 JWT)的关键概念
1. 核心比喻:办公楼的门禁
-
Access Token(访问令牌) :就像你的办公室门禁卡。
- 目的单一:唯一的作用是让你刷开办公室的门。
- 有效期短:这张卡可能每天下班后就失效了,或者只有几个小时的权限。这是为了安全,万一卡丢了,别人能使用的时间也很短。
- 使用频繁:你每次进出门都要刷它。
-
Refresh Token(刷新令牌) :就像你的员工身份证明,用来在门禁卡失效后重新办一张新卡。
- 目的单一:唯一的作用是获取一张新的 Access Token。
- 有效期长:你的员工身份是相对长期有效的(比如几个月或一年,或者直到你离职)。
- 使用不频繁:只有在门禁卡(Access Token)失效时,你才需要用它去办一张新的。你不需要每天都出示员工证明。
2. 技术层面的详细对比
| 特性 | Access Token(访问令牌) | Refresh Token(刷新令牌) |
|---|---|---|
| 主要目的 | 访问受保护的资源。客户端(如前端应用)在调用后端 API 时,将其放在 HTTP 请求头(如 Authorization: Bearer <token>)中,以证明自己有权限访问数据。 | 获取新的 Access Token。当旧的 Access Token 过期后,客户端用它向认证服务器申请一个新的 Access Token(有时还会顺带获得一个新的 Refresh Token)。 |
| 生命周期 | 短期。有效期很短,通常是几分钟到几小时。 | 长期。有效期很长,可能是几天、几周、几个月,甚至可以是永久的(但不建议),或者绑定到用户会话(浏览器关闭即失效)。 |
| 安全性风险 | 较高。因为它经常在网络上传输(每次 API 请求都会携带),被盗的风险相对高。 | 极高。因为它就像是“万能钥匙”,拥有它就可以持续获取新的 Access Token,从而长期冒充用户。 |
| 存储位置 | 通常存储在客户端的内存中(如 JavaScript 变量)。这样即使关闭浏览器,Token 就丢失了,相对安全。 | 必须安全地存储。在 Web 应用中,通常存储在 HttpOnly Cookie 中,防止被 JavaScript 访问(避免 XSS 攻击)。也可以存储在移动端的安全存储区。 |
| 传输频率 | 高。每次调用受保护的 API 接口时都需要发送。 | 低。只在 Access Token 过期,需要刷新时才发送到认证服务器。 |
3. 工作流程(二者如何协同工作)
一个典型的、安全的登录和 API 访问流程如下:
-
登录:用户输入用户名和密码进行登录。
-
颁发令牌:认证服务器验证凭据后,同时返回两个东西:
- 一个短期的 Access Token
- 一个长期的 Refresh Token
-
访问 API:客户端使用这个 Access Token 去调用资源服务器(后端 API)的数据。API 会验证 Token 的签名和有效期。
-
Token 过期:一段时间后,Access Token 过期了。当客户端再次用旧 Token 访问 API 时,会收到
401 Unauthorized错误。 -
使用 Refresh Token:客户端不提示用户重新登录,而是悄悄地向认证服务器发送一个请求,其中包含这个 Refresh Token。
-
颁发新 Token:认证服务器验证 Refresh Token 是有效的,然后返回一套新的 Token(新的 Access Token 和可选地一个新的 Refresh Token)。
-
重试请求:客户端用新的 Access Token 重新发起之前失败的 API 请求。
-
循环:步骤 3-7 会不断重复,直到 Refresh Token 也过期或被撤销。
-
重新登录:当 Refresh Token 也失效后,客户端会要求用户重新进行完整的登录(输入用户名和密码)。
4. 为什么需要这种设计?(核心优势)
这种“一短一长”的双令牌机制主要解决了两个核心问题:
-
安全性(Security) :
- 因为 Access Token 是短期的,即使它被黑客在网络上截获,其可用的时间窗口也很短,造成的损害有限。这类似于你的银行卡密码每天都会自动更改。
- Refresh Token 不经常传输,且被安全地存储,暴露的风险远低于频繁传输的 Access Token。
-
用户体验(User Experience) :
- 用户登录一次后,在很长一段时间内(Refresh Token 的有效期内)都无需再次输入密码,实现了“记住登录”或“保持登录状态”的功能。应用可以无感地在后台刷新 Access Token,用户完全感知不到。
总结
| Access Token | Refresh Token | |
|---|---|---|
| 是什么 | 进入大门的短期门票 | 重新兑换新门票的长期凭证 |
| 干什么 | 访问 API,获取数据 | 在 Access Token 过期后,获取一套新令牌 |
| 活多久 | 短(几小时) | 长(几天到数月) |
| 为啥这样 | 安全(泄露了危害小) | 体验(用户不用频繁登录) |
简单来说,Access Token 是用来干活的,Refresh Token 是用来保证你能持续有 Token 可以干活而不用反复登录的。 这种职责分离是平衡安全性与用户体验的经典设计。