Сессии, cookies и токены

↑ 5.5 Аутентификация и доступ: Keycloak, SSO, ACL · ← Предыдущая · → Следующая

Обязательно~3 мин чтенияУровень: middle

Зачем это на собесе

Сессия против токена, флаги cookie и CSRF — классика веб-безопасности.

Объяснение

МодельКак работаетПлюсыМинусы
Серверная сессиясервер хранит состояние, клиенту отдаёт session_id в cookieлегко отозвать, данные на сервересостояние на сервере (хранилище, масштабирование)
Токен (JWT, opaque)клиент хранит токен и отправляет в заголовке/cookiestateless, удобно для API и микросервисовсложнее отзыв, риск при краже
Cookie-based tokenтокен в HttpOnly cookieнедоступен JS (защита от XSS-кражи)нужна защита от CSRF

Флаги cookie:

ФлагСмысл
HttpOnlyнедоступна из JS
Secureтолько HTTPS
SameSite=Lax/Strict/Noneограничение кросс-сайтовой отправки (CSRF)
Path, Domain, Max-Ageобласть и срок
__Host- префиксжёсткие ограничения (Secure, Path=/, без Domain)

Атаки и защита:

АтакаЗащита
XSS (внедрение скрипта) → кража токена из localStorageHttpOnly cookie, CSP, экранирование, санитайзинг
CSRF (запрос от чужого сайта с cookie)SameSite, CSRF-токены, проверка Origin, кастомные заголовки
Session fixationновая сессия после входа
ПерехватHTTPS, HSTS
Кража refresh-токенаротация, привязка к устройству, обнаружение повторного использования

Сценарии:

  • SPA + собственный бэкенд на том же сайте: сессионная cookie (HttpOnly; Secure; SameSite=Lax) — простой и надёжный вариант.
  • SPA + внешний API (другой origin): OIDC + токены; BFF-паттерн (Backend For Frontend), где токены хранит сервер, а браузеру выдаётся сессионная cookie — рекомендуется для повышенной безопасности.
await fetch("/api/orders", { credentials: "include" });        // отправка cookie

Нюансы и подводные камни

  • SameSite=None требует Secure.
  • CORS с credentials: конкретный origin, Allow-Credentials: true.
  • SameSite=Lax не защищает от CSRF для «безопасных» методов (GET) с побочными эффектами.
  • Сторонние cookie блокируются браузерами: влияет на встроенные виджеты и кросс-доменный SSO.
  • Время жизни и «выйти везде» — продумайте.

Практика

  1. Настройте cookie-сессию с флагами и проверьте в DevTools.
  2. Воспроизведите CSRF на тестовом стенде и защитите.
  3. Сравните хранение токена в localStorage и в HttpOnly cookie.

Вопросы с ответами

Связанные темы