Ответ
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 аутентификация. Серверу не нужно хранить информацию о сессиях; вся необходимая информация содержится в самом токене, а его подлинность проверяется с помощью секрета.