Ответ
JWT (JSON Web Token) — это открытый стандарт (RFC 7519) для создания компактных и самодостаточных токенов, предназначенных для безопасной передачи информации между сторонами в виде JSON-объекта. Эти токены можно проверить и доверять им, так как они имеют цифровую подпись.
Структура JWT
Токен состоит из трех частей, разделенных точками (.):
header.payload.signature
- Header (Заголовок): Содержит тип токена (
JWT) и используемый алгоритм подписи (например,HS256). - Payload (Полезная нагрузка): Содержит утверждения (claims) — информацию о пользователе (ID, роли) и метаданные (срок действия токена
exp). - Signature (Подпись): Используется для проверки, что токен не был изменен. Создается путем подписи закодированных
headerиpayloadс использованием секрета.
Ключевые преимущества:
- Stateless (Отсутствие состояния на сервере): Вся необходимая для аутентификации информация хранится в самом токене. Серверу не нужно хранить сессии.
- Безопасность: Подпись гарантирует целостность и подлинность данных.
- Универсальность: Легко передается в HTTP-заголовках и работает в распределенных системах (микросервисы, SPA).
Пример создания токена на Python:
import jwt
from datetime import datetime, timedelta, timezone
# Секретный ключ должен храниться в безопасности
SECRET_KEY = "my-super-secret-key"
# Данные, которые мы хотим поместить в токен
payload = {
"sub": "1234567890", # Subject (ID пользователя)
"name": "John Doe",
"iat": datetime.now(tz=timezone.utc), # Issued at (время создания)
"exp": datetime.now(tz=timezone.utc) + timedelta(minutes=30) # Expiration time
}
# Кодирование токена
encoded_jwt = jwt.encode(payload, SECRET_KEY, algorithm="HS256")
print(encoded_jwt)
# Декодирование и проверка токена
try:
decoded_payload = jwt.decode(encoded_jwt, SECRET_KEY, algorithms=["HS256"])
print(decoded_payload)
except jwt.ExpiredSignatureError:
print("Срок действия токена истек") Ответ 18+ 🔞
Э, слушай, а вот эта ваша JWT-хуита — это, блядь, такая штука, чтоб между сервисами безопасно болтаться могла, как будто паспорт, только цифровой, нахуй. Открытый стандарт, RFC 7519, если тебе это о чём-то говорит, а если нет — да похуй.
Из чего эта мартышлюшка состоит
Токен этот — три куска, разделённых точками, вот так: header.payload.signature. Просто, как три копейки, блядь.
- Header (Заголовок): Тут написано, что это JWT, и какой алгоритм подписи юзали — типа
HS256или тамRS256. Без подписи это просто бумажка, никому не нужная. - Payload (Полезная нагрузка): А вот тут самое вкусное лежит! Вся инфа о юзере: его айдишник, роли, когда токен сварганен (
iat) и, главное — когда он сдохнет (exp). Это, блядь, чтоб вечно не жил, понимаешь? Срок годности, как у молока. - Signature (Подпись): А это, сука, защита от мудаков, которые захотят что-то внутри поменять. Берут закодированные header и payload, секретный ключ, и всё это дело подписывают. Если хоть одну букву тронул — подпись не сойдётся, и тебе пизда.
Чем это всё охуенно?
- Stateless (Без состояния): Серверу не надо, блядь, помнить каждый твой сеанс, как слон. Вся нужная хуйня уже внутри токена лежит. Отправил токен — и всё, свободен.
- Безопасность: Подпись, ёпта! Не подделаешь, если ключ не уворовал.
- Универсальность: Кинул его в заголовок
Authorization: Bearer <тут_твой_токен>— и пошло-поехало по всем твоим микросервисам. Красота, блядь!
Смотри, как на Python эту магию делают:
import jwt
from datetime import datetime, timedelta, timezone
# Секретный ключ — это святое! Храни его, как зеницу ока, а не в коде открыто, мудак!
SECRET_KEY = "my-super-secret-key"
# Что внутрь засунуть хотим
payload = {
"sub": "1234567890", # Айдишник пользователя (subject)
"name": "John Doe",
"iat": datetime.now(tz=timezone.utc), # Время создания (issued at)
"exp": datetime.now(tz=timezone.utc) + timedelta(minutes=30) # Время смерти (expiration)
}
# Вжух — и токен готов!
encoded_jwt = jwt.encode(payload, SECRET_KEY, algorithm="HS256")
print(encoded_jwt)
# А теперь проверим, не поддельный ли он
try:
decoded_payload = jwt.decode(encoded_jwt, SECRET_KEY, algorithms=["HS256"])
print(decoded_payload)
except jwt.ExpiredSignatureError:
print("Опа, токен-то протух, дружок! Срок вышел, иди новый получай.")
Вот и вся магия, блядь. Сделал, подписал, отправил. Главное — ключ не потеряй и сроки действия не забудь, а то будет тебе волнение ебать, когда всё на проде встанет.