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

han*_*aad 8 javascript security csrf oauth-2.0 angularjs

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

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

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

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

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

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

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

任何严重的安全问题?

tom*_*jan 0

据我所知,最好的方法是当服务器渲染带有 CSFR 令牌的 index.html 时,然后您就可以充当标准的 AngularJS SPA。因此,index.html后端服务/框架生成的 CSFR 令牌会对其进行丰富。SpringSecurity 为向模板注入令牌提供了很好的支持。

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