Ответ
JWT-токен всегда хранится на стороне клиента. Существует три основных подхода к его хранению, каждый со своими компромиссами между удобством и безопасностью.
-
LocalStorage/SessionStorage- Как работает: Токен сохраняется в хранилище браузера и доступен через JavaScript.
- Плюсы: Простота реализации. Легко получить доступ к токену для отправки в заголовках
Authorization. - Минусы: Уязвимость к XSS-атакам (Cross-Site Scripting). Если злоумышленник сможет внедрить вредоносный JS-код на ваш сайт, он сможет украсть токен из
LocalStorage.
-
HttpOnlyCookie- Как работает: Сервер устанавливает токен в cookie с флагом
HttpOnly. Браузер автоматически отправляет cookie с каждым запросом на тот же домен. - Плюсы: Защита от XSS. Флаг
HttpOnlyзапрещает доступ к cookie из JavaScript, что делает кражу токена через XSS невозможной. - Минусы: Уязвимость к CSRF-атакам (Cross-Site Request Forgery). Поскольку браузер отправляет cookie автоматически, злоумышленник может заставить пользователя выполнить нежелательное действие на вашем сайте, если тот перейдет по вредоносной ссылке с другого сайта. Требуются дополнительные меры защиты (например,
SameSiteатрибут или CSRF-токены).
- Как работает: Сервер устанавливает токен в cookie с флагом
Рекомендации и лучшие практики:
Самым безопасным подходом на сегодняшний день считается использование HttpOnly cookie в связке с дополнительными мерами защиты:
- Флаг
Secure: Cookie будет отправляться только по HTTPS. - Атрибут
SameSite:SameSite=Strict: Cookie не будет отправлен ни с какими межсайтовыми запросами. Максимальная защита от CSRF.SameSite=Lax: Cookie отправляется при навигации на ваш сайт (например, по ссылке), но не при запросах от других сайтов (AJAX,<img>). Хороший баланс безопасности и удобства.
- Короткое время жизни Access-токена: Используйте короткоживущие access-токены (5-15 минут) и долгоживущие refresh-токены для их обновления. Refresh-токен также должен храниться в
HttpOnlycookie.