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

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

Ответ

Валидация JWT-токена — это многоэтапный процесс, включающий проверку его структуры, подписи и срока действия.

  1. Проверка структуры: Токен должен состоять из трех частей, разделенных точками: header.payload.signature.

  2. Проверка подписи (Signature Verification): Это самый важный шаг. С помощью секретного ключа (который известен только серверу) и алгоритма, указанного в header (например, HS256), вычисляется подпись на основе header и payload. Если вычисленная подпись не совпадает с той, что в токене, токен считается недействительным (возможно, подделан).

  3. Проверка стандартных полей (Claims Verification): Проверяются поля из payload:

    • exp (Expiration Time): Срок действия токена не истек.
    • nbf (Not Before): Время, раньше которого токен недействителен.
    • iss (Issuer): Кто выпустил токен.
    • aud (Audience): Для кого предназначен токен.

Пример валидации на Python с PyJWT:

import jwt
import time

# Предположим, это токен от клиента
encoded_token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJleHAiOjE3MzUyMjkxMDB9.Yk9Tstdn8U2Gg7V2fM9S0sYt0Oqj5ofj68s3jYk4DkM"

SECRET_KEY = "your-secret-key"

try:
    # decode() автоматически проверяет подпись и срок действия (exp)
    decoded_payload = jwt.decode(
        encoded_token, 
        SECRET_KEY, 
        algorithms=["HS256"],
        # Дополнительно можно проверить 'audience' и 'issuer'
        # audience="my-app", 
        # issuer="my-auth-server"
    )
    print("Токен валиден:", decoded_payload)

except jwt.ExpiredSignatureError:
    print("Ошибка: срок действия токена истек.")
except jwt.InvalidSignatureError:
    print("Ошибка: неверная подпись токена.")
except jwt.InvalidTokenError as e:
    print(f"Ошибка: невалидный токен. {e}")

Важно: Никогда не используйте публичные онлайн-декодеры (вроде jwt.io) для проверки токенов, содержащих реальные или чувствительные данные.