SPA中的CSRF保护刷新令牌Cookie

时间:2015-06-03 12:12:30

标签: javascript angularjs security oauth-2.0 csrf

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

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

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

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

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

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

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

  5. 任何严重的安全问题?

1 个答案:

答案 0 :(得分:1)

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

之后,您可以使用javascript从模板中获取令牌,并使用index.html' s $http挂钩将其设置为标题中的所有httpInterceptor个请求。 (或cookie)?我没有清楚地记得正确的方法,但我确信它在上面提到的文章中有所描述)