📝 API

Cookie-сессии и CSRF в серверном веб-приложении

P
Автор
PyLand Team
📅
Опубликовано
18.09.2026
⏱️
Время чтения
1 мин
👁️
Просмотров
4
🌳
Уровень
Продвинутый

Cookie-сессия связывает запросы браузера с пользователем. В подписанной cookie
данные защищены от незаметного изменения, но не обязательно скрыты. Не храни в ней
пароль, API-ключ или другую тайну — достаточно идентификатора пользователя.

Здесь легко запутаться, потому что сессия и CSRF решают разные задачи. Сессия
помогает узнать пользователя, а CSRF-защита доказывает, что изменяющую форму
отправила страница твоего сайта. Для входа, создания, удаления и выхода нужны оба слоя.

  • HttpOnly запрещает чтение cookie из JavaScript;
  • Secure отправляет её только по HTTPS;
  • SameSite=Lax или Strict уменьшает риск межсайтовых запросов;
  • стабильный случайный SECRET_KEY хранится в окружении;
  • выход очищает сессию и инвалидирует состояние пользователя.

SameSite — полезный дополнительный слой, но изменяющие HTML-формы всё равно
защищают CSRF-токеном.

Synchronizer token

  1. Сервер создаёт случайный токен и сохраняет его в сессии.
  2. GET формы помещает токен в hidden-поле.
  3. POST получает hidden-поле и сравнивает с сессией.
  4. Отсутствующий или неверный токен даёт 403 до изменения данных.

Токен не является паролем пользователя. Это случайное одноразовое доказательство,
связанное с текущей сессией. Атакующий сайт не может прочитать его из твоей формы.

import secrets

def valid_csrf(expected: str | None, received: str | None) -> bool:
    return bool(expected and received) and secrets.compare_digest(expected, received)

Не передавай CSRF-токен в URL и не записывай его в логи. GET не должен изменять
данные. Logout и delete выполняй через POST с той же проверкой.

В тесте используй один клиент: сначала получи форму и session cookie, извлеки токен,
затем отправь POST. Отдельно проверь запрос без токена и токен из другой сессии.

Проверка перед запуском

  • настоящая SECRET_KEY приходит из окружения и не меняется при каждом старте;
  • в production cookie получает Secure, а всегда — HttpOnly;
  • GET ничего не создаёт и не удаляет;
  • все изменяющие формы, включая logout, проверяют CSRF;
  • ошибка токена возвращает 403 до обращения к базе.

Официальные материалы

Ваша реакция на статью

💬 Комментарии (0)

🔐 Войдите в систему, чтобы оставить комментарий
🚪 Войти
💭

Комментариев пока нет

Станьте первым, кто поделится мнением об этой статье!

🔗 Похожие

Похожие статьи

Продолжите изучение с этими материалами

📝

Безопасная загрузка файлов: размер, тип, имя и хр…

Когда пользователь выбирает фотографию, всё выглядит просто: браузер отправляет файл, а сервер сохраняет его. Но...

📅 18.09.2026 👁️ 2
📝

S3-совместимое объектное хранилище: bucket, key и…

На одном компьютере файл можно сохранить в обычную папку. После деплоя это ненадёжно: контейнер могут...

📅 18.09.2026 👁️ 1
📝

Принципы проектирования REST API

Охватываемые темы: Ресурсы и URL, HTTP методы, Вложенные ресурсы, Коды ответов.

📅 30.06.2026 👁️ 349

Понравилась статья?

Подпишитесь на наши обновления и получайте новые статьи первыми. Развивайтесь вместе с PyLand!