JWT может быть либо подписанным, либо зашифрованным, либо и тем, и другим. Если токен подписан, но не зашифрован, каждый может прочитать содержимое токена, но если вы не знаете секретный ключ, вы не можете его изменить. В противном случае получатель заметит, что подпись больше не будет соответствовать.
Ответ на ваш комментарий: Я не уверен, насколько правильно понимаю ваши комментарии. Чтобы быть уверенным: знаете ли вы и понимаете цифровые подписи? Я просто кратко объясню один вариант (HMAC, который является симметричным, но есть и многие другие).
Предположим, Алиса хочет отправить JWT в Боб. Они оба знают общий секрет. Мэллори не знает эту тайну, но хочет вмешаться и изменить JWT. Чтобы избежать этого, Алиса рассчитывает Hash(payload + secret)
и добавляет это как подпись.
При получении сообщения Bob также может вычислить Hash(payload + secret)
, чтобы проверить соответствие подписи. Если, однако, Мэллори что-то меняет в содержании, она не в состоянии рассчитать подходящую подпись (которая будет Hash(newContent + secret)
). Она не знает секретов и не имеет возможности узнать это. Это означает, что если она что-то изменит, подпись больше не будет соответствовать, и Боб просто не примет JWT.
Предположим, я пришлю другое лицо сообщение {"id":1}
и подпишу его с помощью Hash(content + secret)
. (+ просто конкатенация здесь). Я использую функцию SHA256 Hash, и подпись я получаю: 330e7b0775561c6e95797d4dd306a150046e239986f0a1373230fda0235bda8c
. Теперь ваша очередь: играть роль Мэллори и попытаться подписать сообщение {"id":2}
. Вы не можете, потому что не знаете, какой секрет я использовал. Если я полагаю, что получатель знает секрет, он МОЖЕТ рассчитать сигнатуру любого сообщения и проверить, правильно ли это.
Значит, подпись изменяется при изменении полезной нагрузки? Я был под впечатлением, что токен был в формате [header]. [Полезная нагрузка]. [Подпись] - это подпись, рассчитанная по комбинации полезной нагрузки и секретности? Если бы это было так, разве полезная нагрузка с другим идентификатором была бы одинаковой для этого секрета? Например, если данные были {id: 1}, и это используется для вычисления сигнатурной части токена с секретом, не означает ли это, что {id: 2} будет действительным для пользователя 2, и поэтому пользователь 1 может изменить id до 2, а токен будет одинаковым? – PixMach
Например, я перехожу сюда и изменяю данные в полезной нагрузке, и он говорит, что подпись действительна, если я не ввел недопустимые символы: http://jwt.io/ http://grab.by/CNGS – PixMach
@PixMach Отредактировано Ответ – Misch