Oauth 2.0 为什么刷新令牌对于SPA不安全?

Oauth 2.0 为什么刷新令牌对于SPA不安全?,oauth-2.0,access-token,refresh-token,Oauth 2.0,Access Token,Refresh Token,我正在阅读Auth0站点上关于的文档,他们声明,由于无法将它们安全地存储在浏览器中,因此使用静默身份验证来检索新的访问令牌 单页应用程序(通常实现隐式授权)在任何情况下都不应获取刷新令牌。原因是这条信息的敏感性。您可以将其视为用户凭据,因为刷新令牌允许用户永远保持身份验证。因此,您不能在浏览器中使用此信息,它必须安全存储 我很困惑。据我所知,检索新访问令牌的唯一方法是向Auth服务器提交一个新请求,以及某种形式的Auth0会话cookie,以对登录的用户进行身份验证。收到会话cookie后,Au

我正在阅读Auth0站点上关于的文档,他们声明,由于无法将它们安全地存储在浏览器中,因此使用静默身份验证来检索新的访问令牌

单页应用程序(通常实现隐式授权)在任何情况下都不应获取刷新令牌。原因是这条信息的敏感性。您可以将其视为用户凭据,因为刷新令牌允许用户永远保持身份验证。因此,您不能在浏览器中使用此信息,它必须安全存储

我很困惑。据我所知,检索新访问令牌的唯一方法是向Auth服务器提交一个新请求,以及某种形式的Auth0会话cookie,以对登录的用户进行身份验证。收到会话cookie后,Auth0服务器将能够发出新的访问令牌


但这与在浏览器或本地存储中使用刷新令牌有什么不同呢?是什么使会话Cookie比刷新令牌更安全?为什么在SPA中使用刷新令牌是一件坏事?

好问题-因此没有真正安全的方法在浏览器上存储任何令牌(或任何其他机密信息)-请参阅。因此,单页应用程序(SPA)不应存储刷新令牌-刷新令牌尤其有问题,因为它是长期存在的(长期过期或无过期),如果被盗,则攻击者可以在每次单独过期后继续刷新访问令牌

当您需要访问令牌(例如调用API)时,最好只检索它,或者只存储在内存中(仍然容易受到XSS/CSRF的攻击),但最好使用并忘记它。然后在下次需要访问令牌时再进行一次checkSession调用

对于您的问题-checkSession请求不需要发送令牌。顾名思义,这是一个针对授权服务器的“检查会话”,以查看会话是否存在。如果是,则授权服务器响应将包含一个新的访问令牌。看


如果有任何问题需要进一步澄清等,请随时在此答案下方给我留言。

刷新令牌不在SPA中使用,因为为了使用刷新令牌-并从
/token
获取新的访问令牌,SPA需要有一个客户端机密,不能安全地存储在浏览器中。但是,由于建议对
/token
端点(对于公共客户端)不要求客户端机密,因此刷新令牌甚至可以在SPA中使用

要获取刷新令牌,您需要使用,它在重定向URL中传递代码,该URL将发送到承载SPA的服务器(这可能是额外的攻击点)。隐式授权只将令牌传递到浏览器(重定向URL的哈希部分不会到达服务器)

使用刷新令牌和SSO会话cookie之间的区别在于,cookie可能更安全,因为它可以标记为,使得使用JavaScript代码的攻击无法访问

更新


通过扩展,授权代码流(带有刷新令牌)甚至成为基于浏览器的应用程序的推荐流。有关详细信息,请参阅的最新版本。

对于Cookie和刷新令牌以及OAuth2,存在许多误解

首先,只有机密客户机才能使用刷新令牌是不正确的。OAuth2协议规定,机密客户端必须进行身份验证,但不需要机密客户端。因此,客户端身份验证在刷新操作中是可选的。看

其次,您必须了解替代方案是什么:

  • 强制用户每5分钟输入一次用户名和密码(只要访问令牌过期)
  • 长寿命访问令牌
  • 通过HTTP Cookies进行身份验证
  • 世界上所有不使用刷新令牌的人都使用选项3。通过cookie进行身份验证在功能和安全方面100%等同于存储刷新令牌。当然,对于代币和cookie,它们的存放位置有多种选择:

    a。仅限HTTP, B安全(需要TLS/SSL)和 C会话(内存中)与持久(本地、域存储)

    “仅HTTP”选项仅适用于Cookie,因此可能代表使用Cookie而不是令牌的唯一优势。也就是说,令牌是通过Javascript处理的,因此没有任何选项可以让它们远离脚本。这就是说,这些标记只对存储它的页面域中的Javascript可用(或在CORS策略允许的情况下)。所以这个问题可能被夸大了

    当然,必须注意始终使用TLS/SSL传输身份验证cookie或令牌。老实说,因为我们知道大多数违规行为都发生在私有公司网络中,所以端到端TLS不再是基本要求

    最后,Cookie或令牌是否被持久化,即存储在关闭浏览器甚至重新启动设备后仍能生存的地方,取决于您在可用性和安全性之间的权衡-对于您的应用程序

    对于需要更高安全级别的应用程序,只需将所有内容保存在内存中(即会话cookie、Javascript变量中的令牌)。但对于那些不需要太多安全性,并且确实希望会话寿命为几天或几周的应用程序,则需要存储它们。无论哪种方式,只有来自原始域的页面和脚本才能访问该存储,因此Cookie和令牌在功能上是等效的。

    这不再是事实(2021年4月),现在陈述了一件不同的事情:

    Auth0建议使用刷新令牌轮换,这为使用refr提供了一种安全的方法