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