Позвольте мне ответить на ваши вопросы один за другим.
Почему запрос сделан на http://localhost:8080/
и
http://localhost:8080/csrf
Это потому, что Springfox Swagger по умолчанию включил поддержку CSRF. Это означает, что всякий раз, когда вы пытаетесь получить доступ к любым конечным точкам в вашем приложении, он проверяет токен CSRF в указанном ниже порядке и присоединяет его к заголовку запроса.
- CSRF-токен в ваших метатегах, обслуживаемых по адресу
/
- Конечная точка
/csrf
- CSRF-токен в вашем cookie
Причина, по которой Springfox Swagger присоединяет токен CSRF, заключается в том, что в случае, если в вашем приложении включена защита CSRF , запросы к конечным точкам сваггера будут отклоняться, если у них нет токена CSRF как части заголовок.
Какой заголовок / токен ожидает чванство, и что он будет делать с информацией в нем?
Как я уже говорил ранее, swagger ожидает токен CSRF и присоединит его к заголовку запроса при попытке доступа к любым конечным точкам swagger.
Могу ли я использовать это, чтобы сделать мое приложение (или конечную точку чванства) более безопасным или доступным?
Включение защиты CSRF в вашем приложении сделает ваше приложение защищенным от CSRF-атак и необязательно просто , предоставив маркер CSRF для swagger для присоединения к заголовку. Если вы включили защиту CSRF в своем приложении, вы должны предоставить токен CSRF любым из вышеперечисленных 3 способов для доступа к любым конечным точкам сваггера в вашем приложении. Вы можете прочитать об использовании включения защиты от CSRF здесь .
Я не могу найти информацию о том, что на самом деле реализовать
Нет никакого смысла в реализации предоставления токена CSRF для swagger, если вы не включили защиту CSRF в своем приложении, так как это было бы просто избыточно. Но если вы хотите реализовать предоставление токена CSRF для swagger, вы можете сделать это одним из 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, тимелист и т. Д.
2) Конечная точка /csrf
Определите конечную точку /csrf
для предоставления токена CSRF.
@RequestMapping("/csrf")
public CsrfToken csrf() {
//logic to return the CSRF token
}
3) CSRF-токен в вашем cookie
По умолчанию ищется имя файла 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 обеспечит swagger токеном CSRF для присоединения к заголовку запроса.
Ссылка на вышесказанное взята из GitHub PR , который предоставил поддержку CSRF для Springfox swagger, а также документации по безопасности Spring, которую я связал ранее.
В настоящее время существует открытая проблема, касающаяся поддержки CSRF по умолчанию здесь и нескольких открытых PR с исправлением # 2639 и # 2706 .