刷新令牌如何比长寿命的 JWT 更安全?

Posted

技术标签:

【中文标题】刷新令牌如何比长寿命的 JWT 更安全?【英文标题】:How is a refresh token more secure than a long lived JWT? 【发布时间】:2018-07-08 13:28:39 【问题描述】:

在将 JWT 用于自然不安全的客户端(浏览器、手机等)时,我很难理解刷新令牌的使用。

对我来说,认为如果 JWT 被泄露,刷新令牌也没有被泄露,这似乎很天真。

只要刷新令牌仍然有效,攻击者就拥有无限 JWT 的来源。即使您使使用的刷新令牌无效,如果攻击者实施稍微更激进的刷新策略,他们仍然占据上风。这与受损的长期 JWT 有何不同?

当使用长期存在的 JWT 时,攻击者只有在能够持续利用最初为他们提供 JWT 的任何漏洞的情况下才能继续获得有效的 JWT。使用刷新令牌,他们可以通过漏洞获得 JWT 一次,然后获得新的 JWT,而不受惩罚,但他们喜欢。这似乎与长期存在的 JWT 一样安全,甚至可能更不安全。

我错过了什么?

【问题讨论】:

如果其中任何一个受到损害,那么您当然会遇到问题,但它们的目的不同。刷新令牌用于您与身份验证服务器的交互(我已通过身份验证,如果我已获得授权,请给我一个令牌以调用服务 A),jwt 令牌用于您与服务本身的交互(您好服务 A,我已通过身份验证并授权给您打电话)。 这似乎不对。我不认为短期 JWT 的 + 刷新令牌是关注点分离问题。我很确定这个想法是最大限度地减少攻击者访问受损 JWT 的时间,而不会因频繁注销而损害用户体验。如有误解,请见谅。 这是一篇描述使用模式的文章:auth0.com/blog/… @KevinHooke 感谢您的文章!我认为我的问题与您提供的文章一致。 【参考方案1】:

刷新令牌是可撤销的。如果它们被泄露,它们可以立即在授权服务器上被撤销,并且不会再生成 JWT。

另一方面,JWT 通常是独立的。这意味着它们通过检查令牌的数字签名在本地进行验证。一经发出,不可撤销。这就是为什么它们永远不应该长寿。

如果 JWT 和刷新令牌都被泄露,您将撤销刷新令牌,一旦 JWT 过期,攻击者将无法访问。这可能意味着撤销不是立即的。

另一种选择是使用长期引用令牌而不是 JWT 和刷新令牌。在这种情况下,可以立即撤销。缺点是每次使用引用令牌都需要针对授权服务器进行验证。

【讨论】:

这听起来很好,但你怎么知道令牌是否真的被盗用了? 在大多数情况下,当用户报告设备丢失(例如丢失的手机)并且您必须假设令牌已被盗用时。在某些情况下,例如在银行场景中,您可能还会进行一些欺诈检测,这些检测会标记可疑活动并作为预防措施撤销访问权限。 好吧,在这种情况下,它并不能真正解决我所看到的问题。您可能在不知不觉中泄露了令牌。 没有什么能解决您不知道的令牌被盗的问题。如果这是一个大问题,您可能希望使所有令牌都短命以限制滥用的可能性。 是的,短期令牌是我试图实现的东西。除此之外,另一位用户建议跟踪设备信息并在用户从新/不同设备访问应用程序时要求重新登录。

以上是关于刷新令牌如何比长寿命的 JWT 更安全?的主要内容,如果未能解决你的问题,请参考以下文章

带有存储在 cookie 中的刷新令牌的 SPA - 如何使用 IdentityServer4 进行配置?

使用刷新令牌和访问令牌如何比仅使用 1 个 JWT 更“安全”?

比 main 更长寿的单身人士

长寿命的多播 Observable,每次订阅时都会重新订阅其源

构建你的长寿命的API第1部分:规范驱动的API开发

为啥不使用长寿命会话 ID 来代替带有令牌的持久 cookie?