← Назад к вопросам
Как работает Cookie?
1.6 Junior🔥 191 комментариев
#JavaScript Core#Браузер и сетевые технологии
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Как работают Cookie в веб-приложениях
Основные концепции
Cookie — это небольшие текстовые файлы, которые браузер сохраняет на компьютере пользователя и отправляет серверу при каждом запросе. Они используются для сохранения состояния пользователя, настроек и аутентификации.
Отличие от других хранилищ:
- Автоматическая отправка на сервер с каждым HTTP запросом
- Ограниченный размер (обычно 4 KB на cookie)
- Дата истечения — можно установить, когда cookie автоматически удалится
- Доступ из JavaScript — можно читать и писать (кроме httpOnly cookies)
Как браузер и сервер работают с Cookie
// ШАГИ РАБОТЫ:
// 1. Сервер отправляет cookie в ответе
// HTTP Response Header:
// Set-Cookie: sessionId=abc123; Path=/; Max-Age=3600
// 2. Браузер сохраняет cookie в памяти/на диске
// (автоматически, без участия JavaScript)
// 3. При следующем запросе браузер отправляет cookie
// HTTP Request Header:
// Cookie: sessionId=abc123
// 4. Сервер проверяет cookie и аутентифицирует пользователя
Создание и чтение Cookie из JavaScript
// СОЗДАНИЕ (запись в document.cookie)
document.cookie = "username=John; path=/; max-age=3600";
document.cookie = "theme=dark; expires=" + new Date(2025, 11, 31).toUTCString();
// Каждое присваивание ДОБАВЛЯЕТ новый cookie (не перезаписывает)
// ЧТЕНИЕ
console.log(document.cookie);
// Результат: "username=John; theme=dark; otherCookie=value"
// Парсинг cookie
function getCookie(name) {
const nameEQ = name + "=";
const cookies = document.cookie.split(';');
for (let cookie of cookies) {
cookie = cookie.trim();
if (cookie.indexOf(nameEQ) === 0) {
return decodeURIComponent(cookie.substring(nameEQ.length));
}
}
return null;
}
const username = getCookie("username"); // "John"
// УДАЛЕНИЕ (установка max-age=0)
document.cookie = "username=; max-age=0; path=/";
Параметры Cookie
// Полная синтаксис для установки cookie
document.cookie = "name=value; " +
"path=/; " + // Путь, где доступен cookie (по умолчанию текущий путь)
"domain=example.com; " + // Домен, где доступен (по умолчанию текущий домен)
"max-age=3600; " + // Время жизни в секундах
"expires=Wed, 31 Dec 2025 23:59:59 UTC; " + // Альтернатива max-age
"secure; " + // Отправлять только по HTTPS
"samesite=Strict" // Защита от CSRF (Strict, Lax, None)
// ПРИМЕРЫ:
// Сессионный cookie (удаляется при закрытии браузера)
document.cookie = "sessionId=xyz789; path=/";
// Persistent cookie (живёт месяц)
document.cookie = "userId=123; max-age=2592000; path=/";
// Secure cookie (только HTTPS)
document.cookie = "token=secret; secure; samesite=Strict";
HttpOnly и Secure флаги
// HttpOnly флаг — НЕВОЗМОЖНО установить из JavaScript
// Только сервер может установить при отправке ответа
// Set-Cookie: sessionId=abc123; HttpOnly; Path=/
// Результат: JavaScript НЕ может прочитать этот cookie
// console.log(document.cookie) // не содержит sessionId
// Но сервер получит его в Cookie: sessionId=abc123
// ПРЕИМУЩЕСТВА HttpOnly:
// - Защита от XSS атак (JavaScript не может украсть cookie)
// - Используется для аутентификации и чувствительных данных
// Secure флаг
// Set-Cookie: token=value; Secure; Path=/
// Cookie отправляется ТОЛЬКО по HTTPS, не по HTTP
SameSite атрибут (защита от CSRF)
// SameSite=Strict (самый строгий)
// Cookie отправляется ТОЛЬКО на тот же сайт
// Даже переход по ссылке с другого сайта не отправит cookie
// SameSite=Lax (по умолчанию в современных браузерах)
// Cookie отправляется:
// - При запросах с того же сайта
// - При переходе по ссылкам (GET запросы)
// - НО НЕ при POST/PUT/DELETE с другого сайта
// SameSite=None (требует Secure flag)
// Cookie отправляется всегда
// Нужен для cross-origin requests (API от другого домена)
// Set-Cookie: token=value; SameSite=None; Secure
// ПРИМЕР CSRF атаки БЕЗ SameSite:
// 1. Юзер залогинен на bank.com (есть sessionId cookie)
// 2. Юзер открывает malicious.com
// 3. malicious.com отправляет POST к bank.com/transfer
// 4. Браузер автоматически отправляет sessionId cookie
// 5. Перевод денег выполняется от имени юзера!
// РЕШЕНИЕ: Set-Cookie: sessionId=abc; SameSite=Lax
// Теперь malicious.com не может отправить POST с cookie
Практические примеры использования
// АУТЕНТИФИКАЦИЯ (на практике используй HttpOnly cookies!)
// Сервер отправляет:
// Set-Cookie: authToken=eyJhbGc...; HttpOnly; Secure; SameSite=Strict; Max-Age=86400
// Браузер автоматически отправляет при каждом запросе
fetch('https://api.example.com/user', {
credentials: 'include' // ВАЖНО: отправлять cookies для cross-origin
})
// СОХРАНЕНИЕ НАСТРОЕК (НЕ критичные данные)
document.cookie = `theme=${selectedTheme}; max-age=${30*24*60*60}; path=/`;
document.cookie = `language=en; max-age=${30*24*60*60}; path=/`;
// ОТСЛЕЖИВАНИЕ (analytics cookies)
// Сервер может отправлять tracking cookie
// Set-Cookie: _ga=GA1.2.123456789.1234567890
Cookie vs LocalStorage vs SessionStorage
// COOKIE
// + Автоматически отправляется на сервер
// + Может быть HttpOnly (защита от XSS)
// - Ограничение размера (4 KB)
// - Отправляется с каждым запросом (overhead)
// Использовать для: аутентификация, сессии
// LocalStorage
// + Больше места (5-10 MB)
// + Не отправляется на сервер автоматически
// - Уязвим для XSS (JavaScript может прочитать)
// - Сохраняется между сессиями
// Использовать для: пользовательские настройки, тема
// SessionStorage
// + Как LocalStorage, но удаляется при закрытии вкладки
// - Не доступен между вкладками
// Использовать для: временные данные в текущей сессии
// РЕКОМЕНДАЦИЯ:
const isHttpOnly = true; // аутентификация
if (isHttpOnly) {
// сервер отправляет Set-Cookie: token=...; HttpOnly
} else {
// для некритичных данных используй localStorage
localStorage.setItem('theme', 'dark');
}
Отладка Cookie в браузере
// Chrome DevTools > Application > Cookies
// Firefox DevTools > Storage > Cookies
// Или из консоли:
console.log(document.cookie);
// Все ли cookies отправляются на сервер?
// Network tab > выбрать запрос > Headers > Cookie
// Проверить флаги cookie
// Application > Cookies > выбрать cookie
// Увидишь: Name, Value, Domain, Path, Secure, HttpOnly, SameSite, Max-Age
Итог
Cookie — механизм сохранения состояния между запросами браузера и сервера:
- Сервер отправляет
Set-Cookieв ответе - Браузер сохраняет cookie
- Браузер отправляет cookie с каждым запросом
- Сервер проверяет и использует cookie
Для безопасности:
- HttpOnly — защита от XSS
- Secure — только HTTPS
- SameSite=Lax/Strict — защита от CSRF
Для некритичных данных используй localStorage вместо cookie.