Cookies и сессии

Понимаем, как поверх «беспамятного» HTTP реализуют вход в систему и сохранение состояния.

Cookie — небольшой именованный кусочек данных, который сервер просит браузер сохранить и присылать обратно с каждым запросом к этому сайту.

Проблема: HTTP не помнит

Мы выяснили, что HTTP stateless — каждый запрос независим. Но интернет-магазину нужно помнить, что вы вошли в аккаунт и что у вас в корзине. Как «пришить» состояние к независимым запросам? Через cookies.

Как работают cookies

Механизм простой и держится на двух заголовках:

  1. Сервер в ответе просит сохранить cookie заголовком Set-Cookie.
  2. Браузер хранит её и автоматически добавляет в каждый следующий запрос заголовком Cookie.
Ответ сервера (вы вошли):
HTTP/1.1 200 OK
Set-Cookie: session=abc123xyz; HttpOnly; Secure; SameSite=Lax

Следующий запрос браузера (автоматически):
GET /profile HTTP/1.1
Cookie: session=abc123xyz

По session=abc123xyz сервер узнаёт вас среди тысяч запросов.

Сессии: что хранить — данные или ключ?

Есть два подхода, что класть в cookie:

ПодходВ cookieСостояние
Серверная сессиятолько id (ключ)на сервере (память/БД)
Токен (JWT и т.п.)сами данные (подписанные)в самом токене, сервер не хранит

При серверной сессии в cookie лежит только случайный идентификатор, а все данные («это пользователь №42, админ») — на сервере. При токенном подходе данные зашиты в сам токен и подписаны, поэтому сервер может ничего не хранить — удобно для масштабирования.

Важные флаги cookie

Флаги управляют безопасностью cookie — их обязательно знать:

ФлагЧто делает
HttpOnlycookie недоступна из JavaScript — защита от кражи через XSS
Securecookie отправляется только по HTTPS
SameSiteограничивает отправку cookie с других сайтов — защита от CSRF
Expires/Max-Ageсрок жизни; без них — до закрытия браузера

Сессионную cookie почти всегда ставят с HttpOnly и Secure: так её не украдёт чужой скрипт и не перехватит злоумышленник в открытой сети.

Зачем это веб-разработчику

Cookies и сессии — это и есть «вход в аккаунт» на 90% сайтов. Понимание флагов напрямую про безопасность: забыли HttpOnly — открыли дверь для кражи сессии через XSS. Забыли SameSite — рискуете CSRF. А ещё cookies тесно связаны с CORS (следующий раздел): по умолчанию они не шлются на чужой origin.

Итог

  • Cookie позволяет stateless-HTTP «помнить» пользователя между запросами.
  • Сервер ставит cookie через Set-Cookie, браузер возвращает через Cookie.
  • Серверная сессия хранит данные на сервере (в cookie только id); токен — данные в самом cookie.
  • Флаги HttpOnly, Secure, SameSite — это безопасность сессии.
Проверьте себя
1. Как сервер просит браузер сохранить cookie?
AЗаголовком Cookie в запросе
BЗаголовком Set-Cookie в ответе
CЧерез тело HTTP
DЧерез DNS-запись
2. Зачем cookie нужен флаг HttpOnly?
AЧтобы cookie работала только по HTTP, а не HTTPS
BЧтобы cookie была недоступна из JavaScript — защита от кражи при XSS
CЧтобы ускорить запросы
DЧтобы cookie жила дольше
3. В чём отличие серверной сессии от токенного подхода (JWT)?
AСессия хранит данные на сервере (в cookie только id), токен несёт данные в себе и сервер их не хранит
BЭто одно и то же
CТокен работает без cookie, сессия — без HTTP
DСессия безопаснее всегда
Поддержать проект