Ответ
JWT (JSON Web Token) — это открытый стандарт (RFC 7519) для безопасной передачи информации между сторонами в виде компактного JSON-объекта. JWT-токены подписаны цифровой подписью, что гарантирует их аутентичность.
Токен состоит из трех частей, разделенных точками (.
):
- Header (Заголовок). Содержит метаданные: тип токена (
typ
, обычноJWT
) и используемый алгоритм подписи (alg
, например,HS256
илиRS256
).{"alg": "HS256", "typ": "JWT"}
- Payload (Полезная нагрузка). Содержит утверждения (claims) — информацию о пользователе и дополнительные данные. Существуют зарегистрированные утверждения (
iss
,exp
,sub
), публичные и приватные.{"sub": "1234567890", "name": "John Doe", "iat": 1516239022}
- 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
аутентификация. Серверу не нужно хранить информацию о сессиях; вся необходимая информация содержится в самом токене, а его подлинность проверяется с помощью секрета.