Access Token 和 Refresh Token 的区别

287 阅读4分钟

详细、清晰地讲解一下 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 访问流程如下:

  1. 登录:用户输入用户名和密码进行登录。

  2. 颁发令牌:认证服务器验证凭据后,同时返回两个东西

    • 一个短期的 Access Token
    • 一个长期的 Refresh Token
  3. 访问 API:客户端使用这个 Access Token 去调用资源服务器(后端 API)的数据。API 会验证 Token 的签名和有效期。

  4. Token 过期:一段时间后,Access Token 过期了。当客户端再次用旧 Token 访问 API 时,会收到 401 Unauthorized错误。

  5. 使用 Refresh Token:客户端不提示用户重新登录,而是悄悄地向认证服务器发送一个请求,其中包含这个 Refresh Token。

  6. 颁发新 Token:认证服务器验证 Refresh Token 是有效的,然后返回一套新的 Token(新的 Access Token 和可选地一个新的 Refresh Token)。

  7. 重试请求:客户端用新的 Access Token 重新发起之前失败的 API 请求。

  8. 循环:步骤 3-7 会不断重复,直到 Refresh Token 也过期或被撤销。

  9. 重新登录:当 Refresh Token 也失效后,客户端会要求用户重新进行完整的登录(输入用户名和密码)。


4. 为什么需要这种设计?(核心优势)

这种“一短一长”的双令牌机制主要解决了两个核心问题:

  1. 安全性(Security)

    • 因为 Access Token 是短期的,即使它被黑客在网络上截获,其可用的时间窗口也很短,造成的损害有限。这类似于你的银行卡密码每天都会自动更改。
    • Refresh Token 不经常传输,且被安全地存储,暴露的风险远低于频繁传输的 Access Token。
  2. 用户体验(User Experience)

    • 用户登录一次后,在很长一段时间内(Refresh Token 的有效期内)都无需再次输入密码,实现了“记住登录”或“保持登录状态”的功能。应用可以无感地在后台刷新 Access Token,用户完全感知不到。

总结

Access TokenRefresh Token
是什么进入大门的短期门票重新兑换新门票的长期凭证
干什么访问 API,获取数据在 Access Token 过期后,获取一套新令牌
活多久短(几小时)长(几天到数月)
为啥这样安全(泄露了危害小)体验(用户不用频繁登录)

简单来说,Access Token 是用来干活的,Refresh Token 是用来保证你能持续有 Token 可以干活而不用反复登录的。 ​ 这种职责分离是平衡安全性与用户体验的经典设计。