JWT-токены

JWT-токены #

Васильев Андрей Михайлович, 2025

Версии презентации


JWT-токены #

JSON Web Token — открытый стандарт, который определяет компактный и безопасный способ передачи данных в формате JSON-объекта

  • Безопасность достигается благодаря использованию цифровой подписи
  • Наличие подписи позволяет верифицировать данные внутри подписи
  • Злоумышленнику чрезвычайно трудно сфабриковать подпись
  • Данные JWT-токена передаются открыто, нельзя помещать туда конфиденциальные данные

Структура JWT-токена #

JWT включает в себя три части: заголовок, содержимое и подпись. Элементы отделены друг от друга точками

 xxxxx.yyyyy.zzzzz 

Элементы токена, заголовок #

Включает в себя указание типа токена (JWT) и алгоритм подписи:

{
    "alg": "HS256",
    "typ": "JWT"
}

Данная информация кодируется с помощью кодировки Base64Url:

ew0KICAgICJhbGciOiAiSFMyNTYiLA0KICAgICJ0eXAiOiAiSldUIg0KfQ

Элементы токена, содержимое #

Основная часть токена содержит ряд утверждений о том, для кого был сформирован токен, обычно данные о пользователе

Зарегистрированные утверждения не являются обязательными, но рекомендуются к использованию: iss (издатель), exp (время истечения), aud (аудитория) и другие

Публичные утверждения могут быть установлены любыми службами, но их следует зарегистрировать в IANA

Приватные утверждения тоже могут быть использованы для передачи данных, но не включены ни в одну из предыдущих категорий

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

Данная часть тоже кодируется в Base64Url


Элементы токена, подпись #

Подпись строится из следующих элементов:

  • Берётся Base64-строка заголовка
  • Берётся Base64-строка содержимого
  • Объединяется и выполняется подпись

Например, при использовании алгоритма HMAC SHA256 подпись строится так:

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

Полученные элементы объединяются через точки для получения JWT-токена:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Операции над токеном #

Для реализации работы с токеном приложению необходимо выполнять операции:

  • Создание нового токена в случае успешной аутентификации пользователя
  • Проверять переданный от пользователя токен
  • Извлекать данные из переданного пользователем токена

Для реализации в приложении можно воспользоваться одной из библиотек

В рамках курса рассмотрим библиотеку java-jwt

  • Данную библиотеку можно использовать для создания коммерческих решений
  • Можно использовать на любой JVM-платформе
  • Поддерживает много стандартов шифрования токена

Библиотека java-jwt #

Создание токена #

try { // Необходимо обеспечить хранение секретной строки в настройках
    Algorithm algorithm = Algorithm.HMAC512(secret);
    String token = JWT.create()
        .withIssuer("ru.example")
        .sign(algorithm);
} catch (exception: JWTCreationException){
    // Неправильная конфигурация или ошибка конвертации утверждений
}

Обработка токена #

val algorithm = Algorithm.RSA256(rsaPublicKey, rsaPrivateKey);
val verifier: JWTVerifier = JWT.require(algorithm)
    .withIssuer("ru.example")
    .build(); // Можно создать единожды для приложения
String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.AbIJTDMFc7yUa5MhvcP03nJPyCPzZtQcGEp-zWfOkEE";
try {
    val decodedJWT: DecodedJWT = verifier.verify(token);
} catch (JWTVerificationException exception){
    // Неправильная подпись или утверждения
}

© A. M. Васильев, 2025, CC BY-SA 4.0, andrey@crafted.su