JSON Web Token (JWT) - это объект JSON, и он считается одним из самых безопасных способов передачи информации между двумя участниками. Для его создания необходимо определить заголовок с общей информацией о токене, данными полезной нагрузки, такими как идентификатор пользователя, его роль и т.д., и сигнатурами.
Приложение использует JWT для проверки подлинности пользователя следующим образом:
- Сначала пользователь входит на сервер аутентификации, используя ключ аутентификации (это может быть пара имя пользователя / пароль , либо ключ Facebook , либо ключ Google , либо ключ из другой учетной записи).
- Затем сервер аутентификации создает JWT и отправляет его пользователю.
- Когда пользователь делает запрос к API приложения, он добавляет к нему ранее полученный JWT .
- Когда пользователь делает запрос API, приложение может проверить, является ли пользователь тем, кем он себя считает, используя запрос JWT . В этой схеме сервер приложений настроен так, чтобы иметь возможность проверять, является ли входящий JWT именно тем, что был создан сервером аутентификации (процесс проверки будет объяснен позже более подробно).
JWT структура
JWT состоит из трех частей: заголовок, полезная нагрузка и подпись. Давайте пройдемся по каждому из них.
Шаг 1. Создание заголовка
Заголовок JWT содержит информацию о том , как JWT следует рассчитывать подпись. Заголовок также является объектом JSON, который выглядит следующим образом:
Код:
header = { “alg”: “HS256”, “typ”: “JWT”}
Шаг 2. Создание payload
Полезная нагрузка - это полезная нагрузка, которая хранится внутри JWT. В этом примере сервер аутентификации создает JWT с информацией о userId
Код:
payload = { “userId”: “b08f86af-35da-48f2–8fab-cef3904660bd” }
- iss (issuer) - определяет приложение, из которого отправляется токен.
- sub (subject) - определяет тему токена.
- exp (expiration time) - время жизни токена.
Шаг 3. Создание подписи
Base64url алгоритм кодирует заголовок и полезную нагрузку, созданную в шаге 1 и 2 . Алгоритм объединяет закодированные строки через точку.
Код:
// header eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
// payload eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ
// signature -xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM
Шаг 4. Теперь объедините все 3 компонента JWT вместе
Теперь, когда у нас есть все три компонента, мы можем создать наш JWT
Код:
const token = encodeBase64Url(header) + ‘.’ + encodeBase64Url(payload) + ‘.’ + encodeBase64Url(signature)
Код:
// JWT Token //eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiJiMDhmODZhZi0zNWRhLTQ4ZjItOGZhYi1jZWYzOTA0NjYwYmQifQ.-xN_h82PHVTCMA9vdoHrcZxH-x5mb11y1537t3rGzcM
Вы можете попробовать создать свой собственный JWT в онлайне здесь jwt.io
оригинальная заметка
Перевод: tabac, специально для https://xss.pro