Статьи

Защита Spring Boot Microservices с помощью JSON Web Tokens (JWT)

Аннотация

Я стал поклонником веб-токенов JSON ( JWT ) с тех пор, как обнаружил, что они могут предложить отличные решения для сложных требований к распределенному управлению доступом.

В течение последних пяти лет я использовал JWT, независимо или совместно с другими решениями безопасности, такими как SAML или OpenID Connect, для защиты многих распределенных веб-приложений.

В этой статье я хотел бы продемонстрировать, как JWT можно использовать для защиты доступа к микросервисам Java, созданным с помощью Spring Boot.

Содержание

  1. Реальная аналогия авторизации на основе токенов
  2. Технический обзор авторизации на основе JWT
  3. Семинар: единый вход для Spring Boot Microservices с JWT
  4. Изучение исходного кода
  5. Заключение
  6. Ссылки

Реальная аналогия авторизации на основе токенов

Я хотел бы привести мою любимую систему общественного транспорта Лондона, чтобы описать JSON Web Tokens! Система обеспечивает простой, удобный и удобный способ авторизации поездки для миллионов людей, которые используют несколько видов транспорта — поезд, трамвай, автобус, паром (не показано на рисунке, чтобы избежать переполнения)!

Клиенты могут использовать все эти режимы только с одной проездной. Проездной билет приобретается или перезаряжается в торговом автомате. Карту всегда несет клиент, который просто нажимает на карточку у ворот въезда, чтобы воспользоваться поездкой.

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

Вам также может понравиться: токен JWT: легкая аутентификация на основе токена

Технический обзор авторизации на основе JWT

Как и в реальной аналогии, описанной выше, авторизация JWT включает три объекта и четыре шага, как описано на диаграмме последовательности ниже:

Объекты в потоке авторизации JWT

  1. Token Issuer  эмитент токена (система управления удостоверениями и доступом)
  2. Пользовательский интерфейс  браузер пользователя или мобильное приложение
  3. Поставщик услуг  — веб-сайт или приложение, к которому пользователь хочет получить доступ 

Шаги в авторизации JWT

Шаг 1. Эмитент токена предоставляет подписанный и зашифрованный токен пользовательскому интерфейсу

Пользователь аутентифицируется в Token Issuer, используя некоторый метод входа в систему, и просит Token Issuer предоставить токен. После успешной аутентификации эмитент токенов создает веб-токен JSON (JWT), имеющий следующую структуру:

Header.Payload. Подпись

Более подробную информацию о структуре JWT можно найти по адресу https://jwt.io/

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

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

  • Проблема № 1: Что делать, если конфиденциальные данные в токене прослушиваются перехватчиком?
  • Проблема № 2: Что, если токен будет подделан для запроса услуг, предназначенных для других пользователей?

Хорошо известная криптография RSA с открытым ключом пригодится для решения этих проблем. Эмитент токенов применяет подпись и шифрование следующим образом:

  1. Токен-эмитент подписывает токен своим закрытым ключом и создает JWS (JWT — подписано).
  2. Затем Token Issuer шифрует JWS с помощью открытого ключа поставщика услуг. Зашифрованный JWS называется JWE (JWT — зашифрованный).

Только подписанный и зашифрованный токен (JWE) передается пользовательскому интерфейсу.

Пользователь может только нести JWE, но не может расшифровать его. Только поставщик услуг может расшифровать токен и просмотреть содержащиеся в нем утверждения. Поставщик услуг также обнаружит любое вмешательство в токен, так как токен подписан эмитентом токена.

JWE встроен в качестве заголовка авторизации в ответ HTTP, отправляемый клиенту.

Заголовок авторизации выглядит следующим образом:


HTTP