Путаница относительно авторизации JWT - PullRequest
1 голос
/ 01 августа 2020

Я изо всех сил пытаюсь понять что-то об авторизации JWT.

Предположим, я успешно вошел в систему как пользователь. Затем сервер отправит мне токен JWT, который я могу использовать для каждого последующего запроса.

Мой вопрос в том, может ли кто-нибудь на стороне клиента, имеющий доступ к этому токену, технически поместить его в заголовок авторизации и сделать запрос к защищенной конечной точке и успешно вернуть данные?

Ответы [ 5 ]

3 голосов
/ 01 августа 2020

Да, любое лицо, владеющее этим токеном, имеет право. Приложение и браузер должны защищать токен. В своем приложении вы всегда должны:

  • отправлять токен по зашифрованному каналу (HTTPS).
  • правильно настроить CORS, чтобы браузер мог защитить ваши конечные точки от доступа со стороны другие приложения.
  • Используйте достаточно короткий срок действия токена, чтобы ограничить период, когда токен может быть использован неправомерно.
3 голосов
/ 01 августа 2020

на этом этапе может кто угодно на стороне клиента с доступом к этому токену

Аутентификация JWT предполагает использование зашифрованного транспортного канала (https), поэтому только аутентифицированный клиент будет иметь доступ к токен jwt. Обычно это справедливо для любой аутентификации токена (например, cook ie, ...).

2 голосов
/ 01 августа 2020

Добро пожаловать в мир безопасности, где все по-другому.

Topi c более сложный, чем может показаться на первый взгляд. Как уже упоминалось, первый шаг - защитить токен от перехвата с помощью безопасного соединения. Но это не конец истории.

Если токен безопасно передается клиенту, токен должен храниться где-то на клиенте. Существует три основных варианта:

  • Хранить токен в кэше сеанса, например, в локальном хранилище.
  • Отправить токен как HTTP only cook ie, чтобы к нему нельзя было получить доступ скриптами
  • Храните токен где-нибудь во внешнем коде

У каждого подхода есть свои плюсы и минусы. Начнем с локального хранилища.

По сути, локальное хранилище - это большой JavaScript объект, доступный для скриптов. Другими словами: если скрипт может проникнуть на вашу веб-страницу, он сможет прочитать ваше локальное хранилище и, таким образом, может украсть ваш токен.

Затем отправьте токен как HTTP only cook ie. Кажется, этого достаточно. Если это файлы cookie только для HTTP, сценарии не могут получить доступ к информации, поэтому информация в безопасности, верно? Нет. Если сценарий может проникнуть на ваш сайт и с этого сайта делает запрос к защищенному ресурсу, маркер автоматически отправляется браузером (так работают только файлы cookie HTTP). Это известно как Cross-Site-Request-Forgery .

Наконец, можно было просто сохранить токен в скрипте. Это кажется достаточно хорошим, учитывая, что можно выбрать любое возможное имя переменной для токена, и, таким образом, злоумышленнику трудно угадать. Это верно, если кто-то пишет свой собственный код для этой части. Но в большинстве случаев люди будут прибегать к существующим решениям, и злоумышленники могут найти соответствующую переменную и просто прочитать ее значение. Кроме того, если токен не хранится постоянно, это означает, что пользователь должен повторно входить в систему каждый раз, когда браузер закрывается и снова открывается. В зависимости от желаемого UX это может быть не вариант.

Так что «идеального решения» этой проблемы не существует. Это ситуация «выбери свой яд». Но на этом история не заканчивается. Как уже упоминалось, у токенов обычно есть срок годности. Однако с точки зрения пользователя плохо, если пользователь должен повторно входить в систему каждый час или около того, даже если он / она был активен в этот период времени. Если взять, например, стандарт OAUTH 2.0 , у нас будет концепция токена refre sh. Токен refre sh - это специальный токен, который, если предоставляется, генерирует новый токен доступа JWT. В этом случае токен доступа может иметь очень короткий срок действия (например, 5 минут). Если срок действия токена доступа истекает, клиент может запросить новый токен, используя токен refre sh, который обычно является долгоживущим, возможно, вообще не истекает. Но это только решает проблему: теперь токен доступа недолговечен, но если злоумышленник может получить токен refre sh, он / она имеет возможность продолжать выпускать новые токены доступа. Но можно сохранить состояние токена refre sh в провайдере аутентификации, например, keycloak имеет функцию аннулирования всех токенов пользователя. Тогда возникает вопрос: как можно уведомить систему о том, что токен был украден, и что все токены должны быть признаны недействительными? Или даже более фундаментально: как вообще можно заметить, что токен refre sh был украден?

Суть в том, что серебряной пули нет. Вам следует посмотреть на свой вариант использования и принять соответствующее решение. Есть лучшие практики, но они могут измениться. И в зависимости от практики внедрение новой передовой практики может занять много времени и / или дорого.

1 голос
/ 01 августа 2020

Да, то, что вы говорите, верно, и это основная причина, по которой любой JWT должен иметь значение срока действия , так что даже если он каким-то образом будет украден, доступ ограничен определенным периодом времени. (лучшие практики предполагают от 15 до 60 минут).

0 голосов
/ 01 августа 2020

Лучшие практики для хранения JWT на клиенте,

Он должен храниться внутри httpOnly cook ie, особого вида повара ie, который отправляется только в HTTP-запросы к серверу и никогда не доступны (как для чтения, так и для записи) из JavaScript, запущенного в браузере .

Подробнее , проверьте это Использование JWT, плюсы и минусы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...