Из каких частей состоит JWT токен?

Ответ

JWT (JSON Web Token) состоит из трёх частей, разделённых точками:

1. Header (Заголовок)

  • Содержит метаданные: тип токена (typ: "JWT") и алгоритм подписи (alg: "HS256", "RS256").
  • Кодируется в Base64URL.
  • Пример: {"alg": "HS256", "typ": "JWT"}.

2. Payload (Полезная нагрузка)

  • Содержит утверждения (claims) о пользователе и данные: идентификатор (sub), срок действия (exp), издатель (iss).
  • Кодируется в Base64URL.
  • Пример: {"sub": "123", "name": "John", "exp": 1516239022}.

3. Signature (Подпись)

  • Гарантирует целостность токена. Создается путем подписи (хеширования) сконкатенированных и закодированных header и payload с использованием секретного ключа или приватного ключа.
  • Пример для HMAC-SHA256:
    HMACSHA256(
      base64UrlEncode(header) + "." + base64UrlEncode(payload),
      secret
    )

Итоговый формат: header.payload.signature

Пример токена:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjMiLCJuYW1lIjoiSm9obiJ9.ABC123...

Ответ 18+ 🔞

А, слушай, смотри, сейчас я тебе про JWT так расскажу, что ты, блядь, наизусть выучишь, а потом ещё соседям объяснять будешь, пока они не попросят заткнуться. Это ж не просто какая-то хуйня, это, типа, пропуск в закрытый клуб, но для твоего API.

Представь себе бутерброд, только из трёх слоёв, и каждый слой — отдельная пиздец-история. И они все склеены точками, вот так: слой1.слой2.слой3.

1. Первый кусок — это шапка (Header). Ну, типа, этикетка. Там написано, что это за хрень ("typ": "JWT") и какой там секретный шифр использовали, чтобы подпись сделать ("alg": "HS256"). Потом эту этикетку берут и кодируют в какую-то ебучую Base64URL, чтобы все символы были безопасные. Получается какая-то абракадабра вроде eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. Выглядит как бред, но на самом деле там всё по полочкам.

2. Второй кусок — это начинка (Payload). Вот тут уже самое интересное, вся полезная хуйня лежит. Кто пользователь (sub), когда этот пропуск сдохнет (exp), кто его выдал (iss). Можно ещё имя, роль, любимый цвет — что угодно впихнуть, лишь бы не переборщить. Опять же, всю эту структуру превращают в Base64URL. Получается вторая порция абракадабры: eyJzdWIiOiIxMjMiLCJuYW1lIjoiSm9obiJ9.

3. Третий, самый главный кусок — это подпись (Signature). Вот тут-то и кроется вся магия, а без неё этот токен — просто две бумажки с текстом, которые любой мудак может подделать. Берут первые две закодированные хуйни, склеивают точкой между ними, и потом, внимание, ебут это всё секретным ключом по выбранному алгоритму.

Смотри, как для HS256:

HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret // Вот этот самый секрет, который должен знать только твой сервер, ёпта!
)

Получается третья порция абракадабры, которая и доказывает, что токен не поддельный. Если кто-то попробует в начинке "role": "user" поменять на "role": "god", то подпись уже не сойдётся, и сервер его посылает нахуй сразу.

И вот финальный вид этого произведения искусства: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjMiLCJuYW1lIjoiSm9obiJ9.ABC123...

Три куска, две точки. Красота, блядь! Главное — секретный ключ никому не свети, а то потом будешь удивляться, почему у тебя в админке сидит какой-то школьник из Тюмени.