Spring Security CSRF令牌存储库Cookie是否可以自动满足所有Ajax请求?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Security CSRF令牌存储库Cookie是否可以自动满足所有Ajax请求?相关的知识,希望对你有一定的参考价值。

我正在通过以下security tutorial,它配置像这样的CsrfTokenRepository

.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());

是否只需要让Ajax请求在所有库中运行? $http的Angular文档说Angular读取Spring提供的CSRF cookie,并在发出请求时设置相应的头。所以我假设这样做是因为在发送Ajax请求时不会自动包含cookie?

[更新]

我再次阅读了这篇文章,它说CSRF保护是由header提供的。因此,如果我以正确的方式解释这是因为客户端以独特的方式发回cookie值,这与提供CSRF保护的第一个地方发送的方式不同。换句话说,客户端接收cookie并更改它的回送方式,以便服务器知道客户端确实控制了cookie?

答案

使用Spring CookieCsrfTokenRepository进行CSRF保护的工作方式如下:

  1. 客户端向服务器(Spring后端)发出GET请求,例如请求主页面
  2. Spring发送GET请求的响应以及包含安全生成的XSRF令牌的Set-cookie头
  3. 浏览器使用XSRF令牌设置cookie
  4. 在发送状态改变请求(例如POST)时,客户端(Angular)将cookie值复制到HTTP请求头部
  5. 请求与标头和cookie一起发送(浏览器自动附加cookie)
  6. Spring会比较标头和cookie值,如果它们是相同的,则接受请求,否则将403返回给客户端

请注意,默认情况下只有状态更改请求(POST,PUT,DELETE)受CSRF保护,并且只有在正确设计API时才需要保护这些请求(例如,GET请求没有副作用并修改应用程序的状态) 。

方法withHttpOnlyFalse允许角度读取XSRF cookie。确保Angular在withCreddentials标志设置为true的情况下发出XHR请求。

以上是关于Spring Security CSRF令牌存储库Cookie是否可以自动满足所有Ajax请求?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Security 3.2.0.RELEASE,如何在没有标签库的纯 HTML 页面中获取 CSRF 令牌

Spring Security CSRF 令牌不适用于 AJAX

在 spring-security 中更改 csrf 令牌

Spring Security 未创建 CSRF 令牌

使用 Spring Security 重命名 CSRF 令牌头名称

无法使用 Spring Security 创建 CSRF 令牌