为啥刷新令牌更安全?如果刷新令牌也可能被盗,为啥我们还要使用它?

Posted

技术标签:

【中文标题】为啥刷新令牌更安全?如果刷新令牌也可能被盗,为啥我们还要使用它?【英文标题】:Why is refresh token is more secure & why do we use refresh token if it can also be stolen?为什么刷新令牌更安全?如果刷新令牌也可能被盗,为什么我们还要使用它? 【发布时间】:2021-12-26 06:13:49 【问题描述】:

假设我的用户登录并且我给了他 2 个令牌;访问和刷新令牌

访问令牌有效期为 15 分钟,刷新令牌有效期为 1 周

我们不想只给他们长期有效的访问令牌,因为有人可以获得该访问令牌并使用它发出请求,这就是我们将其设置为 15 分钟有效的原因。

但是,我们的刷新令牌也不能被盗吗?有人可以获得我们的刷新令牌并获得 1 周的访问权限吗?那么害羞的是,如果它们都受到危险,我们会给出两个不同的令牌并实施基于访问刷新的令牌身份验证吗?

【问题讨论】:

刷新令牌可以被撤销,这是主要区别。您基本上强制用户每小时向服务器请求新的访问令牌,现在服务器可以决定是否接受刷新令牌。 【参考方案1】:

您说得对 :) 这取决于您使用的应用程序的属性。例如,如果您有一个公共客户端(例如,在浏览器中运行的 SPA),并且您授予该客户端对访问令牌和刷新令牌的访问权限,那么您确实失去了刷新令牌通常会为您提供的附加安全性。如果公共客户端可以刷新令牌,那么窃取您的刷新令牌的任何人都可以使用它来创建新的访问令牌。这就是为什么 SPA 通常不会直接获得刷新令牌 - 这些令牌要么保存在仅 http 的 cookie 中,要么 SPA 将使用 SSO 会话来刷新访问令牌(然后不使用刷新令牌)。

在机密客户端中,我们可以更安全地使用刷新令牌,因为它们不容易被盗,即使被盗,攻击者也可以访问客户端的密钥以在刷新端点进行身份验证。

@luk2302 在他的评论中所说的也取决于实施。您可以拥有可以撤销访问令牌和刷新令牌的服务器,以及不能撤销刷新令牌的服务器(这不是 OAuth RFC 的要求)。

【讨论】:

如果存储在 cookie 中,SSO sessionId 不是等同于访问令牌吗?如果用于检索另一个 accessToken,SSO sessionId 不是等同于访问令牌吗? 您可以控制后端的会话。一旦将访问令牌颁发给客户,您就无法控制它们。例如。您可以在用户注销时终止 SSO 会话,但如果您使用 JWT,您将无法撤销访问令牌(除非您有将令牌列入黑名单的机制,但这是另一回事)。此外,SSO 会话和访问令牌的颁发者可能不是同一方。例如。您正在使用 Google 的 SSO 对用户进行身份验证并为他们颁发访问令牌。然后,您可以依靠 Google 的会话管理来刷新令牌。

以上是关于为啥刷新令牌更安全?如果刷新令牌也可能被盗,为啥我们还要使用它?的主要内容,如果未能解决你的问题,请参考以下文章

为啥刷新令牌对于 SPA 来说被认为是不安全的?

为啥我们甚至需要通过 HTTPS 刷新令牌?

JWT, 为啥需要刷新令牌?

当我使用旧的刷新令牌时,为啥刷新端点会返回新的令牌?

为啥要使用refresh token?为何会更安全?

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