Ответ
При обновлении Refresh Token реализуется механизм ротации токенов (Refresh Token Rotation), который является лучшей практикой для повышения безопасности.
Процесс выглядит следующим образом:
- Выпускается новая пара токенов. В ответ на запрос с валидным Refresh Token сервер генерирует и возвращает клиенту новый
Access Token
и новыйRefresh Token
. - Старый Refresh Token инвалидируется. Использованный Refresh Token немедленно помечается как недействительный и больше не может быть использован. Это защищает от атак повторного использования (replay attacks).
Что происходит со старым Access Token?
Существует две основные стратегии:
- Немедленная инвалидация (более безопасно): Старый
Access Token
также отзывается. Это самый надежный подход, но он требует более сложной инфраструктуры для отслеживания активных токенов (например, через allowlist/denylist). - Действие до истечения срока (проще в реализации): Старый
Access Token
продолжает действовать до окончания своего короткого срока жизни (TTL, обычно 5-15 минут).
Пример логики на стороне сервера (псевдокод):
def refresh_token_flow(old_refresh_token: str):
# 1. Найти и проверить токен в базе данных
token_record = db.find_refresh_token(old_refresh_token)
if not token_record or token_record.is_used:
# Если токен не найден или уже использован - это подозрительная активность.
# В этом случае рекомендуется отозвать всю сессию пользователя.
raise InvalidTokenError("Refresh token is invalid or has been used")
# 2. Пометить старый токен как использованный
db.mark_token_as_used(old_refresh_token)
# 3. Сгенерировать новую пару токенов
user_id = token_record.user_id
new_access_token = create_access_token(user_id)
new_refresh_token = create_refresh_token(user_id)
# 4. Сохранить новый refresh token в БД
db.save_refresh_token(new_refresh_token, user_id)
return {
"access_token": new_access_token,
"refresh_token": new_refresh_token
}
Этот механизм гарантирует, что даже если Refresh Token будет перехвачен, его можно будет использовать только один раз, что значительно снижает риски компрометации.