Что представляет собой JWT и какова его структура

Ответ

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

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

  1. Header (Заголовок). Содержит метаданные: тип токена (typ, обычно JWT) и используемый алгоритм подписи (alg, например, HS256 или RS256).
    {"alg": "HS256", "typ": "JWT"}
  2. Payload (Полезная нагрузка). Содержит утверждения (claims) — информацию о пользователе и дополнительные данные. Существуют зарегистрированные утверждения (iss, exp, sub), публичные и приватные.
    {"sub": "1234567890", "name": "John Doe", "iat": 1516239022}
  3. Signature (Подпись). Используется для проверки, что токен не был изменен. Создается путем подписания закодированных Header и Payload с использованием секрета или пары ключей (для HS256 или RS256 соответственно).

Пример создания JWT на Python с PyJWT:

import jwt
import datetime

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

# Данные для токена
payload = {
    "user_id": 123,
    "exp": datetime.datetime.utcnow() + datetime.timedelta(hours=1), # Срок жизни - 1 час
    "iat": datetime.datetime.utcnow() # Время создания
}

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

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

Ключевое преимущество JWT — это stateless аутентификация. Серверу не нужно хранить информацию о сессиях; вся необходимая информация содержится в самом токене, а его подлинность проверяется с помощью секрета.