• авторизация
  • аутентификация
  • oauth
  • oidc
  • идентичность

Почему JWT используется в большинстве сервисов OAuth 2.0

Эта статья объясняет, почему JWT широко используется в качестве формата токенов доступа в OAuth 2.0, подчеркивая его преимущества и ограничения.

Yijun
Yijun
Developer

OAuth 2.0 широко используется сегодня. В качестве основного фреймворка для авторизационных сервисов одной из главных задач OAuth 2.0 является выдача токенов доступа пользователям. Мы заметили, что многие поставщики OAuth-сервисов на рынке выдают токены доступа в формате JWT.

В этой статье мы расскажем, что такое JWT и почему он широко используется в качестве формата токенов доступа, выдаваемых OAuth 2.0.

Введение в JWT

JWT расшифровывается как JSON Web Token и определяется в RFC 7519 следующим образом:

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

Это определение ясно дает понять, что JWT — это токен, используемый для передачи утверждений между разными сторонами.

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

Подписанный JWT имеет следующий формат:

Он состоит из трех частей, разделенных точкой .: заголовка, полезной нагрузки и подписи.

Вот пример реального JWT:

Вы можете попробовать его разобрать на https://jwt.io:

Расшифровать JWT на jwt.io

Как показано на изображении, в разделе header JWT содержится информация об используемом алгоритме подписи и типе токена. Раздел payload содержит утверждения, передаваемые JWT, а signature используется для проверки целостности JWT.

Теперь, когда мы поняли, что такое JWT и что означают его различные части, давайте перейдем к объяснению, почему многие OAuth-сервисы авторизации выбирают JWT в качестве своих токенов доступа.

Преимущества использования JWT

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

  • Эффективность ресурсов: JWT могут содержать информацию о пользователе или сессии, устраняя необходимость частых запросов к базе данных. Эта эффективность может снизить потребление ресурсов сервисами.
  • Повышенная доступность и масштабируемость: JWT снижают зависимость от управления состоянием на стороне сервера. Это позволяет сервисам быть более статeless, улучшая их доступность и масштабируемость.

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

Как показано на диаграмме, когда в системе много пользователей и множество разных ресурсных серверов, может возникнуть множество запросов на проверку токена к серверу аутентификации.

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

Однако когда вводятся JWT, процесс проверки меняется на:

Благодаря функции JWT, которая позволяет проверку через декодирование, ресурсный сервер может проверить целостность JWT и извлечь из него информацию о пользователе без необходимости взаимодействия с сервером аутентификации (для деталей по декодированию и проверке JWT вы можете обратиться к документации Logto).

Ограничения JWT

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

Легко перехватываемая полезная нагрузка

Как упоминалось ранее, JWT состоит из трех частей: header,payload и signature. Как эти компоненты генерируются? Давайте возьмем JWT из предыдущего примера и продемонстрируем процесс его генерации:

Как показано в коде выше, заголовок и полезная нагрузка JWT просто кодируются в base64 строки.

Это означает, что если кто-то получит доступ к токену, он может легко декодировать base64 строку полезной нагрузки JWT и получить доступ к информации, которую он несет. С другой стороны, также относительно легко подделать полезную нагрузку и заменить оригинальную полезную нагрузку JWT на поддельную.

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

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

  1. Всегда используйте SSL: чтобы информация JWT не была утеченной при передаче, необходимо использовать SSL (Secure Sockets Layer) или его преемник, TLS (Transport Layer Security), для шифрования данных в пути.
  2. Избегайте хранения конфиденциальных данных: не рекомендуется хранить конфиденциальные данные в полезной нагрузке JWT. Полезная нагрузка может быть легко декодирована, как сказано ранее, и должна в основном содержать неконфиденциальные, важные утверждения.
  3. Проверяйте JWT: перед доверием информации, содержащейся в JWT, убедитесь, что она прошла проверку на легитимность и безопасность, включая проверку подписи и проверку срока действия токена. Это помогает предотвратить использование подделанных или неавторизованных токенов.

Тяжело отозвать

В общем, токены доступа обычно имеют время действия. Если токен доступа представлен в виде случайных строк без информации, мы можем проверить, был ли токен отозван при каждой валидации на сервере аутентификации.

Что касается JWT, то из-за того, что JWT содержат информацию о времени действия внутри себя, и с учетом того, что проверка JWT не зависит от сервера аутентификации, как только сервер аутентификации выдает токен доступа в формате JWT, становится невозможно изменить состояние токена во время его использования.

После естественного истечения срока действия токена JWT, мы можем получить новый JWT от сервера авторизации, используя токен обновления (вы можете обратиться к блогу Logto для получения информации о токенах обновления).

Однако в некоторых ситуациях, таких как когда пользователь отзывает авторизацию или меняет свой пароль, и вам нужно отозвать уже выданный, но еще не истекший токен, нет простого решения.

Существует два общих подхода для смягчения влияния отзыва токена в середине государственного срока:

  1. Установить более короткое время действия для токена доступа и полагаться на механизм обновления токена для своевременного обновления статуса токена.

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

  1. Поддерживать список отзыва для токенов доступа и проверять, находится ли токен в списке при каждой проверке.

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

Резюме

В этой статье мы предоставили краткое введение в JWT, подчеркнув его преимущества и ограничения. К настоящему моменту вы должны иметь более глубокое понимание JWT и сценариев, в которых он обычно используется. Хотя у JWT есть свои сложности, преимущества, которые он приносит при использовании в качестве формата токена в сервисах OAuth 2.0, значительно перевешивают его недостатки.

Logto, как быстро растущий сервис аутентификации личности, также использует JWT в качестве формата токенов доступа. Он строго соблюдает различные протоколы авторизации и аутентификации, что делает его исключительно простым для интеграции услуг аутентификации личности в ваши продукты. Logto официально запустил свою SaaS-сервис, и вы можете попробовать его бесплатно сегодня.