Что такое JWT и как его сгенерировать на Python

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

Ответ

JWT (JSON Web Token) — это открытый стандарт (RFC 7519) для создания компактных и самодостаточных токенов доступа. Они используются для безопасной передачи информации между сторонами в виде JSON-объекта.

Токен состоит из трех частей, разделенных точками: header.payload.signature.

  • Header (Заголовок): Содержит метаданные — тип токена (typ, обычно JWT) и используемый алгоритм подписи (alg, например, HS256 или RS256).
  • Payload (Полезная нагрузка): Содержит утверждения (claims) — информацию о пользователе (sub, user_id) и другие данные, например, время истечения срока действия токена (exp).
  • Signature (Подпись): Создается путем подписания закодированных header и payload с использованием секретного ключа. Подпись гарантирует, что данные токена не были изменены в пути.

Генерация JWT на Python с помощью PyJWT

Для создания токена необходимо установить библиотеку: pip install pyjwt.

import jwt
import datetime

# Секретный ключ. В реальном приложении должен храниться безопасно!
SECRET_KEY = "your-super-secret-key"

# Полезная нагрузка (payload)
payload = {
    'user_id': 123,
    'username': 'john.doe',
    # 'exp' (expiration time) - обязательное утверждение для безопасности
    'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=1),
    # 'iat' (issued at) - время создания токена
    'iat': datetime.datetime.utcnow()
}

# Кодирование токена
token = jwt.encode(payload, SECRET_KEY, algorithm="HS256")

print(f"Сгенерированный токен:n{token}")

# Декодирование (проверка) токена
try:
    decoded_payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
    print(f"nДекодированная нагрузка:n{decoded_payload}")
except jwt.ExpiredSignatureError:
    print("nСрок действия токена истек.")

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

  • Используйте надежный алгоритм (HS256 для симметричного шифрования, RS256 для асимметричного).
  • Всегда устанавливайте срок действия токена (exp), чтобы минимизировать риски при его компрометации.
  • Не храните секретный ключ в коде. Используйте переменные окружения или системы управления секретами.
  • Не включайте в payload конфиденциальные данные (пароли, личные ключи), так как он легко декодируется (не шифруется, а кодируется в Base64).