#node.js #reactjs #jwt #token
#node.js #reactjs #jwt #токен
Вопрос:
Возможно, это будет глупый вопрос, но мне это интересно. Я новичок в серверной части React-js и node-js. Я сохраняю токен jwt в локальном хранилище веб-браузера и декодирую этот токен во интерфейсе react js. мой вопрос в том, безопасно ли использовать метод jwt decode во внешнем интерфейсе, потому что кто-то также может декодировать токен, если они знают токен?
Комментарии:
1. Вы использовали правильное слово:
decode
, но, похоже, вы понимаете его так, как если бы оно означалоdecrypt
. Полезная нагрузка JWT обычно не зашифрована, она просто закодирована в base64url. Но безопасно ли доверять информации из JWT, если вы не можете подтвердить, что подпись действительна?
Ответ №1:
Да, это так.
Идея JWT заключается не в том, что их нельзя декодировать, на самом деле все с точностью до наоборот. Они предназначены для использования в распределенных системах. Вместо этого они безопасны, потому что они могут быть сгенерированы только с использованием секретного ключа, который должен быть доступен только на стороне сервера вашего приложения.
JWT фактически состоит из трех частей — заголовков, полезной нагрузки и подписи — причем заголовки, полезная нагрузка и секретный ключ объединяются и хэшируются для формирования подписи.
Затем эта подпись используется для проверки того, что заголовки и полезная нагрузка не были изменены. Если у них есть, подпись больше не будет совпадать.
Комментарии:
1. В заключение из приведенного выше объяснения следует, что для обеспечения «безопасности» вашей настройки не храните никаких конфиденциальных данных в токене и / или подписи в клиенте.
2. Вы сказали, что секретный ключ должен быть доступен только на сервере, но для того, чтобы выбрать его во внешнем интерфейсе, вам также понадобится секретный ключ. Поскольку код react остается на стороне клиента, теоретически секретный ключ может быть извлечен из скомпилированной версии react. Вот почему человек задал этот вопрос, поскольку он также приходил мне в голову.
3. @UmarMunir Секрет используется для проверки JWT, но его можно декодировать в 100% случаев, потому что он просто закодирован в base64, который используется для обеспечения того, чтобы символы не терялись при переходе между концентраторами и маршрутизатором в Интернете.
Ответ №2:
JWT-коды имеют 3 отдельные части, которые разделены .
общедоступной частью, которая содержит
HEADER:ALGORITHM amp; TOKEN TYPE
PAYLOAD:DATA
и VERIFY SIGNATURE
который гарантирует, что ваш токен действителен или нет.
Общедоступная часть может быть извлечена всеми, у кого есть токен
JWT decode
ищите только общедоступную часть, чтобы это было абсолютно безопасно делать в вашем интерфейсном коде.
Пример:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
>> after decode
HEADER:ALGORITHM amp; TOKEN TYPE
{
"alg": "HS256",
"typ": "JWT"
}
PAYLOAD:DATA
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
Ответ №3:
Ответ «да» и «нет», если у вас есть некоторая информация, идентифицирующая пользователя (например, userId), и вас устраивает, что эти данные передаются, тогда да, вы можете декодировать их во внешнем интерфейсе. Если вы собираетесь хранить некоторую конфиденциальную информацию в токене, то нет. (Это плохая практика). Также обратите внимание, что полезная нагрузка не может быть изменена. Даже при изменении подписи токен не будет проверен. Поэтому наилучшей практикой будет не содержать конфиденциальных данных в полезной нагрузке.