jwt - siriuscollegedevs/bft GitHub Wiki

Что такое jwt(JSON Web Token)?

Это json строка. Все)))

Она стостоит из 3 частей: HEADER, PAYLOAD,VERIFY SIGNATURE

Если по русски, то: заголовок, какая-то инфа(тело, сигнатура, данные), уникальная подпись

Заголовок

Заголовок - это набор "вспомогательных данных", ОБЯЗАТЕЛЬНО должен хранить в себе алгоритм подписи и тип токена. Изначально это JSON объект.

например:

{
  "alg": "HS256", // алгоритм подписи
  "typ": "JWT" // тип токена
}

Полезная нагрузка

Полезная нагрузка(тело, сигнатура, данные) - это как следует из названия какая-то полезная иформация. Изначально это JSON объект. например:

{
  "phone": "1234567890",
  "name": "Иванов Иван Иванович"
}

Уникальная подпись

Уникальная подпись - уже более сложная история. Это хеш-значение, созданное с использованием заголовка, полезной нагрузки, секретного ключа и алгоритма подписи.

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

Процесс создания подписи JWT зависит от выбранного алгоритма подписи.

Общий процесс создания подписи выглядит следующим образом:

  1. Кодирование заголовка и полезной нагрузки: Заголовок и полезная нагрузка токена сериализуются в JSON и кодируются в Base64-строку. Заголовок и полезная нагрузка объединяются, разделенные точкой (".").

  2. Вычисление подписи: В зависимости от выбранного алгоритма подписи (alg), полученная строка кодирования и секретный ключ применяются для вычисления подписи. Например, при использовании алгоритма HS256, используется секретный ключ для создания HMAC с использованием SHA-256 хеш-функции.

  3. Кодирование подписи: Полученная подпись кодируется в Base64-строку.

  4. Формирование окончательного JWT: Полученная кодированная подпись добавляется в конец JWT, разделенная точкой (".").

Пример jwt:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Виды токинов

Токины бывают: access, refresh

Access-токен представляет собой временный токен, который выдается пользователю после успешной аутентификации и предоставляет доступ к определенным данным. Живет относительно мало, 15-30 мин(все зависит от проекта)

Refresh-токен представляет собой долговременный токен Он используется для обновления Access-токена после его истечения срока действия без необходимости повторной аутентификации пользователя. Живет долго, 15-30 дней(все зависит от проекта)


Краткий обзор взаимодействия фронта и бека с пользованием jwt:

  1. Вход:

    1. Пользователь вводит свои учетные данные (логин и пароль)
    2. frontend отправляет запрос на сервер с учетными данными.
    3. backend проверяет учетные данные, аутентифицирует пользователя и создает JWT.
    4. backend возвращает созданный JWT в ответ на запрос.
  2. получение защищенных данных(в нашем случае - всех):

    1. frontend включает JWT в заголовок или запрос.
    2. backend получает запрос и извлекает JWT из заголовка или запроса.
    3. backend проверяет подпись JWT, чтобы убедиться в его целостности.
    4. backend раскодирует JWT, чтобы получить информацию о пользователе, такую как идентификатор или роли.
    5. backend выполняет авторизационные проверки на основе информации, полученной из JWT.
    6. Если проверки проходят успешно, backend обрабатывает запрос и возвращает результат на frontend.
  3. Обновление и истечение срока действия токена(refresh token, если по русски):

    1. frontend отправляет запрос на обновление JWT, предоставляя существующий валидный токен(незадолго до истечения срока его жизни).
    2. backend проверяет подпись токена, проверяет его срок действия и выполняет необходимые действия для обновления токена.
    3. backend возвращает новый JWT фронту, который заменяет старый токен и может быть использован для последующих запросов.

В процессе проверки подписи JWT backend выполняет следующие шаги:

  1. извлекает заголовок, полезную нагрузку и подпись из JWT.

  2. раскодирует заголовок и полезную нагрузку из Base64.

  3. получает секретный ключ или публичный ключ, соответствующий используемому алгоритму подписи (например, секретный ключ для HS256 или публичный ключ для RS256).

  4. применяет алгоритм проверки подписи (например, HMAC с использованием SHA-256 для HS256 или асимметричную проверку подписи для алгоритма RS256) к заголовку и полезной нагрузке, используя полученный ключ.

  5. сравнивает полученную подпись с подписью из JWT. Если они совпадают, это означает, что подпись верна, и данные в JWT не были изменены.