FlawOpen

flawopen.com/Справочник/JWT против cookie HttpOnly

JWT в localStorage или cookie HttpOnly: что безопаснее?

Руководство по аутентификации
Краткий ответ

Для многих веб-приложений хорошей отправной точкой служит сессия под управлением сервера, передаваемая в cookie с атрибутом HttpOnly. JavaScript не может прочитать такую cookie, что затрудняет извлечение токена, но не нейтрализует XSS: внедрённый код того же источника всё ещё может отправлять аутентифицированные запросы и читать доступные странице данные.

Компромиссы безопасности

Хранение / передачаРиск XSSПоведение при CSRFОтзыв
localStorage bearer tokenJavaScript того же источника может прочитать токен; XSS может украсть его или действовать от имени пользователя.Не добавляется автоматически к межсайтовым запросам; XSS и CSRF на стороне клиента остаются рисками.Самодостаточный JWT может оставаться действительным до истечения срока без проверки отзыва.
HttpOnly cookieJavaScript не может прочитать значение; XSS всё ещё может отправлять аутентифицированные запросы.Отправляется автоматически по правилам cookie; SameSite — лишь один уровень защиты CSRF.Непрозрачную сессию можно отозвать на сервере; JWT в cookie требует отдельной политики отзыва.

Рекомендуемая архитектура

Разделяйте формат токена, хранение и состояние сессии

JWT — формат токена, а localStorage и cookie — способы хранения и передачи данных браузером. JWT можно хранить любым из этих способов. Непрозрачный идентификатор сессии в cookie обычно указывает на состояние, хранящееся на сервере. «JWT или cookie» — не прямой выбор между равнозначными вариантами.

Что меняет каждый вариант

Браузер не добавляет значения localStorage автоматически к межсайтовым запросам, но XSS того же источника может прочитать bearer-токен или действовать через приложение. Cookie отправляются по правилам браузера; HttpOnly скрывает значение от JavaScript, но не мешает внедрённому коду пользоваться страницей с активной сессией. SameSite=Lax — один уровень защиты CSRF, а не полная гарантия: важны переходы верхнего уровня с безопасными методами и запросы same-site. Не меняйте состояние через GET и применяйте подходящую защиту CSRF, например проверенные токены и/или проверку Origin.

Отзыв зависит от состояния сервера и проверки токена, а не от места хранения. Серверную сессию можно сделать недействительной, удалив её запись. Самодостаточный JWT может приниматься до истечения срока без проверки отзыва; короткий срок уменьшает это окно, но не устраняет его.

Практический вариант

Источники и дополнительное чтение

См. также Межсайтовая подделка запросов (CSRF, CWE-352): как работает и как предотвратить — flawopen.com Next.js Server Actions CSRF: Origin и безопасная настройка Заменяет ли SameSite=Strict CSRF-токены? CSRF-токен для GET: когда он нужен?