首页 文章

SPA中的刷新令牌Cookie的CSRF保护

提问于
浏览
7

我在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令牌场景?

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

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

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

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

任何严重的安全问题?

1 回答

  • 1

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

    之后,您可以使用javascript从模板中获取令牌,并使用 httpInterceptorrequest hook将其设置为 Headers 中的所有 $http 个请求 . (或cookie)?我不记得有什么方法,但我相信你在上面提到的文章中有描述)

相关问题