Что такое JWT и для чего он используется

Ответ

JWT (JSON Web Token) — это открытый стандарт (RFC 7519) для создания компактных и самодостаточных токенов, предназначенных для безопасной передачи информации между сторонами в виде JSON-объекта. Эти токены можно проверить и доверять им, так как они имеют цифровую подпись.

Структура JWT

Токен состоит из трех частей, разделенных точками (.): header.payload.signature

  1. Header (Заголовок): Содержит тип токена (JWT) и используемый алгоритм подписи (например, HS256).
  2. Payload (Полезная нагрузка): Содержит утверждения (claims) — информацию о пользователе (ID, роли) и метаданные (срок действия токена exp).
  3. 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. Просто, как три копейки, блядь.

  1. Header (Заголовок): Тут написано, что это JWT, и какой алгоритм подписи юзали — типа HS256 или там RS256. Без подписи это просто бумажка, никому не нужная.
  2. Payload (Полезная нагрузка): А вот тут самое вкусное лежит! Вся инфа о юзере: его айдишник, роли, когда токен сварганен (iat) и, главное — когда он сдохнет (exp). Это, блядь, чтоб вечно не жил, понимаешь? Срок годности, как у молока.
  3. 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("Опа, токен-то протух, дружок! Срок вышел, иди новый получай.")

Вот и вся магия, блядь. Сделал, подписал, отправил. Главное — ключ не потеряй и сроки действия не забудь, а то будет тебе волнение ебать, когда всё на проде встанет.