Ответ
JWT (JSON Web Token) — это открытый стандарт (RFC 7519) для создания компактных и самодостаточных токенов доступа. Они используются для безопасной передачи информации между сторонами в виде JSON-объекта.
Токен состоит из трех частей, разделенных точками: header.payload.signature.
- Header (Заголовок): Содержит метаданные — тип токена (
typ, обычноJWT) и используемый алгоритм подписи (alg, например,HS256илиRS256). - Payload (Полезная нагрузка): Содержит утверждения (claims) — информацию о пользователе (
sub,user_id) и другие данные, например, время истечения срока действия токена (exp). - Signature (Подпись): Создается путем подписания закодированных
headerиpayloadс использованием секретного ключа. Подпись гарантирует, что данные токена не были изменены в пути.
Генерация JWT на Python с помощью PyJWT
Для создания токена необходимо установить библиотеку: pip install pyjwt.
import jwt
import datetime
# Секретный ключ. В реальном приложении должен храниться безопасно!
SECRET_KEY = "your-super-secret-key"
# Полезная нагрузка (payload)
payload = {
'user_id': 123,
'username': 'john.doe',
# 'exp' (expiration time) - обязательное утверждение для безопасности
'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=1),
# 'iat' (issued at) - время создания токена
'iat': datetime.datetime.utcnow()
}
# Кодирование токена
token = jwt.encode(payload, SECRET_KEY, algorithm="HS256")
print(f"Сгенерированный токен:n{token}")
# Декодирование (проверка) токена
try:
decoded_payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
print(f"nДекодированная нагрузка:n{decoded_payload}")
except jwt.ExpiredSignatureError:
print("nСрок действия токена истек.")
Ключевые правила безопасности:
- Используйте надежный алгоритм (
HS256для симметричного шифрования,RS256для асимметричного). - Всегда устанавливайте срок действия токена (
exp), чтобы минимизировать риски при его компрометации. - Не храните секретный ключ в коде. Используйте переменные окружения или системы управления секретами.
- Не включайте в payload конфиденциальные данные (пароли, личные ключи), так как он легко декодируется (не шифруется, а кодируется в Base64).