Разделы портала

Онлайн-тренинги

.
Секреты JWT
01.10.2020 00:00

Автор: Кристин Джеквони (Kristin Jackvony)
Оригинал статьи
Перевод: Ольга Алифанова

Пользовались ли вы когда-нибудь JWT? Скорее всего, да, если вы хоть раз тестировали продукт с аутентификацией или авторизацией! Термин JWT произносится как "джот" и расшифровывается как JSON Web Token. JWT создаются компанией Auth0, чья цель – предоставить продуктам метод определения, есть ли у пользователя необходимые права для доступа к ресурсу. Чем хороши JWT? Они позволяют приложению проверить авторизационные данные, не передавая логин, пароль или куки. Перехватить можно любые запросы, но JWT не содержит персональных данных и зашифрован, поэтому его перехват не принесет особой пользы (чтобы узнать больше о разнице между токенами и куки, см. статью). Давайте посмотрим, как создаются JWT.

JWT состоит из трех частей, которые образованы из последовательностей букв и цифр, и разделены точками. Один из лучших способов изучить JWT – это попрактиковаться с официальным JWT-дебаггером, поэтому сходите на jwt.io и проскролльте вниз, пока не увидите раздел Debugger.

Часть первая: заголовок

Заголовок содержит алгоритм, который используется для шифрования JWT, а также тип токена (который, конечно, JWT):

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

Часть вторая: данные

В данных содержатся утверждения пользователя. Существует три типа утверждений:

Зарегистрированные утверждения: это стандартные, предопределенные кодом JWT утверждения.

  • iss (эмитент)- автор заявления
  • iat (выпущено в)- время выпуска токена в Unix-времени.
  • exp (время истечения срока)- expire срок годности утверждения в Unix-времени
  • aud (получатель) – получатель токена
  • sub (объекту)-о чем может просить получатель

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

Частные утверждения: эти утверждения определены создателями приложения, и специфичны для компании. К примеру, компания может назначить специфический userId всем своим пользователям, и это включается в утверждения.

Вот пример из дебаггера jwt.io:

{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}

Здесь объект – 1234567890 (не очень-то внятный объект), имя пользователя, у которого есть доступ к объекту – Джон До, а токен был выпущен в 1516239022 по Юникс-времени. Не понимаете, что значит это время? Используйте конвертер, чтобы выяснить это!

Часть третья: подпись

Подпись берет первые две секции и кодирует их в Base64. Затем к этим закодированным секциям добаляется секретный ключ – длинная строка букв и цифр. И наконец подпись шифрует все целиком по алгоритму HMAC SHA256. См. мою статью, чтобы узнать больше о шифровании и кодировании.

Сводим все воедино

JWT состоит из закодированного Заголовка, точки, закодированных Данных, точки, и закодированной подписи. Дебаггер JWT подсвечивает три секции разными цветами, чтобы их можно было различить.

Если вы регулярно пользуетесь JWT в тестируемом ПО, попробуйте взять какой-то из них и посмотреть на него через JWT-дебаггер. Расшифрованные данные расскажут вам о том, как работает ваше приложение.

Если у вас нет JWT, сделайте свой! Вы можете вставлять данные в секцию Payload дебаггера и посмотреть, как меняется зашифрованный JWT:

{
"sub": "userData",
"userName": "kjackvony",
"iss": 1516239022,
"exp": 1586606340
}

При декодировании реального JWT подпись не расшифровывается – секрет есть секрет! Но так как первые две части JWT закодированы, а не зашифрованы – их можно декодировать.

Использование JWT

Использовать JWT можно по-разному, но распространенный метод – передавать их в API-запросах через Bearer-токен. В Postman это выглядит примерно так:

 

Тестирование JWT

Теперь, когда мы разобрались с JWT, как же их тестировать?

  • Попробуйте отправить запрос без JWT, чтобы убедиться, что данные не вернутся.
  • Измените или уберите одну букву в JWT и убедитесь, что данные не вернутся при использовании такого JWT в запросах.
  • Декодируйте валидный JWT в дебаггере, измените значения в нем, и затем проверьте, будет ли он работать в запросах.
  • Используйте JWT без валидной подписи и убедитесь, что ответ не вернет данные.
  • Запомните, когда истекает срок JWT, и попытайтесь отправить запрос с протухшим токеном, чтобы убедиться, что данные не вернутся.
  • Создайте JWT, выпущенный в будущем, и убедитесь, что данные не вернутся.
  • Декодируйте JWT и убедитесь, что он не хранит персональные данные – например, номер банковского счета.

Удачи, и хорошего тестирования!

Обсудить в форуме