Куки: что это, зачем нужны и как работают

Что такое куки

Куки (cookies) — это небольшие текстовые файлы, которые веб‑сервер отправляет браузеру пользователя. Браузер сохраняет их и при последующих обращениях к тому же сайту возвращает серверу. Так сайт «узнаёт» пользователя и помнит его настройки и состояние между запросами.

Технически кука — это HTTP‑заголовок Set-Cookie от сервера и соответствующий заголовок Cookie в запросе от браузера. В куке обычно хранится пара «ключ — значение» и набор параметров: срок жизни, домен, путь, флаги безопасности.


Зачем нужны куки

У кук широкий спектр применений:

  • Авторизация и сессии. Это самая распространённая задача: после входа сервер создаёт сессию и кладёт в куку её идентификатор. При каждом запросе сервер по этому идентификатору понимает, кто именно обращается.
  • Сохранение состояния. Например, товары в корзине интернет‑магазина, прогресс в тесте, позиция прокрутки или выбранные фильтры.
  • Персонализация. Язык интерфейса, тема оформления (светлая/тёмная), настройки отображения элементов.
  • Аналитика и реклама. Сайты и сторонние сервисы используют куки, чтобы собирать статистику посещений, строить отчёты по поведению пользователей и показывать релевантную рекламу.
  • Безопасность. В некоторых случаях куки хранят токены доступа или специальные флаги, по которым сервер быстро проверяет права пользователя на выполнение действия.

Как создаются куки

На стороне сервера (PHP)

В PHP для установки куки используется функция setcookie(). Она формирует HTTP‑заголовок, который браузер воспримет как инструкцию сохранить куку.

setcookie(
    'session_id',
    'abc123xyz',
    time() + 3600,          // время жизни в секундах (1 час)
    '/',                    // путь: '/' — для всего сайта
    'example.com',          // домен
    true,                   // только по HTTPS (secure)
    true                    // недоступно через JavaScript (HttpOnly)
);

Важные правила:

  • setcookie() нужно вызывать до любого вывода в браузер (до echo, HTML, пробелов и т. п.). Иначе заголовки уже отправлены, и кука не установится.
  • Параметры secure и HttpOnly повышают безопасность. secure означает, что кука будет передаваться только по защищённому соединению, а HttpOnly запрещает доступ к куке из JavaScript — это защищает от кражи сессии при XSS‑атаках.

Современный вариант с массивом параметров (поддерживается в актуальных версиях PHP):

setcookie('session_id', 'abc123xyz', [
    'expires'   => time() + 86400,
    'path'      => '/',
    'domain'    => 'example.com',
    'secure'    => true,
    'httponly'  => true,
    'samesite'  => 'Lax',
]);

Параметр SameSite защищает от CSRF‑атак: Lax разрешает отправку куки при обычных переходах, но блокирует её в кросс‑доменных POST‑запросах; Strict ещё строже.

На стороне клиента (JavaScript)

В браузере куки можно читать и записывать через свойство document.cookie:

document.cookie = "username=ivan; path=/; domain=example.com; secure";

Чтение:

const cookies = document.cookie.split(';').reduce((acc, c) => {
  const [name, value] = c.trim().split('=').map(decodeURIComponent);
  acc[name] = value;
  return acc;
}, {});
console.log(cookies.username);

Важно: флаг HttpOnly нельзя установить из JavaScript. Он задаётся только сервером и делает куку невидимой для JS — это важный элемент защиты.

Для хранения нечувствительных данных (настроек интерфейса, состояния UI) часто используют localStorage или sessionStorage, но они не подходят для хранения токенов и идентификаторов сессий из‑за уязвимости к XSS.


Как сервер читает куки

На сервере (в PHP) все присланные браузером куки доступны в суперглобальном массиве $_COOKIE:

if (isset($_COOKIE['session_id'])) {
    $sessionId = $_COOKIE['session_id'];
    // далее сервер проверяет эту сессию в базе данных
}

Ключевое правило: никогда не доверяйте данным из кук. Браузер может быть подделан, куки могут быть изменены пользователем. Всегда проверяйте на сервере валидность сессии: существует ли она в БД, не истекла ли, соответствует ли ожидаемым параметрам.


Основные параметры кук и их смысл

  • Expires/Max-Age. Время жизни куки. Если не указано, кука считается сессионной и удаляется при закрытии браузера.
  • Path. Путь на сайте, для которого действительна кука. Например, /admin означает, что кука отправляется только для страниц в этой директории.
  • Domain. Домен (и, возможно, поддомены), для которых кука действительна.
  • Secure. Кука передаётся только по HTTPS.
  • HttpOnly. Запрещает доступ к куке через JavaScript.
  • SameSite. Ограничивает отправку куки в кросс‑доменных запросах. Значения: Strict, Lax, None (для None обязательно нужен Secure).

Безопасность кук

Чтобы сделать работу с куками безопасной, используют несколько практик:

  • HttpOnly. Защищает от кражи сессии через XSS.
  • Secure. Исключает передачу куки по незашифрованному каналу.
  • SameSite. Снижает риск CSRF‑атак.
  • Ограниченный срок жизни. Сессионные куки делают короткоживущими, а для функции «запомнить меня» используют отдельные механизмы с дополнительной проверкой.
  • Серверная валидация. Данные из куки — это входные данные от пользователя. Их всегда проверяют на сервере.
  • Хранение только идентификаторов. В куках не хранят пароли, хэши и чувствительные данные. Хранят только ID сессии, а все данные — на сервере.

Пример простой логики работы с сессией

  1. После успешного входа сервер генерирует случайный идентификатор сессии, сохраняет его в базе данных вместе с ID пользователя и временем истечения.
  2. Сервер отправляет куку с этим идентификатором, используя безопасные флаги (Secure, HttpOnly, SameSite).
  3. При каждом запросе сервер читает куку, ищет соответствующую сессию в БД, проверяет её актуальность и, если всё в порядке, авторизует пользователя.
  4. При выходе сервер удаляет запись сессии из БД и отправляет браузеру куку с нулевым сроком жизни, чтобы браузер её удалил.

Нюансы и частые проблемы

  • Порядок заголовков. В PHP setcookie() должен вызываться до любого вывода. Даже один пробел перед открывающим тегом <?php может привести к тому, что кука не установится.
  • Домен и поддомены. Куки для поддоменов нужно правильно настраивать: если домен указан как example.com, кука может не отправляться на sub.example.com и наоборот — зависит от правил браузера и настроек.
  • HTTPS и Mixed Content. Если сайт работает по HTTPS, а кука установлена без флага Secure, современные браузеры могут отказаться её отправлять или вообще блокировать.
  • Политика конфиденциальности и законодательство. Во многих странах использование кук регулируется законами (например, GDPR в ЕС, 152‑ФЗ в РФ). Часто требуется уведомлять пользователя и получать согласие на использование кук.

Куки — это базовый механизм веба, который позволяет сайтам сохранять состояние и узнавать пользователей между запросами. Они просты по формату, но требуют аккуратной работы: важно правильно устанавливать их на сервере, безопасно передавать и всегда проверять на стороне сервера. Грамотное использование параметров безопасности (HttpOnly, Secure, SameSite) и правильная архитектура (хранение в куках только идентификаторов, а не чувствительных данных) делают работу с куками надёжной и безопасной.

Добавить комментарий