SPA中刷新令牌Cookie的CSRF保护
CSRF Protection for Refresh Token Cookie in SPA
我在AngularJS SPA中使用资源所有者密码凭证OAuth 2.0流。有几篇文章(这里,这里…)和这个问题的答案解释了我们不应该在(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-TOKEN
cookie -
访问令牌过期。调用
api/token
验证XSRF-TOKEN
,并使用令牌cookie返回一个新的访问令牌;设置一个新的刷新cookie -
从
AppCache
重启应用程序。内存中没有访问令牌,但可用cookie。使用api/token
… -
坏人想偷我们的新饼干。一个准备好的页面用我们的cookie请求
api/token
,但是没有X-XSRF-TOKEN
HTTP头。
有严重的安全问题吗?
据我所知,最好的方法是当服务器呈现index.html时,里面有CSFR令牌,然后作为标准AngularJS SPA运行。因此,index.html
随后使用后端服务/框架生成的CSFR令牌进行了充实。SpringSecurity为向模板注入令牌提供了很好的支持。
之后,您可以使用javascript从模板中获得令牌,并通过使用httpInterceptor
, request
钩子将其设置为头中的所有$http
请求。(或cookie) ?我不太记得正确的方法是什么,但我相信你上面提到的文章中有描述。
- JS表单提交"无法使用Chrome数据保护程序加载此页面.尝试重新加载页面.调试信息:POST CISmtuK
- Django: AJAX + CSRF POST gives 403
- 元标记中使用令牌的 CSRF 保护 - 为什么它不能被盗
- 修补Rails 3以修复CSRF保护漏洞
- 提交Javascript表单时出现Codeigniter csrf保护错误
- 如何设置会话 Cookie 以保护和使用 CSRF 令牌
- spring CSRF保护一个HTML *仅*登录页面
- 如何在javascript中创建的表单中添加CSRF保护
- 不理解django的CSRF保护是如何工作的
- 如何保护浏览器使用的RESTful API免受CSRF攻击
- 移动设备上的CSRF保护(在cordova中运行)
- 如何在javascript中对带有CSRF保护的django框架进行适当的ajax调用
- 当尝试用ajax上传文件时,CSRF保护总是失败
- 如何用包含csrf保护的js生成link_to等价
- 针对GET请求的CSRF保护
- 保护奥蕾莉亚免受CSRF攻击
- 我是否需要启用 CSRF 保护
- Struts2令牌拦截器:CSRF保护
- 使用javascript进行CSRF保护
- SPA中刷新令牌Cookie的CSRF保护