Получить доступ

Когда CSRF-защита нужна в Spring Security, а когда её часто отключают?

MiddleSpring Security
Ещё спрашивают так:
  • Нужно ли отключать CSRF для REST API?
Коротко

CSRF-защита нужна, когда браузер сам прикладывает учётные данные — cookie сессии. Для stateless API с токеном в заголовке Authorization её обычно отключают: браузер не подставит такой заголовок на чужом сайте.

  • Spring Security включает CSRF по умолчанию для изменяющих методов
  • SPA с cookie-сессией — CookieCsrfTokenRepository и заголовок X-XSRF-TOKEN
  • SameSite=Lax у cookie — дополнительный слой, но не повод отключать защиту

А ещё JWT в cookie — CSRF снова актуален

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Атака: пользователь вошёл на ваш сайт (есть cookie сессии), открыл страницу злоумышленника, та отправила форму POST /transfer на ваш сайт. Браузер приложил cookie — запрос выполнен от имени пользователя.

Когда защита нужна: аутентификация через cookie — сессия, JWT в cookie, Basic auth в браузере. Spring Security требует CSRF-токен в изменяющих запросах (POST, PUT, PATCH, DELETE): токен выдаётся в форме или cookie и должен вернуться в параметре или заголовке.

SPA с cookie-сессией: CookieCsrfTokenRepository.withHttpOnlyFalse() — токен в cookie XSRF-TOKEN, JavaScript читает его и отправляет в заголовке X-XSRF-TOKEN. В Spring Security 6 токен по умолчанию маскируется (защита от BREACH) — для SPA нужен соответствующий обработчик запроса.

Когда отключают: API для мобильных и сервисных клиентов с токеном в заголовке Authorization: Bearer и без cookie-сессий (SessionCreationPolicy.STATELESS). Браузер такой заголовок на межсайтовый запрос сам не подставит — атаке нечего использовать.

Ошибка — отключить CSRF «потому что мешает», оставив аутентификацию по cookie.

Что хотят услышать

  • Механика CSRF и роль cookie.
  • Когда защита нужна и когда её отключают.
  • SPA и CookieCsrfTokenRepository.

Частые ошибки

  • Отключать CSRF при cookie-сессии.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Нужна всегда и везде без исключений
  • ✗Нужна только для GET-запросов
  • ✗Отключать нужно всегда ради производительности
  • ✓Нужна для stateful cookie/сессий (браузер сам шлёт credentials); для stateless bearer-API её обычно отключают

Что спросят дальше

  • Чем CSRF отличается от XSS?
  • Что делает SameSite cookie?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем