我正在使用 Angular + Spring Boot 应用程序,并使用 JWT 进行授权( token 存储在仅 http 的 cookie 中),后端完全使用 REST 服务开发。现在我尝试将 CSRF 保护与 Spring Security 结合使用,但我不明白它是如何工作的。每次请求都会生成一个新的 XSRF-TOKEN,但即使您手动更改或删除它,后续请求也始终会成功。
这是我关于 CSRF 的代码片段(即所有指南上写的内容):
http = http.cors().and().csrf().csrfTokenRepository(this.getCsrfTokenRepository());
...
private CsrfTokenRepository getCsrfTokenRepository() {
CookieCsrfTokenRepository tokenRepository = CookieCsrfTokenRepository.withHttpOnlyFalse();
tokenRepository.setCookiePath("/");
return tokenRepository;
}
我哪里做错了?
最佳答案
你没有做错任何事。当您使用 withHttpOnlyFalse
配置 CookieCsrfTokenRepository
时,这意味着您使用双重提交 cookie 方法进行 CSRF 验证,而不是典型的同步器模式。
在同步器模式中,传入的 token 与 session 中存储的 token 相匹配。 使用 CookieCsrfTokenRepository 时,会检查是否存在名为 CSRF_TOKEN 的 cookie 和 header 名称 X_XSRF_TOKEN 以及它们的值是否匹配。请注意 cookie 名称和 header 名称可能不准确,但这里的要点是 session 中没有要匹配的特定值。
这意味着如果我发送一个值为A的 token 或值为A的cookie(A与Spring security发送的cookie中存储的不同),请求将通过,因为它只检查 header 和cookie值是否相同,而不是它生成的那个。
这不是安全缺陷。这是how双重提交 cookie 方法有效。
关于angular - 使用 Angular + Spring Boot + REST + JWT 进行 CSRF 保护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73275968/