Ответ
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).
Ответ 18+ 🔞
Так, слушай, про эти ваши JWT, ну, блядь, модная тема, все их в рот берут, а толком объяснить нихуя не могут. Ёпта, сейчас разжую.
JWT — это, типа, такая бумажка-пропуск, но в цифре. Компактная, самодост... самодостаточная, блядь, хуй выговоришь. Короче, в ней всё есть, что нужно. Три куска, разделённые точками: голова.тело.подпись.
- Голова (Header): Там написано, что это за хуйня (
typ: JWT) и каким секретным словом её подписывали (alg, типаHS256). Метаданные, короче. - Тело (Payload): А вот тут уже интереснее. Всё, что ты хочешь передать: кто пользователь (
user_id), его имя, и, что самое главное, блядь — когда эта хуйня сдохнет (exp). Без этого — вообще ни в какие ворота, сразу на помойку. - Подпись (Signature): А это, сука, самый сок. Берёшь закодированные голову и тело, берёшь секретный ключ (который надо спрятать так, чтобы мама не нашла), и это всё подписываешь. Если в пути кто-то твой токен попытается подделать — подпись не сойдётся, и ему сразу пизда.
Как сварганить эту хуйню на Python с PyJWT
Ставишь библиотеку: pip install pyjwt. Делов-то.
import jwt
import datetime
# Секретный ключ. НАХУЙ НЕ КЛАДИ ЕГО ПРЯМО В КОД, ЁБАНАРОТ! В переменные окружения!
SECRET_KEY = "your-super-secret-key"
# Что внутрь пихаем (payload)
payload = {
'user_id': 123,
'username': 'john.doe',
# 'exp' — СРОК ГОДНОСТИ, БЛЯДЬ! БЕЗ ЭТОГО ТОКЕН — ВЕЧНЫЙ, КАК ПИЗДА БАБУШКИ, И ЭТО ОПАСНО!
'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=1),
# 'iat' — когда испекли
'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). Не выёбывайся сnone, а то будет тебеpwned. - СРОК ДЕЙСТВИЯ (
exp) — ЭТО СВЯТОЕ! Представь, что это молоко. Без даты — страшно пить. - Секретный ключ — не твой член, чтобы всем показывать. Спрячь его в переменные окружения, в спец. хранилище, куда угодно, только не в код на GitHub, ебать твою совесть.
- В payload не пихай пароли, номера карт и фото своей жопы. Он же не шифруется, а просто кодируется в Base64. Любой долбоёб может его раскодировать и посмотреть. Подпись только от подделки защищает, а не от чтения.