Где хранить JWT на клиенте: в localStorage или в cookie?
Аутентификация и сессии
Выбор зависит от угроз: токен в localStorage уязвим для XSS, токен в cookie требует защиты от CSRF.
localStorage
- Плюсы: просто, токен добавляется в
Authorizationвручную, CSRF не страшен. - Минус: любой скрипт на странице (XSS, зловредная зависимость) прочитает токен.
Cookie с HttpOnly
- Плюс: JavaScript токен не видит, кража через XSS затруднена.
- Минус: браузер отправляет cookie автоматически, значит, нужны
SameSiteи CSRF-токен.
Практичная схема
- Короткоживущий access-токен держать в памяти приложения.
- Refresh-токен хранить в
HttpOnly; Secure; SameSitecookie и обновлять через отдельный эндпоинт. - Ротировать refresh-токен при каждом обновлении и инвалидировать при подозрении на кражу.
Set-Cookie: refresh=...; HttpOnly; Secure; SameSite=Strict; Path=/auth/refreshКоротко для собеседования
Универсально безопасного места нет. Лучше всего держать access в памяти, а refresh в HttpOnly-cookie с ротацией.