Ответ
JWT (JSON Web Token) — это открытый стандарт (RFC 7519) для создания компактных и самодостаточных токенов, предназначенных для безопасной передачи информации между сторонами в виде JSON-объекта. Эти токены можно проверить и доверять им, так как они имеют цифровую подпись.
Структура JWT
Токен состоит из трех частей, разделенных точками (.
):
header.payload.signature
- Header (Заголовок): Содержит тип токена (
JWT
) и используемый алгоритм подписи (например,HS256
). - Payload (Полезная нагрузка): Содержит утверждения (claims) — информацию о пользователе (ID, роли) и метаданные (срок действия токена
exp
). - 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("Срок действия токена истек")