Cookie (куки)
Cookie (куки)
Небольшой фрагмент данных, который сервер просит браузер сохранить и присылать обратно с каждым следующим запросом. Так веб-сайт «узнаёт» тебя между кликами и посещениями.
История
- 1994 год, США, Лу Монтулли (Lou Montulli), инженер компании Netscape Communications.
- Задача, которую решали: у HTTP нет памяти. Каждый запрос — как первый, сервер не помнит, что ты только что кликал. Netscape строил онлайн-магазин для MCI, где нужна была корзина покупок. Кто-то должен помнить, что ты положил кроссовки, пока идёшь на другую страницу и обратно. Хранить всё на сервере под каждым посетителем — дорого; хочется, чтобы клиент сам «носил» с собой идентификатор.
- Решение: сервер даёт клиенту маленькую записку — «magic cookie» (старый жаргон из Unix для непрозрачной метки, которую программа передаёт другой, не заглядывая внутрь). Браузер записку хранит и возвращает при следующих запросах.
- 1997 — RFC 2109, первая спецификация. 2000 — RFC 2965, переработка. 2011 — RFC 6265, действующий стандарт на сегодня.
- 2011 — директива Евросоюза ePrivacy (в народе «cookie law»): сайты обязаны спрашивать согласие на любые не-необходимые куки. Отсюда те самые баннеры на каждом сайте.
- 2018 — GDPR ужесточает требования к персональным данным, включая идентификаторы в куках.
- 2020 — Safari (Apple) в рамках Intelligent Tracking Prevention полностью отключает третьесторонние куки. Firefox то же самое через Enhanced Tracking Protection.
- 2024–2025 — Google Chrome сначала объявил отказ от third-party cookies, потом откатил решение под давлением рекламной индустрии. На сегодня они всё ещё живы в Chrome, но живут «на птичьих правах».
Что это такое
Кука — это пара «имя = значение» плюс метаданные (домен, путь, срок жизни, флаги). Хранится браузером на диске или в памяти. Отправляется автоматически при каждом запросе к тому же домену, откуда пришла.
Технически всё выглядит просто. Сервер добавляет в HTTP-ответ заголовок:
Set-Cookie: session_id=abc123; Domain=example.com; Path=/; Max-Age=3600; HttpOnly; Secure; SameSite=Lax
Браузер разбирает эту строку, проверяет атрибуты и сохраняет пару session_id=abc123 в базу кук для домена example.com. В каждый следующий запрос к этому домену браузер сам добавляет заголовок:
Cookie: session_id=abc123
Размер одной куки ограничен 4 килобайтами. Браузеры хранят от 50 до 300 кук на домен и десятки тысяч всего.
Что кладут внутрь на практике:
- Идентификатор сессии — случайная строка, а реальный профиль пользователя лежит на сервере в базе.
- Настройки, которые дешевле хранить на клиенте: язык интерфейса, тема, размер шрифта.
- Токены аутентификации (после логина).
- Аналитические идентификаторы: уникальный ID для подсчёта уников и построения воронки.
- Antibot- и antifraud-метки: «этот браузер прошёл капчу, следующие 30 минут его не трогать».
Чего в куке нормально быть не должно: пароль в открытом виде, платёжные данные, персональные данные без шифрования. Кто так делает — попадает под GDPR и штрафы.
Cookie vs Session vs LocalStorage. Часто путают, поэтому фиксирую отличия:
- Cookie — хранит браузер, отправляется автоматически с каждым HTTP-запросом, ограничение 4 КБ, доступна серверу.
- Session — это концепция «связного диалога» пользователя с сервером. Session реализуется поверх кук (в куке лежит session_id, а сами данные хранятся на сервере). Session — идея, cookie — механизм её переноса.
- LocalStorage / SessionStorage — API браузера для хранения данных на клиенте. НЕ отправляется автоматически на сервер, размер до 5–10 МБ. Из HTTP-запроса недоступна, только из JavaScript.
Аналогии из жизни
1. Гардеробный номерок. Ты приходишь в театр, отдаёшь пальто — тебе дают жетон с номером. По этому номеру гардеробщик находит твоё пальто. Сам жетон маленький и ничего личного не хранит. Номер — это session_id, гардероб — сервер, пальто — твой профиль.
Где ломается: пальто отдают только по жетону, потерял жетон — идёшь с паспортом. С куки не так: если её украли, злоумышленник получает твою сессию, не зная тебя в лицо. Отсюда флаги HttpOnly и Secure — попытка сделать «жетон» сложнее украсть.
2. Штамп на руке в клубе. Один раз заплатил на входе — тебе поставили печать. Дальше ходишь туда-сюда, охрана видит печать и пускает без вопросов. Печать — кука аутентификации, охрана — сервер, который её проверяет.
Где ломается: печать держится один вечер и смывается в душе. Кука может жить неделями, месяцами, «навсегда» (Max-Age на 10 лет). И печать невозможно поставить незаметно — а куки браузер принимает автоматически, ты можешь и не знать, что их у тебя тысячи.
3. Твоя тележка в супермаркете. Пока ходишь по магазину, тележка едет за тобой. Кассир на выходе видит, что в ней. Ушёл — магазин про тебя забыл.
Где ломается: тележку видит только магазин, где ты её взял. А third-party cookies работают наоборот — рекламная сеть узнаёт тебя во всех магазинах, где стоит её камера. Аналог в физическом мире трудно подобрать, потому что там нет таких сквозных наблюдателей: только видеосистема, которая ставит камеры сразу в тысячах магазинов и связывает записи по лицу.
Как это работает
Пошагово. Ты первый раз заходишь на example.com:
- Браузер отправляет
GET / HTTP/1.1с заголовкомHost: example.com. Кук у него нет — он их и не отправляет. - Сервер отвечает:
HTTP/1.1 200 OK+ тело страницы + заголовокSet-Cookie: session=xY9pZ...; Path=/; Max-Age=1209600; HttpOnly; Secure; SameSite=Lax. - Браузер видит
Set-Cookie, проверяет атрибуты (домен подходит? Secure ли соединение?), и сохраняет паруsession=xY9pZ...в базу кук для домена example.com. - Ты кликаешь на ссылку
/profile. Браузер отправляетGET /profile— и автоматически добавляет заголовокCookie: session=xY9pZ.... - Сервер видит куку, ищет по её значению пользователя в базе сессий и отдаёт твой профиль.
Ключевые атрибуты Set-Cookie — это и есть 80% практической темы:
Domain— какому домену принадлежит кука. По умолчанию — тот, который её выдал. Если сервер example.com пишетDomain=example.com— кука будет отправляться и на api.example.com, и на blog.example.com. Нельзя выдать куку от example.com для отправки на google.com — иначе сайты могли бы подкидывать друг другу куки и красть сессии.Path— на какие пути отправлять. По умолчанию — тот, откуда пришла. Обычно ставят/, чтобы кука работала на всём сайте.ExpiresилиMax-Age— срок жизни. Если не указан — «сессионная кука» (session cookie), исчезает при закрытии браузера. Если указан — «постоянная» (persistent), сохраняется на диск.Secure— отправлять только по HTTPS. Без этого флага кука ходит открытым текстом по HTTP, любой прокси её видит.HttpOnly— недоступна JavaScript черезdocument.cookie. Защита от XSS: даже если злоумышленник впрыснул скрипт на страницу, он не сможет прочитать сессионную куку.SameSite— отправлять ли куку в запросах, инициированных другим сайтом. Значения:Strict(никогда),Lax(только при переходах по ссылкам, не в фоновых запросах),None(всегда, но обязательно вместе сSecure). Это защита от CSRF. По умолчанию с 2020 года —Lax.
Ключевое различие: first-party vs third-party.
- First-party — куки того сайта, на котором ты находишься. Ты на nytimes.com — nytimes.com выдаёт свою куку. Все нормальные функции сайта (логин, корзина, настройки) работают на них.
- Third-party — куки постороннего домена. Ты на nytimes.com, но на странице загружается пиксель от doubleclick.net (реклама Google). Этот пиксель — запрос к doubleclick.net, который в ответе ставит свою куку. Дальше на любом другом сайте, где стоит тот же пиксель, doubleclick.net узнаёт тебя по этой куке. Так работал рекламный ретаргетинг последние 25 лет.
Схематично поток сессионной куки:
Ты Браузер Сервер
| открыть сайт | |
|---------------->| GET / |
| |-------------------->|
| | 200 OK |
| | Set-Cookie: sid=X |
| |<--------------------|
| | [запомнить куку] |
| | |
| кликнуть | |
|---------------->| GET /profile |
| | Cookie: sid=X |
| |-------------------->|
| | 200 OK, твой профиль
| |<--------------------|
Кука — это не «пользователь». Кука — это доказательство, что *этот же браузер* уже был здесь. Всё, что означает кука для сервера, — «я тебя видел». Кто конкретно за экраном, кука сказать не может.
Где встречается в обычной жизни
- Ты остался залогинен в почте, VK, банке — потому что в браузере лежит кука с сессией на пару недель или дольше. Закрыл вкладку — кука жива, вернулся — сайт узнал.
- Реклама «догоняет» после того, как ты посмотрел товар — сайт магазина посадил третьесторонний рекламный пиксель, тот записал в свою куку «этому пользователю интересны кроссовки». Теперь на любом сайте с той же рекламной сетью тебе будут показывать кроссовки.
- Корзина в интернет-магазине помнит товары даже без логина — либо кука с полным содержимым, либо кука с ID корзины, которую сервер восстанавливает.
- Баннер «согласитесь с использованием cookie» — следствие GDPR и ePrivacy: сайт обязан спросить согласие на любые не-необходимые куки, особенно рекламные и аналитические.
- Выбранный язык интерфейса запомнился на всех страницах — часто хранится в куке
lang=ru.
Где встречается в IT и бизнесе
- Аутентификация в веб-приложениях. 90% способов «залогинить пользователя» — это выдать ему куку с session_id или JWT-токеном. Личные кабинеты, админки, CRM — всё держится на кукe после логина.
- Аналитика. Yandex.Metrika, Google Analytics работают через first-party куки. Уникальный ID пользователя (у Метрики —
_ym_uid, у GA —_ga) хранится в куке и позволяет считать уников, ретеншн, воронки. - Рекламная атрибуция и таргетинг. Google Ads, Facebook Ads, Яндекс.Директ устанавливают свои куки (yclid для Директа тоже часто оседает как кука) и по ним понимают, кто конверсионный лид, а кто нет.
- A/B-тестирование. В куке хранится «ты в группе А» — чтобы при следующем визите не переключить тебя в группу Б и не сломать эксперимент.
- Antibot и antifraud. Cloudflare, PerimeterX, DataDome ставят свою куку после того, как ты прошёл капчу или проверку — и по ней отличают легитимного пользователя от бота на следующие 30 минут.
- Парсинг и сбор данных. Когда собираешь данные через headless-браузер (Playwright, Puppeteer), критично управлять сессионными куками — они определяют, увидит тебя сайт как живого пользователя или как бота.
Кто пользуется
- Все, у кого есть веб-сайт с логином: Facebook (около 3 млрд MAU), YouTube, VK, Wildberries, Ozon — миллиарды сессионных кук в день.
- Все аналитические счётчики. Google Analytics стоит примерно на 28 млн активных сайтов (по разным оценкам). Yandex.Metrika — миллионы российских сайтов.
- Все рекламные сети. Google Ads крутится вокруг third-party cookies уже 25 лет, и вся индустрия ретаргетинга (Criteo, RTB House, Яндекс.РСЯ) построена на них.
- CDN и защита от ботов: Cloudflare защищает около 20% всех сайтов интернета, Akamai, DataDome, Qrator — все ставят свои куки для трекинга сессий и антифрода.
- Google, работая над Privacy Sandbox, пытается заменить third-party cookies на новые механизмы (Topics API, FLEDGE, Attribution Reporting). Успех пока сомнительный — рекламодатели не готовы отказываться от старого.
Альтернативы и конкуренты
-
LocalStorage / SessionStorage (браузерный API).
Плюсы: до 5–10 МБ, не отправляется автоматически на сервер (меньше трафика на каждый запрос).
Минусы: доступна из JavaScript всегда — уязвима для XSS сильнее, чем HttpOnly-кука. Не работает для «нативной» аутентификации по HTTP, надо руками подмешивать в заголовки. -
JWT в заголовке Authorization (обычно в мобильных приложениях и SPA).
Плюсы: не отправляется автоматически, нет CSRF по определению, легко переиспользовать между сервисами через один и тот же токен.
Минусы: приложение должно само хранить и подмешивать в каждый запрос, отзыв конкретного токена нетривиален (нужен revocation list). -
URL-параметры сессии (
?sid=abc).
Плюсы: работает вообще без хранения на клиенте.
Минусы: сессия утекает в реферер, в логи веб-серверов, в закладки. В 2026 году почти нигде не используется в продовых сценариях — только для одноразовых токенов сброса пароля или подтверждения email. -
Fingerprinting (сборка «отпечатка» браузера — набор шрифтов, canvas-рендер, часовой пояс, версия WebGL).
Плюсы: работает без кук, обходит их удаление и режим инкогнито.
Минусы: этически спорно, законодательно преследуется в ЕС, легко ломается обновлениями браузера. Точность падает по мере унификации сред (Safari специально режет уникальность).
Когда НЕ стоит использовать
- Хранить в куке персональные данные, пароли, платёжные реквизиты. Потому что кука уходит на сервер при каждом запросе, часто логируется access-логами, попадает в дампы; и потому что это прямое нарушение GDPR/152-ФЗ. Максимум — непрозрачный идентификатор, всё остальное — на сервере.
- Хранить много данных. Больше 1–2 КБ на домен — уже плохо: каждая кука едет с каждым запросом, замедляет всё, забивает мобильный канал. У тебя есть жёсткий лимит 4 КБ на куку и ~50 кук на домен — переполнил, самое старое молча выкинется.
- Полагаться на third-party cookies для критической логики. Safari, Firefox их не отправляют. Chrome — под вопросом. Строить продукт на «догон-рекламе через сторонние куки» — значит терять аудиторию iPhone-пользователей (около 30% рынка в РФ и до 60% в США).
Никогда не выдавай сессионную куку без флагов HttpOnly и Secure на HTTPS-сайте. Одна забытая пара флагов = целый класс атак (XSS-угон сессии, sniffing на публичном Wi-Fi). Проверить свой сайт можно любым онлайн-сканером кук за 30 секунд.
Связанные понятия
- Session — концепция связного диалога «пользователь ↔ сервер», обычно реализуется поверх кук.
- JWT (JSON Web Token) — самонесущий подписанный токен, альтернатива серверным сессиям.
- CSRF (Cross-Site Request Forgery) — атака, использующая автоматическую отправку кук; SameSite её нейтрализует.
- XSS (Cross-Site Scripting) — впрыск чужого JavaScript в страницу; флаг HttpOnly защищает куку от кражи через XSS.
- Fingerprinting — идентификация пользователя без кук по набору признаков браузера.
- CORS (Cross-Origin Resource Sharing) — правило браузера, регулирующее межсайтовые запросы; для отправки кук в межсайтовых запросах нужен
credentials: 'include'иAccess-Control-Allow-Credentials: trueна сервере. - First-party vs Third-party — своя vs чужая кука; ключевое различие в приватности и в том, что первые выжили, а вторые вымирают.
Литература и источники
- RFC 6265 «HTTP State Management Mechanism», 2011 — действующий стандарт. Официально: datatracker.ietf.org/doc/html/rfc6265. Читать выборочно, там 37 страниц сухого текста.
- MDN Web Docs, раздел «HTTP cookies» — лучшее прикладное объяснение с примерами. Официально: developer.mozilla.org/ru/docs/Web/HTTP/Cookies.
- Википедия ru: «HTTP cookie» — база на русском, история и обзор атрибутов. ru.wikipedia.org/wiki/HTTP_cookie.
- OWASP «Session Management Cheat Sheet» — как правильно ставить куки для безопасной аутентификации. Искать в Google по запросу «OWASP session management cheat sheet».
- Google Privacy Sandbox — что предлагают взамен third-party cookies. privacysandbox.google.com. Читать, если работаешь с рекламой.
- Статьи про Safari ITP и Firefox ETP — контекст истории отмены third-party cookies. Искать в Google: «Safari ITP timeline» и «Firefox Enhanced Tracking Protection».
Где встретилось у меня
Вчера в работе над контекстным пулом Яндекс.Директа я думал, что достаточно ротировать IP через прокси, чтобы «вскрыть» весь пул подмен номеров. Реальность оказалась другой: контроль на одном IP с ротацией браузерных контекстов дал тот же прирост, что и на нескольких IP. Прозрение: ключ сессии в этом сценарии — не IP-адрес, а cookie. Каждый новый браузерный контекст = новая cookie = новый визит с точки зрения системы, вычерпывает пул. Ротация IP нужна только против антибот-троттлинга, не против самого пула.
Краткое резюме
- Кука — маленькая записка, которую сервер даёт браузеру, чтобы узнавать пользователя между запросами. Работает поверх HTTP, у которого своей памяти нет.
- Придумал Лу Монтулли в Netscape в 1994, чтобы работали корзины покупок. Действующий стандарт — RFC 6265 (2011).
- Атрибуты
Secure,HttpOnly,SameSite— базовая гигиена безопасности; без них куки крадут. - Third-party cookies (кроссдоменное отслеживание) вымирают: Safari и Firefox их выключили, Chrome тянет. Это меняет всю рекламную индустрию.
- Cookie ≠ Session ≠ LocalStorage: разные механизмы с разными свойствами. Не путать.