Почему 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-разработчик Орлов Владислав.