Что такое JWT и для чего он используется

Ответ

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

Структура JWT

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

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

Ключевые преимущества:

  • Stateless (Отсутствие состояния на сервере): Вся необходимая для аутентификации информация хранится в самом токене. Серверу не нужно хранить сессии.
  • Безопасность: Подпись гарантирует целостность и подлинность данных.
  • Универсальность: Легко передается в HTTP-заголовках и работает в распределенных системах (микросервисы, SPA).

Пример создания токена на Python:

import jwt
from datetime import datetime, timedelta, timezone

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

# Данные, которые мы хотим поместить в токен
payload = {
    "sub": "1234567890", # Subject (ID пользователя)
    "name": "John Doe",
    "iat": datetime.now(tz=timezone.utc), # Issued at (время создания)
    "exp": datetime.now(tz=timezone.utc) + timedelta(minutes=30) # Expiration time
}

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

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