Как работает механизм обновления пары Access и Refresh токенов?

«Как работает механизм обновления пары Access и Refresh токенов?» — вопрос из категории Безопасность, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Процесс обновления токенов (Token Refresh Flow) — это стандартный механизм в системах аутентификации (например, OAuth 2.0), позволяющий клиенту получать новый Access Token, не запрашивая у пользователя логин и пароль заново.

Алгоритм работы:

  1. Клиент отправляет запрос на специальный эндпоинт (например, /token/refresh), передавая свой валидный Refresh Token.
  2. Сервер валидирует Refresh Token: проверяет его подпись, срок действия и убеждается, что он не был отозван или уже использован.
  3. В случае успеха сервер генерирует новую пару токенов: свежий Access Token с коротким сроком жизни (минуты) и, как правило, новый Refresh Token.
  4. Сервер аннулирует старый Refresh Token и возвращает новую пару токенов клиенту, который сохраняет их для дальнейших запросов.

Пример псевдокода на стороне сервера:

def refresh_token_pair(old_refresh_token: str):
    # 1. Найти и проверить токен в базе данных
    user_id = validate_and_get_user_id(old_refresh_token)
    if not user_id:
        # Если токен невалиден или отозван, выбрасываем ошибку
        raise InvalidTokenError("Invalid or expired refresh token")

    # 2. Аннулировать старый токен
    revoke_refresh_token(old_refresh_token)

    # 3. Сгенерировать новую пару
    new_access_token = create_access_token(user_id)
    new_refresh_token = create_refresh_token(user_id)

    # 4. Сохранить новый refresh токен и вернуть оба клиенту
    save_refresh_token(new_refresh_token, user_id)

    return {
        'access_token': new_access_token,
        'refresh_token': new_refresh_token
    }

Ключевые аспекты безопасности:

  • Ротация (Rotation): При каждом обновлении выдается новый Refresh Token, а старый аннулируется. Это мера против кражи токена.
  • Одноразовость: Использованный Refresh Token не должен быть валиден для повторного использования.
  • Безопасное хранение: Refresh Token — это долгоживущий ключ, он должен храниться на клиенте максимально безопасно (например, в httpOnly cookie).