CSRF CORS

Тема дорожной карты · Spring Boot

CSRF и CORS в Spring Security — это два различных, но часто путаемых механизма веб-безопасности, которые каждый разработчик Spring Boot-приложений должен настраивать правильно. Защита от CSRF (Cross-Site Request Forgery) включена по умолчанию в Spring Security для запросов, изменяющих состояние; она работает путём выдачи CsrfToken, который браузеры должны возвращать в заголовке или скрытом поле формы, и настраивается через HttpSecurity.csrf() в бине SecurityFilterChain — её обычно отключают для бесстатусных REST API, защищённых JWT. CORS (Cross-Origin Resource Sharing) управляет тем, какие источники могут обращаться к Spring Boot REST API из браузера; его можно настроить глобально через CorsConfigurationSource, зарегистрированный в SecurityFilterChain, или на уровне контроллера с помощью аннотации @CrossOrigin, указывающей origins, methods и allowedHeaders. CSRF и CORS в Spring Security взаимодействуют: фильтр CSRF должен выполняться после фильтра CORS, что гарантируется при настройке CORS через HttpSecurity.cors(), а не через обычный Spring MVC WebMvcConfigurer. Для Spring Boot API, потребляемых JavaScript-фронтендами, рекомендуемый подход — отключить CSRF (бесстатусная JWT-аутентификация) и точно настроить CORS, разрешая только доверенный источник фронтенда.

Как это работает

CSRF CORS (Spring Security 6.x): SecurityFilterChain (Java config заменяет старый WebSecurityConfigurerAdapter) конфигурирует HTTP security. AuthenticationManager + UserDetailsService для username/password. AuthorizationManager + method security (@PreAuthorize("hasRole('ADMIN')")) гейтят доступ. JWT через spring-security-oauth2-resource-server. OAuth 2.0 клиент + resource server для SSO. CSRF on для state-changing запросов; CORS конфигурируется per SecurityFilterChain. Самый часто misconfigured компонент Spring.

Когда применять

Не пишите свой auth — у Spring Security есть security-review, у вас нет. OAuth 2.0 / OIDC для SSO; resource server + JWT для stateless API. Валидируйте tokens централизованно (фильтр, не в каждом контроллере). @PreAuthorize-правила tight + audited. Отключайте CSRF только для stateless JWT API — не для browser sessions.

Типичные ошибки

Ловушки CSRF CORS: глобальное отключение CSRF, потому что "мешает" (security инцидент ждёт); валидируют JWT signature но не exp/iss/aud (просроченные/forged токены принимаются); используют deprecated WebSecurityConfigurerAdapter (Spring Security 6 удалил); хардкод role names без ROLE_ prefix не соответствует hasRole-семантике.

Связанные понятия

Полезные ресурсы