【问题标题】:CSRF Protection for Refresh Token Cookie in SPASPA 中刷新令牌 Cookie 的 CSRF 保护
【发布时间】:2015-08-17 15:28:16
【问题描述】:

我在 AngularJS SPA 中使用资源所有者密码凭据 OAuth 2.0 流。有几篇文章(herehere..)和this question 的答案解释了我们不应该在(Web)客户端(LocalStorage)上存储刷新令牌,而是将它们加密存储在 HttpOnly Cookie 中使用代理 API,我们在其中实现刷新令牌的解密,以将其转发到安全令牌服务。

大多数文章都暗示我们应该通过使用一种常见的保护机制来关注 CSRF。我想知道单页应用程序中的最佳解决方案是什么。

Angular $http 参考解释了我们应该如何应对 CSRF 的默认机制:服务器必须设置一个名为 XSRF-TOKEN 的 cookie。此 cookie 必须是 Javascript 可读的,以便我们可以在请求中设置 X-XSRF-TOKEN HTTP 标头。这种机制是否足以保护刷新令牌场景?

  1. 第一次启动应用程序。没有可用的访问令牌或 cookie,我们必须使用用户名和密码登录。 api/login 为我们提供了一个访问令牌,我们将其保存在内存中并设置了两个 cookie。 HttpOnly 刷新令牌 cookie,以及 JS 可读的XSRF-TOKEN cookie。

  2. 访问令牌过期。对api/token 的调用验证XSRF-TOKEN 并使用令牌cookie 返回一个新的访问令牌;设置一个新的刷新 cookie

  3. AppCache 重新启动应用程序。内存中没有访问令牌,但 cookie 可用。使用api/token...

  4. 坏人想偷我们的刷新饼干。准备好的页面使用我们的 cookie 向 api/token 发出请求,但没有 X-XSRF-TOKEN HTTP 标头。

任何严重的安全问题?

【问题讨论】:

  • 这仍然不能保护您免受 session/cookie/localStorage 劫持。为此,您需要在第 2 步中额外验证最后一个有效的访问令牌 - 这将确保被盗的 cookie 不再有效。

标签: javascript angularjs security oauth-2.0 csrf


【解决方案1】:

据我所知,最好的方法是在服务器使用 CSFR 令牌呈现 index.html 时,然后您将作为标准 AngularJS SPA 运行。因此index.html 会被后端服务/框架生成的CSFR 令牌丰富。 SpringSecurity 为向模板注入令牌提供了很好的支持。

之后,您可以使用 javascript 从模板中获取令牌,并使用 httpInterceptor's、request 挂钩将其设置为标头中的所有 $http 请求。 (或饼干)?我不记得清楚什么是正确的方法,但我确信它在你上面提到的文章中有所描述)

【讨论】:

    猜你喜欢
    • 2013-07-20
    • 2015-03-24
    • 2018-02-27
    • 2019-08-24
    • 1970-01-01
    • 2017-06-08
    • 2012-07-21
    • 2017-04-25
    • 1970-01-01
    相关资源
    最近更新 更多