Что такое Cookies в контексте веб-разработки?

«Что такое Cookies в контексте веб-разработки?» — вопрос из категории Сети, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Cookies (куки) — это небольшие фрагменты данных, которые сервер отправляет браузеру пользователя с помощью HTTP-заголовка Set-Cookie. Браузер сохраняет их локально и автоматически отправляет обратно на сервер с каждым последующим запросом к соответствующему домену. Это основной механизм для поддержания состояния (state) в протоколе HTTP, который по своей природе является stateless.

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

  • Аутентификация и сессии: Хранение идентификатора сессии (Session ID).
  • Персонализация: Сохранение пользовательских предпочтений (например, тема, язык).
  • Отслеживание: Аналитика и таргетированная реклама.

Ключевые атрибуты cookie, задаваемые сервером:

  • name и value: Ключ и данные.
  • expires / max-age: Срок жизни. Без них cookie становится "сессионным" и удаляется при закрытии браузера.
  • domain и path: Определяют, к каким запросам cookie будет прикрепляться.
  • secure: Cookie будет отправлен только по защищённому протоколу HTTPS.
  • httponly: Запрещает доступ к cookie через JavaScript (document.cookie), что критически важно для защиты от XSS-атак.
  • samesite: Защищает от CSRF-атак, ограничивая отправку cookie при межсайтовых запросах. Значения: Strict, Lax, None.

Пример работы на стороне сервера (Node.js/Express):

// Установка cookie
res.cookie('user_token', 'abc123xyz', {
    maxAge: 24 * 60 * 60 * 1000, // 1 день
    httpOnly: true,
    secure: process.env.NODE_ENV === 'production',
    sameSite: 'lax'
});

// Чтение cookie из входящего запроса
const userToken = req.cookies.user_token;

// Удаление cookie
res.clearCookie('user_token');

Важные ограничения:

  • Максимальный размер одного cookie — обычно 4 КБ.
  • Браузеры ограничивают количество cookie на один домен (обычно около 50).
  • Для хранения больших объёмов данных на клиенте следует использовать localStorage или sessionStorage.