Ответ
JWT (JSON Web Token) — это открытый стандарт (RFC 7519) для создания токенов доступа, которые в компактном и самодостаточном виде удостоверяют информацию (claims) о пользователе или системе. В распределенных системах JWT решает проблему безопасной передачи контекста аутентификации и авторизации между сервисами без необходимости хранить состояние сессии на сервере.
Токен состоит из трех частей, разделенных точками: Header, Payload и Signature.
Ключевые задачи, решаемые с помощью JWT:
- Stateless-аутентификация: Сервис, получивший токен, может проверить его подлинность с помощью цифровой подписи, не обращаясь к центральному хранилищу сессий. Это упрощает горизонтальное масштабирование.
- Авторизация: В
payloadтокена можно хранить данные о правах и ролях пользователя (claims). Любой микросервис, доверяющий издателю токена, может использовать эти данные для контроля доступа. - Безопасное межсервисное взаимодействие: Один сервис может сгенерировать токен для пользователя, а другие сервисы могут доверять этому токену и обслуживать запросы на его основании.
Пример генерации и верификации токена на Python с PyJWT:
import jwt
import datetime
# Секретный ключ, известный только доверенным сервисам
SECRET_KEY = "your-super-secret-key"
# Данные для включения в токен (payload)
payload = {
'user_id': 123,
'role': 'admin',
'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=1) # Срок жизни токена
}
# 1. Генерация токена
token = jwt.encode(payload, SECRET_KEY, algorithm="HS256")
print(f"Generated Token: {token}")
# 2. Верификация и декодирование токена на другом сервисе
try:
decoded_payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
print(f"Decoded Payload: {decoded_payload}")
except jwt.ExpiredSignatureError:
print("Token has expired!")
except jwt.InvalidTokenError:
print("Invalid token!")
Важно помнить: JWT по умолчанию подписан, но не зашифрован. Не храните в payload конфиденциальные данные без дополнительного шифрования (JWE).