JWT-токены
#
Васильев Андрей Михайлович, 2025
Версии презентации
JWT-токены
#
JSON Web Token — открытый стандарт, который определяет компактный и безопасный
способ передачи данных в формате JSON-объекта
- Безопасность достигается благодаря использованию цифровой подписи
- Наличие подписи позволяет верифицировать данные внутри подписи
- Злоумышленнику чрезвычайно трудно сфабриковать подпись
- Данные JWT-токена передаются открыто, нельзя помещать туда конфиденциальные
данные
Структура JWT-токена
#
JWT включает в себя три части: заголовок, содержимое и подпись. Элементы
отделены друг от друга точками
Элементы токена, заголовок
#
Включает в себя указание типа токена (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){
// Неправильная подпись или утверждения
}