Веб-токен JSON (JWT) - это открытый стандарт на основе JSON ((RFC 7519), реализованный для передачи утверждений между средами веб-приложений. Токен спроектирован таким образом, чтобы быть компактным и безопасным, особенно подходящим для отдельных точек на распределенных сайтах. Вход в систему (SSO) сценарий.
Операторы JWT обычно используются для передачи аутентифицированной информации об идентичности пользователя между поставщиком удостоверений и поставщиком услуг, чтобы получить ресурсы с сервера ресурсов, а также могут добавить некоторую необходимую дополнительную бизнес-логику. Токен также может использоваться для аутентификации напрямую. , или он может быть зашифрован.

Зачем нам нужен JWT?
Когда мы разрабатываем проект разделения внешнего и внутреннего интерфейса, мы должны выполнять процесс без сохранения состояния для состояния пользовательского сеанса. Тогда мы знаем, что обычные веб-проекты часто используются для управления пользовательскими сессиями. Сеансы часто используются сервером каждый раз, когда пользователь аутентифицируется на сервере. Отправьте идентификатор сеанса пользователю.
Сессия хранится на сервере. Сервер распознает пользователя во время сеанса и выполняет ряд операций, таких как аутентификация авторизации. После каждого запроса идентификатор сеанса будет возвращен браузеру в заголовке ответа, и браузер сохранит идентификатор сеанса в файле cookie. Каждый последующий запрос будет содержать информацию об идентификаторе сеанса в заголовке запроса, и сервер будет использовать этот идентификатор сеанса, поскольку индекс получает конкретный сеанс.
Тогда в описанном выше сценарии будет болевая точка. Когда мы разделяем интерфейсную часть и серверную часть, наши клиентские проекты и серверные проекты развертываются отдельно, и даже Nginx используется для прокси-перенаправления, что означает, что разделение внешнего и внутреннего интерфейса увеличивается после того, как приложение развязанный. Снижена сложность развертывания.
Обычно пользователю приходится пересылать один запрос несколько раз. Если вы используете сеанс для передачи идентификатора сеанса на сервер каждый раз, сервер также будет запрашивать информацию о пользователе. В то же время, если пользователей много. Эта информация хранится в памяти сервера, что увеличивает нагрузку на сервер. Существует также атака CSRF (Атака с подделкой межсайтовых запросов).
Сеанс основан на файлах cookie для идентификации пользователя. Если cookie перехватывается, пользователь будет уязвим для атак с подделкой межсайтовых запросов. Кроме того, sessionid является характеристическим значением, и выраженная информация недостаточно обширна. Нелегко расширить. И если ваше внутреннее приложение представляет собой развертывание с несколькими узлами. Затем вам нужно реализовать механизм совместного использования сеанса. Это неудобно для кластерных приложений.
Сценарии применения JWT
JWT - одно из решений вышеуказанных болевых точек. Когда клиент запрашивает сервер для входа в систему, сервер проверяет учетную запись и пароль пользователя. После успешной проверки токен генерируется и возвращается клиенту. После этого каждая операция браузера будет запрашиваться с этим токеном в заголовке, сервер проверит информацию токена, и ресурс будет возвращен браузеру после успешной проверки.
Накладные расходы JWT очень малы и могут легко передаваться в разных доменных именах, поэтому он широко используется в системе единого входа (SSO). Обмен информацией - это очень безопасный способ использования JWT для кодирования данных между двумя сторонами связи. , Поскольку его информация подписана, он может гарантировать, что информация, отправленная отправителем, не была подделана.
Интегрировать JWT
Ввести зависимость JWT
Инструменты JWT
Инструменты включают: создание токена, подтверждение токена, получение идентификатора пользователя и т. д.
Мы видим, что при создании токена используются следующие параметры:
- Алгоритм: HS256
- Тип: jwt
- withAudience: добавьте в полезную нагрузку выражение определенной аудитории («aud»), в которое мы можем поместить некоторую информацию о пользователе, например идентификатор пользователя.
- withClaim: добавьте настраиваемое значение заявки, мы используем учетную запись пользователя и пароль для совместного шифрования, чтобы сгенерировать jwt
- withExpiresAt: установка времени ожидания, токен будет недействительным, когда истечет время ожидания.
- withIssuedAt: время выпуска, обычно устанавливается на текущее время.
- подпись: подпись, мы можем настроить подпись и алгоритм
Проверка JWT:
- Прежде всего, мы должны сначала получить объект запроса HttpServletRequest, класс инструмента размещен ниже.
- Получите информацию о токене из заголовка запроса и получите значение в соответствии с ключом (авторизация).
- Затем используйте подпись для шифрования алгоритма для получения объекта проверки jwt, а JWTVerifier.verify (токен) используется для проверки правильности токена.
- Мы также можем получить информацию, которую мы вводим при создании токена, из объекта DecodedJWT, полученного путем проверки, например, идентификатора пользователя.
Получить класс инструмента объекта HttpServletRequest
Инструмент класса пользовательских объектов JSON
Мы интегрировали JWT в SpringBoot для реализации проверки токена