我正在使用一个Angular + Sping Boot 应用程序,我使用JWT进行授权(令牌存储在一个http only cookie中),后端完全使用REST服务开发。现在我正在尝试使用Spring Security的CSRF保护,但我不明白它是如何工作的。每次请求都会生成一个新的XSRF-TOKEN,但即使您手动更改或删除它,后续的请求也总是成功的。
这是我关于CSRF的代码片段(即所有指南上所写的内容):
http = http.cors().and().csrf().csrfTokenRepository(this.getCsrfTokenRepository());
...
private CsrfTokenRepository getCsrfTokenRepository() {
CookieCsrfTokenRepository tokenRepository = CookieCsrfTokenRepository.withHttpOnlyFalse();
tokenRepository.setCookiePath("/");
return tokenRepository;
}
我哪里做错了?
1条答案
按热度按时间iyzzxitl1#
您没有做错任何事情。当您使用
withHttpOnlyFalse
配置CookieCsrfTokenRepository
时,这意味着您使用双重提交cookie方法进行CSRF验证,而不是典型的同步器模式。在同步器模式中,传入令牌与会话中存储的令牌匹配。使用
CookieCsrfTokenRepository
时,将检查是否存在名为CSRF_TOKEN的cookie和标头名称X_XSRF_TOKEN以及**(如果它们的值与匹配)。请注意,cookie名称和标头名称可能不准确,但此处的要点是会话中没有可供匹配的特定值。这意味着,如果我发送一个值为A的令牌或值为A的cookie(A与Spring安全性发送的cookie中存储的值不同),请求将通过,因为它只检查头和cookie值是否相同,而不检查它生成的值。
这不是**安全漏洞。这是双重提交cookie方法的工作原理。