Spring Security CSRF 令牌存储库 Cookie 是不是会自动适用于所有 Ajax 请求?

Posted

技术标签:

【中文标题】Spring Security CSRF 令牌存储库 Cookie 是不是会自动适用于所有 Ajax 请求?【英文标题】:Will Spring Security CSRF Token Repository Cookies Work for all Ajax Requests Automatically?Spring Security CSRF 令牌存储库 Cookie 是否会自动适用于所有 Ajax 请求? 【发布时间】:2017-02-23 08:53:21 【问题描述】:

我正在经历以下security tutorial,它像这样配置CsrfTokenRepository

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

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

[更新]

我又看了一遍文章,上面说 CSRF 保护是由header 提供的。因此,如果我以正确的方式解释,那就是客户端以一种独特的方式发回 cookie 值,这种方式与最初提供 CSRF 保护的方式不同。换句话说,客户端接收到 cookie 并改变它的发回方式,以便服务器知道客户端确实在控制 cookie?

【问题讨论】:

【参考方案1】:

使用 Spring CookieCsrfTokenRepository 的 CSRF 保护工作如下:

    客户端向服务器(Spring 后端)发出 GET 请求,例如请求主页 Spring 发送 GET 请求的响应以及包含安全生成的 XSRF 令牌的 Set-cookie 标头 浏览器使用 XSRF Token 设置 cookie 在发送状态更改请求(例如 POST)时,客户端 (Angular) 将 cookie 值复制到 HTTP 请求标头 发送请求时同时带有标头和 cookie(浏览器会自动附加 cookie) Spring比较header和cookie值,如果相同则接受请求,否则返回403给客户端

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

withHttpOnlyFalse 方法允许 Angular 读取 XSRF cookie。确保 Angular 发出 XHR 请求时将 withCreddentials 标志设置为 true。

【讨论】:

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

Spring Security CSRF 令牌不适用于 AJAX

在 spring-security 中更改 csrf 令牌

Spring Security 未创建 CSRF 令牌

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

无法使用 Spring Security 创建 CSRF 令牌

Spring security中每个请求的不同csrf令牌