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 зависит от выбранного алгоритма подписи.
Общий процесс создания подписи выглядит следующим образом:
-
Кодирование заголовка и полезной нагрузки: Заголовок и полезная нагрузка токена сериализуются в JSON и кодируются в Base64-строку. Заголовок и полезная нагрузка объединяются, разделенные точкой (".").
-
Вычисление подписи: В зависимости от выбранного алгоритма подписи (alg), полученная строка кодирования и секретный ключ применяются для вычисления подписи. Например, при использовании алгоритма HS256, используется секретный ключ для создания HMAC с использованием SHA-256 хеш-функции.
-
Кодирование подписи: Полученная подпись кодируется в Base64-строку.
-
Формирование окончательного JWT: Полученная кодированная подпись добавляется в конец JWT, разделенная точкой (".").
Пример jwt:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Виды токинов
Токины бывают: access, refresh
Access-токен представляет собой временный токен, который выдается пользователю после успешной аутентификации и предоставляет доступ к определенным данным. Живет относительно мало, 15-30 мин(все зависит от проекта)
Refresh-токен представляет собой долговременный токен Он используется для обновления Access-токена после его истечения срока действия без необходимости повторной аутентификации пользователя. Живет долго, 15-30 дней(все зависит от проекта)
Краткий обзор взаимодействия фронта и бека с пользованием jwt:
-
Вход:
- Пользователь вводит свои учетные данные (логин и пароль)
- frontend отправляет запрос на сервер с учетными данными.
- backend проверяет учетные данные, аутентифицирует пользователя и создает JWT.
- backend возвращает созданный JWT в ответ на запрос.
-
получение защищенных данных(в нашем случае - всех):
- frontend включает JWT в заголовок или запрос.
- backend получает запрос и извлекает JWT из заголовка или запроса.
- backend проверяет подпись JWT, чтобы убедиться в его целостности.
- backend раскодирует JWT, чтобы получить информацию о пользователе, такую как идентификатор или роли.
- backend выполняет авторизационные проверки на основе информации, полученной из JWT.
- Если проверки проходят успешно, backend обрабатывает запрос и возвращает результат на frontend.
-
Обновление и истечение срока действия токена(refresh token, если по русски):
- frontend отправляет запрос на обновление JWT, предоставляя существующий валидный токен(незадолго до истечения срока его жизни).
- backend проверяет подпись токена, проверяет его срок действия и выполняет необходимые действия для обновления токена.
- backend возвращает новый JWT фронту, который заменяет старый токен и может быть использован для последующих запросов.
В процессе проверки подписи JWT backend выполняет следующие шаги:
-
извлекает заголовок, полезную нагрузку и подпись из JWT.
-
раскодирует заголовок и полезную нагрузку из Base64.
-
получает секретный ключ или публичный ключ, соответствующий используемому алгоритму подписи (например, секретный ключ для HS256 или публичный ключ для RS256).
-
применяет алгоритм проверки подписи (например, HMAC с использованием SHA-256 для HS256 или асимметричную проверку подписи для алгоритма RS256) к заголовку и полезной нагрузке, используя полученный ключ.
-
сравнивает полученную подпись с подписью из JWT. Если они совпадают, это означает, что подпись верна, и данные в JWT не были изменены.