Где лучше хранить refresh token?
DOM и браузер
Refresh token лучше хранить в `HttpOnly` cookie с флагами `Secure` и `SameSite` — так он недоступен из JavaScript и защищён от кражи через XSS.
Почему HttpOnly cookie
- HttpOnly — cookie недоступна из
document.cookie, поэтому XSS-скрипт не сможет её украсть. Для долгоживущего refresh-токена это критично. - Secure — только по HTTPS (нельзя перехватить).
- SameSite=Lax/Strict — защита от CSRF (не отправляется при кросс-сайт запросах).
Set-Cookie: refreshToken=abc; HttpOnly; Secure; SameSite=Strict; Path=/auth/refreshПочему не localStorage
localStorage доступен любому JS на странице — при XSS токен украдут. Долгоживущий refresh-токен там — большой риск.
Дополнительные меры
- Ограничить Path — cookie шлётся только на эндпоинт обновления (
/auth/refresh). - Ротация — при каждом обновлении выдавать новый refresh, старый инвалидировать.
- Отзыв на сервере — хранить/проверять refresh-токены, уметь их отозвать.
Где access token
Access token — короткий, его держат в памяти (нужен в JS для заголовка Authorization).
Коротко для собеседования
Refresh token — в HttpOnly cookie с Secure и SameSite (недоступен JS, защита от XSS и CSRF), ограниченным Path и ротацией. Не в localStorage (XSS украдёт долгоживущий токен). Access token — в памяти.