Sobes.tech
Назад к вопросам
Junior — Middle
52

Каким образом можно отменить или аннулировать access token в системе?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Access token обычно живёт недолго и сам по себе «отзывается» не всегда, поэтому его аннулирование делают через серверную логику. На практике используют короткий TTL, отзыв refresh token, blacklist/denylist для токенов или смену секретов подписи. Конкретный способ зависит от того, JWT это или opaque token, и есть ли у системы состояние на сервере.

Определение:

Отменить access token — значит сделать так, чтобы он больше не давал доступ к защищённым ресурсам до истечения срока жизни. Для opaque token это часто делается через проверку статуса токена в хранилище. Для JWT, который самодостаточен, обычно применяют дополнительные механизмы: короткий срок жизни, список отозванных токенов, ротацию ключей или инвалидирование связанных refresh token.

Пример использования:

Например, пользователь нажал «Выйти» на всех устройствах. Сервер помечает его refresh token как отозванный и добавляет текущий access token в denylist до окончания его TTL. После этого новые токены по refresh token уже не выдаются, а старый access token перестаёт приниматься.

# Упрощённый пример проверки отозванного access token

REVOKED_TOKENS = {"token-123"}

def is_token_valid(token: str) -> bool:
    if token in REVOKED_TOKENS:
        return False
    return True

token = "token-123"
if is_token_valid(token):
    print("Access granted")
else:
    print("Token revoked")

Пояснение кода:

Код не требуется для понимания механизма, но пример показывает базовую идею по шагам: сначала сервер хранит список отозванных токенов, затем при каждом запросе проверяет, есть ли текущий токен в этом списке, и если есть — отклоняет доступ. В реальной системе вместо множества в памяти чаще используют Redis или другое хранилище с TTL, чтобы запись исчезала вместе с истечением срока жизни access token.

Ключевые моменты:

  • Access token часто не «удаляют», а делают недействительным для проверок на сервере.
  • Самый практичный способ — отзывать refresh token и выдавать access token с коротким временем жизни.
  • Для JWT обычно нужен denylist, ротация ключей или дополнительная серверная проверка.
  • Для opaque token аннулирование проще: достаточно изменить статус токена в хранилище.
  • На logout и при компрометации учётной записи нужно инвалидировать связанные токены.
  • Чем короче TTL access token, тем меньше окно риска при его утечке.