Почему JWT можно прочитать, но нельзя подделать

Частый вопрос у начинающих - в чем смысл безопасности JWT, если можно вставить токен в jwt.io и увидеть содержимое???

Спойлер: суть JWT - не спрятать данные, а сделать уникальную подпись (signature). Кто сможет повторить уникальную подпись - доверенное лицо.

Для удобства и понимания буду писать на JS-овидном псевдокоде)))

Введение

Из названия (Json Web Token) понимаем, что перед нами данные, которые будут в виде JSON: { “header”: {…}, “payload”: {…}, “signature”: “” } , где header - заголовок, payload - основные данные и signature - подпись токена.

Цель кодирования

Проблема: большие размеры, небезопасно для URL, заголовков или куки (так как может содержать спец. символы, например, + / =". Для решения проблемы поможет кодирование (Base64URL).

Процесс кодирования/декодирования

Для header и payload применяем сериализацию (JSON.stringify()) и кодировку: const header = Base64URL(headerSerialize) const payload = Base64URL(payloadSerialize)

Но для signature сначала нужно объединть header и payload: _const signInput = ${header}.${payload}_

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

const signature = SIGN(key, signInput)

Объединим все в одну строку и для дальнейшего удобства разделим точкой. Получаем строку вместо JSON: _const JWTEncode = ${header}.${payload}.${signature}_

Теперь мы понимаем, что закодированные поля header и payload можно легко декодировать и тогда мы получим то, что видим на сайте jwt.io - здесь никакой магии.

Коротко: JWT - это не “спрятать данные”, а “подписать их”. Header и payload читаются кем угодно - и это нормально. Вся защита живет в третьей части строки, в signature.

Признавайтесь, клали в payload что-то, чего не стоило?)))

Если было интересно, ставь лайк или пиши коммент)

С вами был Fullstack-разработчик Орлов Владислав.