Что происходит с Access Token при обновлении Refresh Token?

Ответ

При обновлении Refresh Token реализуется механизм ротации токенов (Refresh Token Rotation), который является лучшей практикой для повышения безопасности.

Процесс выглядит следующим образом:

  1. Выпускается новая пара токенов. В ответ на запрос с валидным Refresh Token сервер генерирует и возвращает клиенту новый Access Token и новый Refresh Token.
  2. Старый 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 будет перехвачен, его можно будет использовать только один раз, что значительно снижает риски компрометации.