Ответ
JWT-токен всегда хранится на стороне клиента. Существует три основных подхода к его хранению, каждый со своими компромиссами между удобством и безопасностью.
LocalStorage
/SessionStorage
- Как работает: Токен сохраняется в хранилище браузера и доступен через JavaScript.
- Плюсы: Простота реализации. Легко получить доступ к токену для отправки в заголовках
Authorization
. - Минусы: Уязвимость к XSS-атакам (Cross-Site Scripting). Если злоумышленник сможет внедрить вредоносный JS-код на ваш сайт, он сможет украсть токен из
LocalStorage
.
HttpOnly
Cookie- Как работает: Сервер устанавливает токен в 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-токен также должен храниться в
HttpOnly
cookie.