Как бэкенд проверяет подлинность JWT?

Ответ

Бэкенд проверяет подлинность JSON Web Token (JWT) с помощью нескольких ключевых механизмов, обеспечивающих его целостность и достоверность:

  1. Проверка сигнатуры (Signature Verification): Это самый критичный шаг. Сервер использует секретный ключ (для алгоритмов HMAC, например, HS256) или публичный ключ (для алгоритмов RSA/ECDSA, например, RS256) для пересчета и сравнения сигнатуры токена. Если пересчитанная сигнатура не совпадает с той, что указана в токене, это означает, что токен был изменен или подделан.

    import jwt
    from jwt.exceptions import InvalidSignatureError, DecodeError
    
    secret_key = 'your-super-secret-key'
    token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c'
    
    try:
        # 'verify_signature=True' по умолчанию, но можно явно указать
        decoded_payload = jwt.decode(token, secret_key, algorithms=['HS256'], verify_signature=True)
        print("Токен действителен:", decoded_payload)
    except InvalidSignatureError:
        print("Ошибка: Неверная сигнатура токена.")
    except DecodeError as e:
        print(f"Ошибка декодирования токена: {e}")
    except Exception as e:
        print(f"Неизвестная ошибка: {e}")
  2. Проверка стандартных полей (Claims Validation): Бэкенд проверяет стандартные поля (claims) в полезной нагрузке токена, чтобы убедиться в его актуальности и соответствии ожиданиям:

    • exp (expiration time): Проверяет, не истек ли срок действия токена. Токен считается недействительным, если exp в прошлом.
    • nbf (not before): Убеждается, что токен не используется до указанного времени.
    • iss (issuer): Проверяет, кто выпустил токен, чтобы убедиться, что он пришел от доверенного источника.
    • aud (audience): Подтверждает, что токен предназначен для данного сервиса или приложения.
    • iat (issued at): Время выпуска токена, полезно для определения возраста токена.
  3. Проверка формата токена: JWT должен состоять из трех частей (заголовок, полезная нагрузка, сигнатура), разделенных точками, и каждая часть должна быть корректно закодирована в Base64 URL-safe. Неправильный формат указывает на повреждение или подделку.

  4. Проверка отозванных токенов (Revocation List / Blacklist): Для обеспечения дополнительной безопасности, особенно при выходе пользователя из системы или компрометации токена, бэкенд может проверять, не находится ли токен в списке отозванных (blacklist) или не был ли его jti (JWT ID) помечен как недействительный в базе данных.

  5. Проверка алгоритма (Algorithm Mismatch Protection): Сервер должен явно указывать, какие алгоритмы шифрования он ожидает. Это предотвращает атаки, при которых злоумышленник изменяет поле alg в заголовке токена на none, пытаясь обойти проверку сигнатуры.