Что такое куки
Куки (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 сессии, а все данные — на сервере.
Пример простой логики работы с сессией
- После успешного входа сервер генерирует случайный идентификатор сессии, сохраняет его в базе данных вместе с ID пользователя и временем истечения.
- Сервер отправляет куку с этим идентификатором, используя безопасные флаги (
Secure,HttpOnly,SameSite). - При каждом запросе сервер читает куку, ищет соответствующую сессию в БД, проверяет её актуальность и, если всё в порядке, авторизует пользователя.
- При выходе сервер удаляет запись сессии из БД и отправляет браузеру куку с нулевым сроком жизни, чтобы браузер её удалил.
Нюансы и частые проблемы
- Порядок заголовков. В PHP
setcookie()должен вызываться до любого вывода. Даже один пробел перед открывающим тегом<?phpможет привести к тому, что кука не установится. - Домен и поддомены. Куки для поддоменов нужно правильно настраивать: если домен указан как
example.com, кука может не отправляться наsub.example.comи наоборот — зависит от правил браузера и настроек. - HTTPS и Mixed Content. Если сайт работает по HTTPS, а кука установлена без флага
Secure, современные браузеры могут отказаться её отправлять или вообще блокировать. - Политика конфиденциальности и законодательство. Во многих странах использование кук регулируется законами (например, GDPR в ЕС, 152‑ФЗ в РФ). Часто требуется уведомлять пользователя и получать согласие на использование кук.
Куки — это базовый механизм веба, который позволяет сайтам сохранять состояние и узнавать пользователей между запросами. Они просты по формату, но требуют аккуратной работы: важно правильно устанавливать их на сервере, безопасно передавать и всегда проверять на стороне сервера. Грамотное использование параметров безопасности (HttpOnly, Secure, SameSite) и правильная архитектура (хранение в куках только идентификаторов, а не чувствительных данных) делают работу с куками надёжной и безопасной.

