Cookies: как HTTP хранит состояние
Cookies: как HTTP хранит состояние
Мы уже говорили, что HTTP — stateless протокол. Но почти каждый сайт помнит, кто ты, даже после перезагрузки браузера. Главный механизм, который это обеспечивает — cookies. Разберём, как они работают, какие у них ограничения и почему каждые полгода выходят законы про «cookie-баннеры».
Что такое cookie
Cookie — это небольшой фрагмент данных (обычно до 4 КБ), который сервер просит браузер сохранить. При каждом следующем запросе к тому же домену браузер автоматически прикрепляет cookie к заголовкам. Так сервер узнаёт вернувшегося пользователя.
Процесс выглядит так:
- Клиент впервые заходит на сайт.
- Сервер в ответе присылает заголовок:
Set-Cookie: session_id=abc123; HttpOnly; Secure. - Браузер сохраняет cookie на диске.
- При следующем запросе к тому же домену браузер добавляет:
Cookie: session_id=abc123. - Сервер видит cookie, находит сессию в базе и понимает, кто перед ним.
Атрибуты cookie
Cookie — не просто пара ключ-значение. У них есть атрибуты, управляющие поведением:
- Domain. К какому домену и поддоменам прикреплять cookie.
Domain=example.com— cookie будет отправляться наexample.comи все поддомены (blog.example.com,api.example.com). Если не указан — только на текущий домен (без поддоменов). - Path. Для каких путей на сайте действует cookie.
Path=/admin— cookie отправится только для URL внутри/admin. - Expires / Max-Age. Когда cookie истекает.
Max-Age=3600— cookie живёт 1 час. Без этого атрибута cookie живёт до закрытия браузера (сессионная cookie). - HttpOnly. Запрещает JavaScript доступ к cookie через
document.cookie. Критически важно для безопасности: даже если злоумышленник внедрит XSS-скрипт, он не украдёт session_id. Всегда ставь HttpOnly на сессионные cookie. - Secure. Cookie отправляется только по HTTPS. Без этого атрибута cookie может утечь при MITM-атаке на HTTP-соединении.
- SameSite. Защита от CSRF-атак:
Strict(cookie не отправляется с кросс-доменных переходов),Lax(отправляется при навигации, но не при AJAX-запросах с других сайтов),None(отправляется всегда, требует Secure).
Сессионные vs постоянные cookie
- Сессионные. Нет атрибута
ExpiresилиMax-Age. Хранятся в памяти браузера, удаляются при его закрытии. - Постоянные. Есть срок истечения. Хранятся на диске и переживают перезапуск браузера. Пример: «Запомнить меня» при логине.
Third-party cookies
Cookies могут устанавливаться не только сайтом, который ты посещаешь, но и сторонними сервисами, встроенными в страницу (рекламные сети, аналитика, соцсети). Это third-party cookies:
Ты на сайте shop.com, но там встроен iframe с ads.com/tracker
ads.com устанавливает cookie с Domain=ads.com
Теперь ads.com видит тебя на всех сайтах, где есть их трекер
Именно third-party cookies — основа рекламного трекинга. Поэтому браузеры постепенно их запрещают: Safari и Firefox уже блокируют, Chrome планирует полностью отказаться. Современная альтернатива — server-side аналитика и контекстная реклама без персонального трекинга.
Альтернативы cookies
Cookies не единственный способ хранить состояние на клиенте:
- localStorage. Хранилище ключ-значение в браузере (5–10 МБ). Данные не отправляются автоматически с запросами — JavaScript сам решает, когда их использовать. Подходит для настроек UI, кэша, но не для сессий (нельзя поставить HttpOnly).
- sessionStorage. То же, что localStorage, но данные живут до закрытия вкладки.
- JWT-токены в Authorization-заголовке. Альтернатива сессионным cookie для API: токен хранится в JavaScript и отправляется в заголовке
Authorization: Bearer <jwt>.
Проверь себя
- Что делает атрибут HttpOnly?
- Чем localStorage отличается от cookie?
- Почему third-party cookies постепенно запрещают?
- HttpOnly запрещает JavaScript читать cookie. Это защищает от кражи сессионных cookie через XSS-атаки.
- localStorage: больше объём (5+ МБ vs 4 КБ), данные не отправляются автоматически с HTTP-запросами, нет атрибутов безопасности (HttpOnly, Secure, SameSite). Не подходит для чувствительных данных.
- Потому что они позволяют рекламным сетям отслеживать пользователя между разными сайтами без его согласия, нарушая приватность.
Что унести с урока
- Cookies — основной механизм хранения сессий в stateless-HTTP. Сервер устанавливает, браузер присылает обратно.
- HttpOnly, Secure, SameSite — обязательные атрибуты для безопасности.
- Сессионные cookies живут до закрытия браузера, постоянные — до истечения срока.
- third-party cookies умирают. Альтернативы: localStorage для несекретных данных, JWT-токены для API.
В следующем уроке разберём механизмы кэширования HTTP — Cache-Control, ETag и Last-Modified.