侧边栏壁纸
博主头像
ERSHI的个人网站

记录一下

  • 累计撰写 4 篇文章
  • 累计创建 5 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Refresh Token的运行机制

ERSHI
2025-05-30 / 0 评论 / 0 点赞 / 3 阅读 / 0 字

在实际应用中,Refresh Token 的运行机制和实现方式可以根据需求进行调整,但通常遵循以下几种常见的模式。以下是 Refresh Token 的常见运行方式及其优缺点分析:


1. 服务器端存储模式

运行方式:

  • 每个用户生成的 Refresh Token 都会存储在服务器端(如数据库或内存缓存)。
  • 当客户端使用 Refresh Token 请求新的 Access Token 时,服务器会验证该 Token 是否存在于存储中,并且是否有效。

流程:

  1. 用户登录后,服务器生成一个 Refresh Token 并将其存储到数据库或缓存中。
  2. 客户端保存 Refresh Token(通常是通过 HTTP-only Cookie 或安全的本地存储)。
  3. 当 Access Token 过期时,客户端发送 Refresh Token 到服务器请求新的 Access Token。
  4. 服务器验证 Refresh Token 是否存在于存储中,如果存在,则生成新的 Access Token 并返回给客户端。
  5. 如果需要,可以同时生成一个新的 Refresh Token 并替换旧的。

优点:

  • 可以随时使 Refresh Token 失效(例如用户注销时)。
  • 支持 Token 黑名单机制,防止被盗用的 Token 继续生效。
  • 更加灵活,可以限制每个用户的 Refresh Token 数量。

缺点:

  • 增加了服务器端的存储开销。
  • 每次刷新都需要查询数据库或缓存,可能影响性能。

2. 无状态模式(Stateless)

运行方式:

  • Refresh Token 不存储在服务器端,而是包含所有必要的信息(如用户 ID 和过期时间),并通过签名验证其有效性。
  • 服务器仅通过解码和验证 Refresh Token 来确认其合法性。

流程:

  1. 用户登录后,服务器生成一个带有签名的 Refresh Token。
  2. 客户端保存 Refresh Token。
  3. 当 Access Token 过期时,客户端发送 Refresh Token 请求新的 Access Token。
  4. 服务器解码 Refresh Token 并验证签名,如果有效,则生成新的 Access Token。

优点:

  • 无状态设计,服务器不需要额外的存储开销。
  • 简化了实现复杂度。

缺点:

  • 无法主动使 Refresh Token 失效(除非设置较短的过期时间)。
  • 如果 Refresh Token 被盗用,攻击者可以在其有效期内不断获取新的 Access Token。

3. 滑动窗口模式(Sliding Expiration)

运行方式:

  • 在每次使用 Refresh Token 获取新的 Access Token 时,生成一个新的 Refresh Token 并替换旧的。
  • 设置一个固定的最长生命周期(如 7 天),即使用户频繁刷新,Refresh Token 的总生命周期也不会超过这个限制。

流程:

  1. 用户登录后,服务器生成一个 Refresh Token 和 Access Token。
  2. 当 Access Token 过期时,客户端使用 Refresh Token 请求新的 Access Token。
  3. 服务器验证 Refresh Token 后,生成新的 Access Token 和新的 Refresh Token。
  4. 新的 Refresh Token 的生命周期从当前时间重新计算,但不超过最大生命周期。

优点:

  • 提高了安全性,因为每次刷新都会生成新的 Refresh Token。
  • 限制了 Refresh Token 的最长生命周期,降低被盗用的风险。

缺点:

  • 实现稍微复杂一些。
  • 如果用户频繁刷新,可能会增加服务器负载。

4. 黑名单机制

运行方式:

  • 无论是否存储 Refresh Token,在用户注销或检测到异常行为时,将失效的 Refresh Token 添加到黑名单中。
  • 当客户端尝试使用 Refresh Token 时,服务器检查该 Token 是否在黑名单中。

流程:

  1. 用户登录后,服务器生成 Refresh Token。
  2. 如果用户注销或管理员手动禁用账户,将 Refresh Token 添加到黑名单。
  3. 当客户端使用 Refresh Token 时,服务器检查它是否在黑名单中,如果在,则拒绝请求。

优点:

  • 即使使用无状态模式,也可以通过黑名单机制增强安全性。
  • 可以快速使特定用户的 Refresh Token 失效。

缺点:

  • 需要额外的存储来维护黑名单。
  • 查询黑名单可能会增加服务器负载。

5. 多设备支持模式

运行方式:

  • 允许用户在多个设备上登录,为每个设备生成独立的 Refresh Token。
  • 服务器为每个设备的 Refresh Token 设置唯一标识符(如设备 ID 或指纹)。

流程:

  1. 用户登录时,服务器生成一个 Refresh Token 并绑定到设备 ID。
  2. 用户可以在不同设备上登录,每个设备都有独立的 Refresh Token。
  3. 如果用户注销某个设备,仅使该设备的 Refresh Token 失效。
  4. 用户可以在账户页面查看并管理已登录的设备。

优点:

  • 支持多设备登录。
  • 用户可以单独管理每个设备的登录状态。

缺点:

  • 增加了服务器端的复杂性。
  • 需要维护每个用户的设备列表。

运行方式:

  • 将 Refresh Token 存储在 HTTP-only、Secure 的 Cookie 中,而不是 LocalStorage 或 SessionStorage。
  • 客户端通过 Cookie 自动发送 Refresh Token,无需手动处理。

流程:

  1. 用户登录后,服务器将 Refresh Token 设置为 HTTP-only Cookie。
  2. 当 Access Token 过期时,客户端通过自动发送的 Cookie 请求新的 Access Token。
  3. 服务器验证 Cookie 中的 Refresh Token 并返回新的 Access Token。

优点:

  • 更加安全,避免 JavaScript 访问 Refresh Token。
  • 减少客户端开发的工作量。

缺点:

  • 依赖 Cookie,可能不适合某些跨域场景。
  • 如果 Cookie 被窃取,攻击者可以冒充用户。

总结对比

模式 优点 缺点
服务器端存储模式 可随时使 Token 失效,支持黑名单机制,灵活性高 增加存储开销,每次刷新需查询数据库
无状态模式 无状态设计,减少服务器存储开销 无法主动使 Token 失效,被盗用风险较高
滑动窗口模式 提高安全性,限制 Refresh Token 最长生命周期 实现复杂,可能增加服务器负载
黑名单机制 增强安全性,可快速使特定 Token 失效 需要额外存储,查询黑名单可能影响性能
多设备支持模式 支持多设备登录,用户可单独管理每个设备的登录状态 增加复杂性,需维护设备列表
基于 Cookie 模式 更加安全,减少客户端开发工作量 依赖 Cookie,可能不适合跨域场景,Cookie 被窃取风险

推荐方案

  • 中小型应用: 使用 服务器端存储模式滑动窗口模式,结合黑名单机制,既能保证安全性,又不会过于复杂。
  • 大型应用: 结合 多设备支持模式滑动窗口模式,支持多设备登录并提高安全性。
  • 无状态需求: 如果对安全性要求不高且希望简化实现,可以选择 无状态模式,但需注意 Refresh Token 的过期时间和存储方式。

根据你的具体需求和技术栈选择合适的 Refresh Token 运行方式!

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区