Короткий ответ
CSRF middleware защищает от межсайтовой подделки запросов, требуя, чтобы небезопасные методы (POST, PUT, DELETE) содержали корректный CSRF-токен, связанный с сессией пользователя.
Как это работает подробнее
Django генерирует уникальный токен для сессии/куки и ожидает его в форме ({% csrf_token %}) или заголовке (X-CSRFToken) при небезопасных запросах. Middleware сверяет токен из запроса с ожидаемым и возвращает 403 Forbidden при несовпадении или отсутствии.
Пример кода
example.txt
POST /profile/update HTTP/1.1
Host: example.com
Cookie: csrftoken=abc123; sessionid=
X-CSRFToken: abc123
Content-Type: application/json
{"name": "Alice"}
# Если заголовок X-CSRFToken отсутствует или не совпадает с cookie,
# Django вернёт 403 Forbidden с сообщением "CSRF verification failed".Что использовать на практике
- Практика. Для обычных HTML-форм достаточно тега
{% csrf_token %}в шаблоне. Для AJAX/SPA токен нужно передавать явно в заголовке, читая его из cookiecsrftoken. Для чистых API без сессий (например, с токен-аутентификацией) CSRF-защита обычно не требуется для этих эндпоинтов.
Подводные камни
- Риск. Отключают CSRF глобально вместо точечного
@csrf_exemptдля конкретного эндпоинта, не понимая последствий; забывают передавать токен в AJAX-запросах и получают необъяснимые 403 при разработке фронтенда.