Ответ
Наиболее безопасный способ — использование HttpOnly, Secure, SameSite cookies. Это защищает от атак межсайтового скриптинга (XSS) и межсайтовой подделки запросов (CSRF).
Пример установки защищённой куки на бэкенде (Node.js/Express):
res.cookie('auth_token', signedJwtToken, {
httpOnly: true, // Недоступна из JavaScript
secure: true, // Передаётся только по HTTPS
sameSite: 'strict', // Защита от CSRF
maxAge: 24 * 60 * 60 * 1000 // 1 день
});
Почему не LocalStorage/SessionStorage?
- Они доступны через JavaScript, что делает токен уязвимым при XSS-атаке.
- Злоумышленный скрипт может прочитать токен и отправить его на свой сервер.
Современный подход для SPA (Single Page Application):
- Access Token: Короткоживущий (минуты), хранится в памяти JavaScript (переменная, замыкание). При обновлении страницы теряется, и приложение запрашивает новый через специальный endpoint.
- Refresh Token: Долгоживущий, хранится строго в HttpOnly куке. Используется для получения новой пары access/refresh токенов.
Пример потока:
- Пользователь логинится, бэкенд устанавливает
refresh_tokenв HttpOnly куку и возвращаетaccess_tokenв теле ответа. - SPA сохраняет
access_tokenв памяти и использует для API-запросов. - Когда
access_tokenистекает, SPA отправляет запрос на/refresh(кукаrefresh_tokenотправится автоматически). - Бэкенд валидирует
refresh_tokenи выдаёт новую пару.
Этот подход минимизирует риски утечки долгоживущих учётных данных.