Логотип Workflow

Article

Updated at:

Cookies Theory

Stage 7. Cookies

Cookie — это небольшой фрагмент состояния, который сервер записывает в браузер через Set-Cookie, а браузер потом автоматически отправляет обратно в подходящих запросах. На базовом уровне это выглядит просто, но в реальном продукте поведение cookie зависит от правил браузера, доменов, HTTPS, SameSite, прокси и структуры фронтенда. Поэтому cookie нужно рассматривать как отдельный контракт между браузером и сервером.

Cookie model

1. Как работает cookie по шагам

  1. Сервер возвращает Set-Cookie в HTTP-ответе.
  2. Браузер сохраняет cookie вместе с атрибутами (Domain, Path, Secure, HttpOnly, SameSite, Max-Age).
  3. В следующих запросах браузер сам решает, отправлять cookie или нет.
  4. Сервер получает cookie и связывает её с сессией или другим состоянием.

Главный момент для новичка: решение об отправке cookie принимает браузер по своим правилам, а не ваш controller. Поэтому на backend может «всё правильно», но cookie в запрос не приходит из-за атрибутов.

2. Минимальный пример установки cookie

Set-Cookie: sid=abc123; Path=/; HttpOnly; Secure; SameSite=Lax

Этот заголовок говорит браузеру: сохранить sid, отправлять по пути /, не давать читать значение JavaScript-коду (HttpOnly), передавать только по HTTPS (Secure), и ограничить cross-site поведение через SameSite=Lax.

3. Что означает каждый важный атрибут

АтрибутЧто делаетТипичная ошибка
HttpOnlyЗапрещает доступ к cookie из скрипта страницыХранить сессионную cookie без HttpOnly
SecureРазрешает отправку только по HTTPSТестировать только на HTTP и ломаться в проде
SameSiteКонтролирует cross-site отправку cookieНеверно выбрать режим для login/redirect потока
DomainОпределяет, на какие хосты cookie действуетСлучайно сделать cookie недоступной нужному поддомену
PathОграничивает путь URL для отправки cookieУстановить на один путь, удалять на другом
Max-Age/ExpiresУправляет временем жизни cookieОставить бессрочную cookie без ротации

4. Почему logout часто делают неправильно

Для удаления cookie недостаточно просто отправить пустое значение. Нужно удалить cookie в той же области действия, где она была создана: тот же Path и Domain.

Set-Cookie: sid=; Path=/; Max-Age=0; HttpOnly; Secure; SameSite=Lax

Если при удалении атрибуты не совпали, старая cookie может остаться в браузере, и пользователь увидит «странный» статус: UI показал logout, но часть запросов всё ещё проходит как у авторизованного пользователя.

5. Cookies, localStorage и session storage: когда что использовать

Cookie удобна для серверной сессии и автоматической отправки браузером. localStorage и sessionStorage не отправляются автоматически в HTTP-запросах и читаются скриптами страницы. Из-за этого чувствительные сессионные идентификаторы обычно хранят именно в HttpOnly cookie, а не в localStorage.

6. Что важно проверить перед релизом

  1. Все auth-cookie имеют HttpOnly и Secure?
  2. SameSite соответствует вашему реальному login-flow?
  3. Установка и удаление cookie симметричны по Domain и Path?
  4. Есть тесты для cross-subdomain и logout сценариев?
  5. Значения cookie маскируются в логах?

Практический сценарий

Команда запустила новый logout endpoint и увидела, что часть пользователей после «выхода» всё равно открывает защищённые страницы без повторного входа. Анализ показал: cookie создавалась с Path=/, а удалялась с Path=/api. Браузер считал это разными областями действия и сохранял исходную cookie. После выравнивания Path и добавления e2e-проверки logout на нескольких маршрутах проблема исчезла. Этот кейс показывает, что в cookie-сценариях именно атрибуты определяют реальное поведение, а не только код бизнес-логики.

Авторизуйтесь чтоб пройти тесты

Quiz

Проверьте, что вы усвоили

Practice

Интерактивная практика

Выполните задания и сразу проверьте ответ.