刷新令牌轮换——真的足够了吗?

Mic*_*ven 11 security authentication access-token openid-connect refresh-token

在使用 OIDC 服务器进行身份验证的单页应用程序 (JavaScript) 的上下文中,保持会话活动(在过期后获取更多令牌)的标准和推荐方法是使用 HttpOnly Cookie 并在 iframe 中执行静默更新。太好了,不涉及刷新令牌,因为浏览器无法保守秘密。

\n

现在看来,浏览器将阻止跨域 Cookie(Safari 和 Brave 已经这样做了,Chrome 似乎将是下一个),因此,如果服务器位于不同的域上,那么未来唯一的方法似乎是将刷新令牌刷新令牌轮换(以及可能的重用检测)结合使用,这似乎可以缓解问题。但真的是这样吗?

\n

场景 1)刷新令牌 (RT1) 被盗,用户请求新令牌并由于轮换而取回新的刷新令牌 (RT2)。RT1 现在无效,攻击者无法使用。伟大的。

\n

场景 2)刷新令牌 (RT1) 被盗,攻击者执行获取新令牌 (RT2) 的请求,用户使用旧令牌 (RT1),现在所有内容都被丢弃,用户必须再次登录(重用检测)并且攻击者的令牌也无效。伟大的。好吧,我在这里看到了一个问题(用户必须再次登录并且不知道为什么),但至少问题已经解决了。

\n

场景 3)这是我在任何地方都没有看到提到的场景。假设攻击者在不使用后续 RT 的情况下窃取了它们,因此它继续窃取 RT1。用户刷新,攻击者也窃取了RT2。一切工作正常,因为攻击者没有使用令牌,但也许他将所有令牌发送到其他地方进行存储。最后,用户关闭窗口,攻击者提取了 RT1 和 RT2。此时,攻击者可以使用最新的RT(RT2)来冒充用户,直到用户返回应用程序。假设他离开一周,攻击者拥有一周新的访问令牌(他可以不断刷新令牌)。直到最后没有人注意到任何事情。有了 Cookie,攻击者只能在浏览器会话期间进行操作,现在它有更多时间进行操作。

\n

那么...具有重用检测功能的 RTR 真的足够安全吗?主要论点是“这始终是一个风险/收益的选择”,我明白,但怎么会到了 2020 年,我们仍然遇到浏览器问题呢?你发现我遗漏的第三个场景有什么问题吗?老实说,会话 cookie 一直是最好的选择,事实上浏览器会阻止我们在这种常见场景中使用它们,这一事实让我抓狂:)

\n

谢谢。

\n

附言。我将在这里复制我找到的有关此问题的一些资源:

\n\n

RTR 并不是一种包罗万象的安全措施。如果攻击者设法在应用程序关闭之前获取最后一个刷新令牌,他们可能能够继续轮换被盗的刷新令牌。为了避免长期滥用被盗的刷新令牌,安全令牌服务可以将该刷新令牌的生命周期链接到具有安全令牌服务的 user\xe2\x80\x99s 会话的生命周期。这样做会在会话过期时使刷新令牌失效。

\n

这是我在场景 3 中提出的观点,但他建议的解决方案是将 RT 链接到用户的会话。那么,我们再次使用会话 Cookie,不是吗?如果我们不能使用它们怎么办?当我们无法使用跨域 cookie 时,这种情况下的 RT 应该是一种替代方案。

\n\n

这似乎同意我的观点,即即使使用 RTR,RT 也不够安全,并且 SPA 需要连接到同一域上的后端才能像以前一样工作。

\n

Gar*_*her 4

这是一个有趣的领域,它通常是可用性、安全性、性能和成本之间的权衡。该行业目前的状况相当不尽如人意,但我希望其中一些可以帮助您了解主要问题。

在浏览器中刷新令牌

在使用此解决方案之前,我将确保授权服务器正确支持OAuth 2.1 RTP 建议- 没有多少授权服务器这样做。

然后,我将确保仅将刷新令牌存储在应用程序的内存中,因为不建议将令牌存储在本地存储中。这意味着:

  • 多选项卡浏览或重新加载页面将需要通过您提到的旧的基于 iframe 的解决方案进行令牌刷新
  • 这不会在 Safari 中默默地工作,因此会有一个浏览器重定向,可用性利益相关者可能会抱怨

安全方面

当然,您的 SPA 安全性不仅仅涉及代币机制。您需要确保安全利益相关者接受该解决方案,并且需要考虑威胁,例如攻击者可以使用令牌/cookie 做什么。

前端模式的后端

这样做的一个大问题是,您通常需要一个后端来发出相同域的仅 HTTP 加密 cookie,用 C#、Node、Java 等编码。

这对于 SPA 架构来说可能是非常具有侵入性的:

  • 通过内容分发网络将 Web 静态内容推送到全球许多位置要么是不可能的,要么是更加困难的
  • 您可能需要对来自 SPA 的每个 API 调用进行双跳,这会增加复杂性,尤其是在缓存和 API 错误响应等领域
  • 使用 auth cookies 并不能“解决”安全问题,许多浏览器威胁仍然需要处理

2022 年更新

如今,我建议将令牌保留在浏览器之外,因为现在人们对此的认识很差。也许可以将令牌处理程序模式视为现代解决方案。