← Назад к вопросам

Что такое Cookie и зачем они используются? Что нельзя хранить в Cookie и почему?

1.3 Junior🔥 252 комментариев
#API и веб-протоколы#Безопасность

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Cookie

Cookie (куки) — это небольшие текстовые данные (до 4 КБ), которые сервер отправляет браузеру пользователя, и которые браузер автоматически возвращает обратно на сервер при каждом последующем запросе. Они являются фундаментальным механизмом для поддержания сессионного состояния в изначально статусном протоколе HTTP.

В контексте PHP работа с куками осуществляется через суперглобальный массив $_COOKIE (для чтения) и функцию setcookie() (для установки):

// Установка куки с именем "user", значением "John" и сроком жизни 1 час
setcookie("user", "John", time() + 3600, "/", "example.com", true, true);

// Чтение значения куки
if (isset($_COOKIE['user'])) {
    echo "Привет, " . htmlspecialchars($_COOKIE['user']);
}

Зачем используются Cookie

Основные цели использования куки:

  • Аутентификация и сессии. Самый частый случай — хранение идентификатора сессии (Session ID). После успешного входа сервер создает уникальный ID, записывает его в куки у браузера. При следующих запросах браузер отправляет этот ID, и сервер по нему находит данные сессии (например, в Redis или файле) и «узнает» пользователя.

    // Старт сессии (использует куки по умолчанию)
    session_start();
    $_SESSION['authorized'] = true;
    
  • Персонализация. Запоминание предпочтений пользователя: язык интерфейса, тема оформления, регион, элементы макета.

  • Отслеживание. Используются аналитическими системами (Google Analytics) и рекламными сетями для сбора данных о поведении пользователя между сайтами (треккинговые/рекламные куки).

  • Работа корзины покупок. В простых реализациях состояние корзины может храниться прямо в куках, что не требует работы с базой данных до момента оформления заказа.

  • Запоминание состояния интерфейса. Например, свернут или развернут какой-либо блок на странице.

Что нельзя хранить в Cookie и почему

Куки являются небезопасным хранилищем, так как они:

  1. Хранятся на стороне клиента и могут быть легко просмотрены, изменены или удалены пользователем.
  2. Передаются по сети с каждым HTTP-запросом (даже если используется HTTPS, сам факт передачи увеличивает объем трафика).
  3. Уязвимы к атакам XSS (Cross-Site Scripting) и CSRF (Cross-Site Request Forgery).

Исходя из этого, в куках категорически нельзя хранить:

1. Конфиденциальная информация

  • Пароли (даже в хэшированном виде). Хэши паролей предназначены для сравнения на сервере, их утечка в куках упрощает атаку перебором.
  • Персональные данные (PII) в открытом виде: номера телефонов, адреса электронной почты, паспортные данные. Это нарушение законодательства о защите данных (например, GDPR).
  • Платежные реквизиты: номера банковских карт, CVV-коды. Соответствие стандарту PCI DSS напрямую запрещает такое хранение.

2. Критичные данные для работы приложения

  • Ключи API, токены доступа к внутренним сервисам. Злоумышленник, перехвативший такие куки, получит прямой доступ к вашим ресурсам.

3. Большие объемы данных

  • Куки имеют жесткое ограничение в 4 КБ на один домен/путь. Попытка записи большего объема приведет к отбрасыванию данных. Для хранения больших данных (например, содержимого корзины с множеством товаров) следует использовать сессии на сервере или локальное хранилище браузера (LocalStorage).

4. Данные, требующие валидации и целостности

  • Роли пользователей, уровень доступа. Если хранить это в куках, злоумышленник может легко изменить значение с "role": "user" на "role": "admin" и получить несанкционированные привилегии. Такие данные должны храниться и проверяться исключительно на стороне сервера в рамках сессии.

Пример уязвимости и правильной альтернативы

НЕВЕРНО (опасно):

// Никогда так не делайте! Роль хранится в куке и подконтрольна пользователю.
setcookie("user_role", "administrator", time()+3600);
// В коде:
if ($_COOKIE['user_role'] === 'administrator') {
    grantAdminAccess(); // Пользователь может сам задать себе эту роль!
}

ВЕРНО:

// Сохраняем в куке только криптографически стойкий случайный ID сессии
session_start();
// А все данные (включая роль) храним на сервере, в массиве $_SESSION
$_SESSION['user_id'] = 123;
$_SESSION['user_role'] = 'administrator'; // Это значение из БД, недоступно для прямого редактирования клиентом.
// Проверка на сервере:
if ($_SESSION['user_role'] === 'administrator') {
    grantAdminAccess();
}

Вывод

Cookie — это идеальный инструмент для хранения неконфиденциальных идентификаторов (например, Session ID) и настроек, которые не нанесут ущерба при компрометации. Они являются «ключами», а не «сейфами». Все важные данные, на которые ссылается этот ключ, должны надежно храниться и проверяться на стороне сервера. Современная практика также диктует обязательное использование флагов Secure (передача только по HTTPS), HttpOnly (защита от XSS) и SameSite (защита от CSRF) при установке кук, критичных для безопасности.

Что такое Cookie и зачем они используются? Что нельзя хранить в Cookie и почему? | PrepBro