让我一一回答你的问题。
为什么向http://localhost:8080/提出请求和
http://localhost:8080/csrf?
这是因为 Springfox Swagger 默认启用了对 CSRF 的支持。它的作用是,每当您尝试访问应用程序中的任何 swagger 端点时,它都会按以下顺序检查 CSRF 令牌并将其附加到请求标头。
- 您的元标记中的 CSRF 令牌在
/ 提供
- 端点
/csrf
- 您的 cookie 中的 CSRF 令牌
Springfox Swagger 附加 CSRF 令牌的原因是,如果您的应用程序启用了 CSRF 保护,那么对 swagger 端点的请求将失败,以防它们没有 CSRF 令牌作为标题。
swagger 期待什么样的 header/token,它将如何处理其中的信息?
正如我之前所说,swagger 需要一个 CSRF 令牌,当您尝试访问任何 swagger 端点时,它会将其附加到请求的标头中。
我可以使用它来使我的应用程序(或 swagger 端点)更安全或更易于访问吗?
在您的应用中启用 CSRF 保护将使您的应用免受 CSRF 攻击,而不一定只是通过提供 CSRF 令牌来大摇大摆地附加到标头。如果您在应用中启用了 CSRF 保护,则必须通过上述 3 种方式中的任何一种提供 CSRF 令牌,以访问应用中的任何 swagger 端点。您可以阅读有关启用 CSRF 保护的使用here。
我找不到有关实际实施的信息
如果你没有在你的应用程序中启用 CSRF 保护,那么为 swagger 实现 CSRF 令牌提供是没有用的,因为它只是多余的。但是,如果您想为 swagger 实施 CSRF 令牌规定,您可以通过以下 3 种方法之一来实现:
1) 在 / 提供的元标记中的 CSRF 令牌
<html>
<head>
<meta name="_csrf" content="${_csrf.token}"/>
<!-- default header name is X-CSRF-TOKEN -->
<meta name="_csrf_header" content="${_csrf.headerName}"/>
</head>
这是在您使用任何模板机制(如 JSP、thymeleaf 等)的情况下。
2) 端点/csrf
定义一个端点 /csrf 以提供 CSRF 令牌。
@RequestMapping("/csrf")
public CsrfToken csrf() {
//logic to return the CSRF token
}
3) Cookie 中的 CSRF 令牌
搜索的默认cookie名称为XSRF-TOKEN,返回的默认标头名称为X-XSRF-TOKEN。 Spring Security 提供了一种将 CSRF 令牌存储在 cookie 中的方式,按照 swagger 的要求,配置如下
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
}
}
实现上述 3 中的任何一个都会提供带有 CSRF 令牌以附加到请求标头的 swagger。
对上述内容的引用来自GitHub PR,它为 Springfox swagger 提供了 CSRF 支持,以及我之前链接的 Spring 安全文档。
目前存在一个关于默认启用的 CSRF 支持 here 的未解决问题,以及修复 #2639 和 #2706 的几个开放 PR。