Каковы ключевые особенности JWT токена?

Ответ

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

Основные особенности:

  1. Самодостаточность (Self-contained): Полезная нагрузка токена (payload) содержит все необходимые утверждения (claims), такие как идентификатор пользователя (sub), срок действия (exp) и роли. Серверу не нужно обращаться к базе данных для проверки этих данных, достаточно верифицировать подпись.
  2. Цифровая подпись: Токен подписывается с использованием секретного ключа (алгоритмы HMAC, например, HS256) или пары публичный/приватный ключ (алгоритмы RSA/ECDSA). Подпись гарантирует целостность данных (они не были изменены) и, в случае асимметричных алгоритмов, аутентичность отправителя.
  3. Stateless (Бессостоятельность): Серверу аутентификации не требуется хранить состояние сессии. Это упрощает архитектуру и повышает масштабируемость.
  4. Компактность: Токен кодируется в формате Base64Url, что делает его удобным для передачи через URL, параметры запроса или заголовки (чаще всего Authorization: Bearer <token>).

Структура JWT (Header.Payload.Signature):

// Header (алгоритм и тип токена)
{
  "alg": "HS256",
  "typ": "JWT"
}

// Payload (данные/утверждения)
{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022,
  "exp": 1516242622
}

// Signature
HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret
)

Практическое применение:

  • Аутентификация/Авторизация: После ввода логина/пароля сервер выдает JWT, который клиент отправляет с каждым последующим запросом.
  • Обмен данными между сервисами: Безопасная передача информации между микросервисами в рамках единой экосистемы.

Важное предупреждение: Полезная нагрузка JWT (Payload) не зашифрована, а лишь закодирована в Base64. Ее может прочитать любой, у кого есть токен. Не храните в ней конфиденциальные данные (пароли, ключи). Для конфиденциальности используйте шифрование (JWE).

Ответ 18+ 🔞

А, слушай, про эти ваши JWTшки! Ну, стандарт такой, RFC 7519, если по-умному. По сути, это такая бумажка-пропуск, только в цифре, и сделана из JSON'а. Компактная, самодостаточная и подписанная, блядь.

Чем она хороша, эта штука:

  1. Сама себе начальник (Self-contained): Внутри этой бумажки уже всё написано: кто ты (sub), когда твой пропуск сдохнет (exp), какие у тебя права. Серверу не нужно, как последнему идиоту, бегать в базу и спрашивать «а кто это тут у нас?». Проверил подпись — и всё, хуй с горы, пускай дальше.
  2. Цифровая подпись, ёпта: Это самое главное! Токен подписывается либо секретным ключом (алгоритмы типа HS256), либо парой ключей — публичным и приватным (RSA, ECDSA). Подпись — это как печать. Если кто-то попробует в середине что-то поменять, типа срок действия продлить, то подпись не сойдётся, и всё, пиздец, доверия ебать ноль. А если ключи асимметричные, то ещё и понятно, кто именно эту хрень выпустил.
  3. Stateless (Бессостоятельность): Серверу, который выпустил токен, можно потом на него забить хуй. Он не обязан помнить каждый выданный пропуск. Клиент сам его таскает и предъявляет. Архитектура проще, масштабироваться легче — красота!
  4. Компактность: Всё это добро кодируется в Base64Url, так что его можно и в URL воткнуть, и в заголовок запихнуть. Чаще всего таскают так: Authorization: Bearer <ваш_токен_тут>. Удобно, блядь.

Из чего эта хрень состоит (Header.Payload.Signature):

Смотри, три части, разделённые точками.

// Header (Тут написано, как токен сделан)
{
  "alg": "HS256", // Алгоритм подписи, например, HMAC-SHA256
  "typ": "JWT"    // Тип — JWT, что же ещё
}

// Payload (А тут уже данные, «утверждения»)
{
  "sub": "1234567890", // Subject — кто (ID пользователя)
  "name": "John Doe",  // Имя, например
  "iat": 1516239022,   // Issued at — когда выпущен
  "exp": 1516242622    // Expiration — когда протухнет
}

// Signature (А это самая важная часть — подпись)
HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret // Вот этот самый секретный ключ
)

Где эту херовину применяют:

  • Вход на сайт/в приложение: Пользователь ввёл логин-пароль, сервер проверил, выдал JWT и говорит: «На, мудила, таскай, это твой пропуск». И дальше с каждым запросом клиент этот токен и подсовывает.
  • Общение между сервисами: Микросервисы в одной системе могут безопасно передавать друг другу информацию внутри такого токена.

НО! ВАЖНЕЙШЕЕ ПРЕДУПРЕЖДЕНИЕ, БЛЯДЬ! Полезная нагрузка (Payload) — НЕ ЗАШИФРОВАНА. Она просто закодирована в Base64, что читается легче, чем газета. Любой, у кого есть токен, может его разобрать и прочитать, что внутри. НЕ ПИХАЙТЕ ТУДА ПАРОЛИ, КЛЮЧИ ИЛИ ДРУГУЮ ХУЙНЮ, КОТОРУЮ НЕЛЬЗЯ СВЕТИТЬ! Это как писать свой пароль на лбу маркером. Если нужна секретность — используйте JWE (JSON Web Encryption), там уже с шифрованием. А JWT — в основном для целостности и аутентичности. Запомни это, а то потом будешь охуевать, как твои данные утекли.