Как устроены cookie-сессии и токены в Authorization с точки зрения HTTP?
HTTP и HTTPS
При cookie-сессии браузер сам прикрепляет идентификатор к каждому запросу на домен — удобно, но открывает CSRF; токен в `Authorization` клиент добавляет явно, и чужой сайт не может отправить его от имени пользователя.
Поток cookie-сессии
POST /login→Set-Cookie: sid=…; HttpOnly; Secure; SameSite=Lax; Path=/.- Каждый следующий запрос несёт
Cookie: sid=…, сервер ищет сессию в хранилище вроде Redis. Это stateful, отзыв мгновенный.
Поток с Bearer-токеном
- Логин возвращает короткий access-токен (часто JWT на 5–15 минут) и refresh-токен.
- Клиент шлёт
Authorization: Bearer <token>, сервер проверяет подпись без обращения к БД. - Отозвать JWT до истечения без denylist нельзя — отсюда короткий TTL.
- Заголовок
Authorizationв кросс-origin запросе вызывает CORS preflight.
CSRF и SameSite
- Атака: страница злоумышленника отправляет форму на
bank.com/transfer, браузер прикладывает cookie жертвы. SameSite=Lax(в Chrome — поведение по умолчанию для cookie без атрибута) не отправляет cookie в кросс-сайтовых POST и фоновых запросах, но отправляет при переходе по ссылке.Strict— никогда кросс-сайт.NoneтребуетSecure.- «Сайт» — это регистрируемый домен:
evil.example.comдляapp.example.com— тот же сайт, SameSite не поможет. - Дополнительно: CSRF-токен, проверка
Origin, никаких изменений состояния на GET.
Коротко для собеседования
Выбор между cookie и Bearer-токеном — это выбор между автоматической отправкой с риском CSRF и явной отправкой с хранением токена в JS. Cookie-сессию легко отозвать, JWT — нет, поэтому ему дают короткий TTL; для cookie обязательны HttpOnly, Secure и SameSite.