Введение и анализ JWT

Spring

Во-первых, что такое JWT?Понимание JWT, когнитивный JWT

Прежде всего, jwt на самом деле является аббревиатурой трех английских слов JSON Web Token. По полному имени у вас может быть базовое понимание. Токены обычно используются для аутентификации.Например, обычно используемый токен входа пользователя в нашу систему может использоваться для аутентификации того, вошел ли пользователь в систему. jwt также часто используется в качестве токена безопасности.

Определение JWT:

JWT — это краткая, безопасная для URL спецификация репрезентативных утверждений для обмена информацией о безопасности между двумя сторонами. В качестве открытого стандарта (RFC 7519) JWT определяет краткий автономный метод для безопасной передачи информации в виде объектов Json между взаимодействующими сторонами. Из-за наличия цифровой подписи этой информации доверяют, и JWT может быть подписан с использованием алгоритма HMAC или пары открытого и закрытого ключей RSA.

Возможности JWT:

  • Компактный: Может быть отправлен через URL, параметры POST или в заголовке HTTP, поскольку объем данных небольшой, а скорость передачи высокая.
  • автономный: Загрузка содержит всю информацию, необходимую пользователю, что позволяет избежать множественных запросов к базе данных.

2. Каков состав JWT или как выглядит JWT?

2.1.Структура JWT

JWT в основном состоит из трех частей, разделенных английской точкой '.'

  1. Заголовок
  2. Полезная нагрузка
  3. Подпись

Обратите внимание, что порядок header.payload.signature

Окончательная структура примерно такая:

leftso.com.blog

Конечно, настоящий jwt не может быть таким простым открытым текстом.

2.2.Заголовок JWT (Заголовок)

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

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

В приведенном выше содержимом JSON указано, что используемый в настоящее время метод шифрования — HS256, а тип токена — jwt.

Base64 кодирует вышеуказанное содержимое, чтобы получить заголовок нашего JWT, который закодирован следующим образом:

ewogICJhbGciOiAiSFMyNTYiLAogICJ0eXAiOiAiSldUIgp9ICA=

2.3. Нагрузка JWT (полезная нагрузка)

Полезная нагрузка — это вторая часть JWT. Стандарт JWT определяет несколько основных полей

  1. iss: эмитент этого JWT
  2. sub: пользователь, для которого предназначен этот JWT
  3. aud: Сторона, получающая JWT
  4. exp(истекает): когда истекает, вот временная метка Unix
  5. iat(выпущено в): когда было выпущено

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

{
    "iss": "Lefto.com",
    "iat": 1500218077,
    "exp": 1500218077,
    "aud": "www.leftso.com",
    "sub": "leftso@qq.com",
    "user_id": "dc2c4eefe2d141490b6ca612e252f92e",
    "user_token": "09f7f25cdb003699cee05759e7934fb2"
}

Поля user_id и user_token выше — это все поля, которые мы определяем сами.

Теперь нам нужно закодировать в base64 всю часть полезной нагрузки, и закодированный результат выглядит следующим образом:

ewogICAgImlzcyI6ICJMZWZ0by5jb20iLAogICAgImlhdCI6IDE1MDAyMTgwNzcsCiAgICAiZXhwIjogMTUwMDIxODA3NywKICAgICJhdWQiOiAid3d3LmxlZnRzby5jb20iLAogICAgInN1YiI6ICJsZWZ0c29AcXEuY29tIiwKICAgICJ1c2VyX2lkIjogImRjMmM0ZWVmZTJkMTQxNDkwYjZjYTYxMmUyNTJmOTJlIiwKICAgICJ1c2VyX3Rva2VuIjogIjA5ZjdmMjVjZGIwMDM2OTljZWUwNTc1OWU3OTM0ZmIyIgp9

2.4.

Подпись

Подпись на самом деле является проверкой подписи заголовка JWT и интеграции полезной нагрузки.

Во-первых, вам нужно передать заголовок и полезную нагрузку.Сцепите это следующим образом: header.Payload, приведенный выше пример будет выглядеть так после цепочки:

ewogICJhbGciOiAiSFMyNTYiLAogICJ0eXAiOiAiSldUIgp9ICA=.ewogICAgImlzcyI6ICJMZWZ0by5jb20iLAogICAgImlhdCI6IDE1MDAyMTgwNzcsCiAgICAiZXhwIjogMTUwMDIxODA3NywKICAgICJhdWQiOiAid3d3LmxlZnRzby5jb20iLAogICAgInN1YiI6ICJsZWZ0c29AcXEuY29tIiwKICAgICJ1c2VyX2lkIjogImRjMmM0ZWVmZTJkMTQxNDkwYjZjYTYxMmUyNTJmOTJlIiwKICAgICJ1c2VyX3Rva2VuIjogIjA5ZjdmMjVjZGIwMDM2OTljZWUwNTc1OWU3OTM0ZmIyIgp9

Поскольку для алгоритма шифрования HMacSHA256 требуется ключ, мы временно используем здесь для ключа leftso.

Зашифрованное содержимое:

686855c578362e762248f22e2cc1213dc7a6aff8ebda52247780eb6b5ae91877

По сути, зашифрованный контент и является подписью JWT, что аналогично тому, когда мы шифруем файл с помощью MD5, а затем сравниваем полученный файл с md5.Просто здесь алгоритму HMacSHA256 нужен ключ.Конечно, этот ключ должны быть известны как пользователю, так и получателю.

Base64 кодирует вышеуказанное содержимое подписи, чтобы получить окончательную подпись.

Njg2ODU1YzU3ODM2MmU3NjIyNDhmMjJlMmNjMTIxM2RjN2E2YWZmOGViZGE1MjI0Nzc4MGViNmI1YWU5MTg3Nw==

2.5 Окончательный JWT

ewogICJhbGciOiAiSFMyNTYiLAogICJ0eXAiOiAiSldUIgp9ICA=.ewogICAgImlzcyI6ICJMZWZ0by5jb20iLAogICAgImlhdCI6IDE1MDAyMTgwNzcsCiAgICAiZXhwIjogMTUwMDIxODA3NywKICAgICJhdWQiOiAid3d3LmxlZnRzby5jb20iLAogICAgInN1YiI6ICJsZWZ0c29AcXEuY29tIiwKICAgICJ1c2VyX2lkIjogImRjMmM0ZWVmZTJkMTQxNDkwYjZjYTYxMmUyNTJmOTJlIiwKICAgICJ1c2VyX3Rva2VuIjogIjA5ZjdmMjVjZGIwMDM2OTljZWUwNTc1OWU3OTM0ZmIyIgp9.Njg2ODU1YzU3ODM2MmU3NjIyNDhmMjJlMmNjMTIxM2RjN2E2YWZmOGViZGE1MjI0Nzc4MGViNmI1YWU5MTg3Nw==