angular - 使用 Angular + Spring Boot + REST + JWT 进行 CSRF 保护

标签 angular rest spring-security jwt csrf

我正在使用 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/

相关文章:

java - SpringMVC 3 Spring Security 创建用户登录

html - 当我按 Enter 时, Angular 形式的按钮为 "clicked"

c# - 如何正确地重载具有多个集合参数的 WebAPI 2 Controller ?

java - 使用 Jersey 和 ExtJS 使用 JSON 的 Rest Web 服务

java - <method> 中的方法 setUserService 的参数 0 需要找不到类型为 <service> 的 bean

java - Thymeleaf spring 安全方言根本不起作用

angular - 如何在 nrwl/nx 工作区的库中使用 appenvironment.ts?

typescript - Angular 2找不到文件名 'Set'

angular - 我如何专注于特定的垫子标签

java - 使用 requests Restful 客户端时出现阿拉伯编码错误