【发布时间】:2015-08-17 15:28:16
【问题描述】:
我在 AngularJS SPA 中使用资源所有者密码凭据 OAuth 2.0 流。有几篇文章(here、here..)和this question 的答案解释了我们不应该在(Web)客户端(LocalStorage)上存储刷新令牌,而是将它们加密存储在 HttpOnly Cookie 中使用代理 API,我们在其中实现刷新令牌的解密,以将其转发到安全令牌服务。
大多数文章都暗示我们应该通过使用一种常见的保护机制来关注 CSRF。我想知道单页应用程序中的最佳解决方案是什么。
Angular $http 参考解释了我们应该如何应对 CSRF 的默认机制:服务器必须设置一个名为 XSRF-TOKEN 的 cookie。此 cookie 必须是 Javascript 可读的,以便我们可以在请求中设置 X-XSRF-TOKEN HTTP 标头。这种机制是否足以保护刷新令牌场景?
第一次启动应用程序。没有可用的访问令牌或 cookie,我们必须使用用户名和密码登录。
api/login为我们提供了一个访问令牌,我们将其保存在内存中并设置了两个 cookie。 HttpOnly 刷新令牌 cookie,以及 JS 可读的XSRF-TOKENcookie。访问令牌过期。对
api/token的调用验证XSRF-TOKEN并使用令牌cookie 返回一个新的访问令牌;设置一个新的刷新 cookie从
AppCache重新启动应用程序。内存中没有访问令牌,但 cookie 可用。使用api/token...坏人想偷我们的刷新饼干。准备好的页面使用我们的 cookie 向
api/token发出请求,但没有X-XSRF-TOKENHTTP 标头。
任何严重的安全问题?
【问题讨论】:
-
这仍然不能保护您免受 session/cookie/localStorage 劫持。为此,您需要在第 2 步中额外验证最后一个有效的访问令牌 - 这将确保被盗的 cookie 不再有效。
标签: javascript angularjs security oauth-2.0 csrf