2017-02-20 6 views
1

Я читаю на JWT, есть так много учебников и так много подходов, это сбивает с толку.Почему я должен оставлять полезную нагрузку JNON Web Token незашифрованной?

У меня есть несколько вопросов, касающихся надлежащего использования JWTs:

1) Я продолжаю видеть несогласованные средства транспортировки JWTs и от сервера. For example, here: один транспортный метод для извлечения токена (через JSON-закодированный объект в модуле POST), другой метод для его отправки (через HTTP-заголовок). Почему такая несогласованность? Разумеется, разработчик должен выбирать методы, но не лучше ли это быть хорошей практикой, по крайней мере, быть последовательной и использовать либо только заголовок, либо только тело?

2) Полезная нагрузка JWT содержит информацию о состоянии, поскольку сервер не поддерживает ее. Очевидно, что размер полезной нагрузки должен быть как можно меньше, так как размер JWT добавляется к каждому запросу и ответу. Возможно, это только идентификатор пользователя и кэшированные разрешения. Когда клиенту нужна какая-либо информация, он может получать его через тело HTTP (как правило, JSON-encoded) и хранить его в локальном хранилище, по-видимому, нет необходимости обращаться к полезной нагрузке JWT только для чтения с той же целью. Итак, почему нужно хранить незашифрованную полезную нагрузку JWT? Зачем смешивать два способа получения данных приложения клиенту и использовать как полезную нагрузку JWT, так и нормальную структуру данных в ответ? Не следует ли лучше всего держать JWT в зашифрованном виде? В любом случае, он может обновляться только на стороне сервера.

ответ

1

1) Я продолжаю видеть непоследовательные способы транспортировки JWT на сервер и обратно. [...] не было бы хорошей практикой, по крайней мере, быть последовательной и использовать либо только заголовок, либо только тело?

Это может зависеть от Клиента. Хотя веб-приложение может получить более высокую степень безопасности, сохранив JWT в хранилище файлов cookie, собственные приложения могут предпочесть локальное хранилище для доступа к информации JWT. [1]

2) Полезная нагрузка JWT содержит информацию о состоянии, поскольку сервер не поддерживает ее. Очевидно, что размер полезной нагрузки должен быть как можно меньше, так как размер JWT добавляется к каждому запросу и ответу. Возможно, это только идентификатор пользователя и кэшированные разрешения. Когда клиенту нужна какая-либо информация, он может получать его через тело HTTP (как правило, JSON-encoded) и хранить его в локальном хранилище, по-видимому, нет необходимости обращаться к полезной нагрузке JWT только для чтения с той же целью.

JWT сохраняет бэкэнд-состояние, а не состояние клиента. Состояние бэкэнд может быть User 128 is logged in as administrator. Это (в моем примере) хранится в JWT в полях Subject и Scopes. Вместо того, чтобы клиент отправил идентификатор сеанса Backend, который содержит эту информацию, информация находится непосредственно в JWT. Таким образом, бэкэнд не должен поддерживать сеанс, в котором хранится пользователя 128. Если Клиент запрашивает информацию User 2, BE может решить, что эта информация запрещена, если JWT сообщает, что зарегистрированный пользователь имеет идентификатор 1.

Итак, почему нужно хранить незашифрованную полезную нагрузку JWT?

Состояние обычно не является секретным для клиента. клиент не может доверять информации в JWT, поскольку он не имеет доступа к секретному ключу, который используется для проверки JWT, но он все равно может настроить графический интерфейс и т. д. из информации в JWT. (Как показывать кнопку для графического интерфейса администратора или нет.)

Зачем смешивать два способа получения данных приложения клиенту и использовать как полезную нагрузку JWT, так и обычный корпус данных в ответ?

См. Выше, основная цель JWT заключается в том, чтобы хранить информацию в качестве бэкэнд, а не клиента. Как только пользователь войдет в систему, Backend спросит: «Эй, можете ли вы сохранить эту информацию для меня и приложить ее к каждому запросу, чтобы я мог забыть о вас в то же время?» Например, если ваш менеджер попросит вас носить наклейку с именем на вашей юбке, чтобы он/она не помнил ваше имя. :-) (И он/она подписывает его, так что вы не можете изменить его без него/ее заметили.

Если не лучшая практика будет держать JWT всегда шифруется? Это может быть обновлена ​​только на стороне сервера в любом случае.

это на самом деле не принесет никакой безопасности, если не хранить секретную информацию в JWT, и что лавровый лучше делать на стороне сервера. дешифрования является немного более громоздким для расшифровки по сравнению с только проверки подписи .

[1] Local Storage vs Cookies