Сессии, cookies и токены
↑ 5.5 Аутентификация и доступ: Keycloak, SSO, ACL · ← Предыдущая · → Следующая
Зачем это на собесе
Сессия против токена, флаги cookie и CSRF — классика веб-безопасности.
Объяснение
| Модель | Как работает | Плюсы | Минусы |
|---|---|---|---|
| Серверная сессия | сервер хранит состояние, клиенту отдаёт session_id в cookie | легко отозвать, данные на сервере | состояние на сервере (хранилище, масштабирование) |
| Токен (JWT, opaque) | клиент хранит токен и отправляет в заголовке/cookie | stateless, удобно для 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 (внедрение скрипта) → кража токена из localStorage | HttpOnly 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.
- Время жизни и «выйти везде» — продумайте.
Практика
- Настройте cookie-сессию с флагами и проверьте в DevTools.
- Воспроизведите CSRF на тестовом стенде и защитите.
- Сравните хранение токена в
localStorageи вHttpOnlycookie.
Вопросы с ответами
Сессия или токен?
Сессия проще отзывается и хранится на сервере; токены удобны для stateless API, но требуют защиты и стратегии отзыва.
Зачем
HttpOnlyиSameSite?
HttpOnlyзащищает от чтения cookie JS (XSS),SameSite— от CSRF.