Вопрос проверяет понимание жизненного цикла refresh-токенов и того, зачем их хранить на сервере для безопасной аутентификации.
Refresh token — это долгоживущий credential, который позволяет клиенту получить новый access token без повторного ввода логина и пароля. Если хранить его только на клиенте, сервер теряет возможность управлять сессией: нельзя отозвать токен при выходе, смене пароля или подозрении на кражу. Поэтому на практике refresh token сохраняют в базе данных (или в Redis) в виде записи, привязанной к пользователю, устройству и сроку действия.
Сам токен в открытом виде хранить нежелательно. Обычно сохраняют его хеш (например, SHA-256), идентификатор пользователя, device id, дату создания и истечения, флаг отзыва. Так даже при утечке базы злоумышленник не получит рабочие токены.
// Пример записи в таблице refresh_tokens
{
id: "uuid",
userId: 42,
tokenHash: "sha256(...)",
deviceId: "web-chrome",
expiresAt: "2025-01-01T00:00:00Z",
revoked: false
}
// Проверка при обновлении токена
const record = await db.refreshTokens.findOne({
tokenHash: sha256(incomingToken),
revoked: false
});
if (!record || record.expiresAt < new Date()) throw new Error("Invalid token");
// ротация: удаляем старый, создаём новый
await db.refreshTokens.delete(record.id);
const newToken = issueRefreshToken(record.userId);Иногда refresh token делают самодостаточным JWT и не хранят в БД, но тогда теряется возможность отзыва. Компромисс — короткий срок жизни и чёрный список отозванных токенов. Для высоконагруженных систем хранение в Redis даёт быстрый доступ и TTL из коробки.
Итог: хранить refresh token в базе нужно, если требуется контроль сессий, отзыв и безопасность; это стандартная практика для production-аутентификации.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию