security - 如果 OAuth2 访问 token 可以被盗,为什么假设刷新 token 也可以被盗是不安全的?

标签 security authentication oauth-2.0

如果我们提出一个问题“为什么不使用不会过期的访问 token ,而不用刷新 token 呢?”,答案可能是“因为如果访问 token 被盗,恶意行为者有 X 时间(所述未过期访问 token 的生命周期)代表生成 token 的用户执行恶意行为。”因此,据我所知,解决该问题的方法是,在身份验证成功后,向用户发送一个 token 对,一个是short lived 访问 token ,另一个是longer lived 刷新 token 。我不明白这不仅仅是为了规避原始问题。问题显然在于访问 token 被盗的理论上的可能性。因此,如果它曾经是,它的有效性很快就会过期,所以恶意行为者很长一段时间都无法通过身份验证。在这种假设情况下,如果谁可以窃取访问 token ,为什么他们不能窃取刷新 token 呢?我得到的通常答案大致如下:

  1. “您必须将刷新 token 存储在安全的地方。” 这对我来说毫无意义。为什么我不将访问 token 和刷新 token 都存储在“安全的地方”?
  2. “访问 token 被盗的可能性更高,因为它比刷新 token 使用得更频繁”。在这种情况下,我怀疑“被盗”意味着“被嗅探”,就像在中间人攻击中一样。我有几个关于这个的子问题。 1. 为什么这适用? HTTPS header /正文是否加密?如果在这个问题中假设使用 HTTP,为什么我们还要谈论防止漏洞?这很好地引出了:2. 实际上,这种“嗅探”请求是什么样子的?为什么恶意行为者不能“嗅探”发送的每一个请求,并最终找到刷新 token ?
  3. “在微服务环境中,访问 token 被发送到所有服务,而刷新 token 仅被发送到授权服务/服务器。这听起来像最有效的,但我还有一个问题。这有什么区别?听起来授权服务器被认为比其他服务器具有更高的安全性?我想这只有在采用统计方法时才有意义,因为要窃取访问 token ,需要利用任何 X 服务器,而要窃取刷新 token ,只需利用一台服务器。虽然这只是我的假设,而且不知何故不符合这个安全概念的要点。此外,这个概念似乎并不是为了解决服务器问题而创建的。

我想我的问题是:

“如果我们假设访问 token 的概念、使用它或它的存储方式等存在任何固有漏洞......是什么使刷新 token 不易受到这些漏洞的影响?”

最佳答案

虽然“静态”访问 token 和刷新 token 的安全属性确实相同,但区别在于“传输中”刷新 token 比访问 token 更容易保护,因为它的方式使用,如下所述。

首先,访问 token 只发送给资源服务器,刷新 token 只用于单个授权服务器。在许多情况下,资源服务器被认为不太受信任(授权服务器在设计上是客户端的受信任组件),正如您提到的,可能有很多资源服务器可能具有适用于它们的不同级别的安全性。

其次,流向授权服务器的刷新 token 可能使用刷新 token 的“滚动刷新”,这意味着在访问 token 刷新时,也会发布一个新的刷新 token ,这会使旧的刷新 token 无效.这是授权服务器的一种非常常见的实现模式。

最后,也许有点远景,访问 token 在比刷新 token 更多的请求中使用,因此适用于传输层(定时攻击)的任何漏洞的可能性成比例地增加。

关于security - 如果 OAuth2 访问 token 可以被盗,为什么假设刷新 token 也可以被盗是不安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67661893/

相关文章:

sql-server - 无法远程或通过 IP 访问 SQL Server,但可以使用 localhost 或计算机名在本地访问它

java - 使用 OAuth2 在 Spring Security 中进行用户授权

ruby-on-rails - 使用 rspec_api_documentation 清除 Doorkeep token

security - 为应用程序寻找加密强度高的随机 secret ?

java - 如何找出 FIles.isWritable() 在 Windows 上返回 false 的原因

html - Google+ +1 小部件如何突破其 iframe?

api - .net core - 如何在 AuthorizationHandler 上返回 403?

c# - 适用于 Windows Phone 8.1 的 Facebook 登录

oauth-2.0 - 未定义身份验证 session

java - 用于蓝牙通信的轻量级对称 key 算法?