Новая идея JWT Auth без сохранения состояния! Это действительно безопасно? - PullRequest
0 голосов
/ 21 июня 2020

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

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

Во-первых, я хочу, чтобы вы знали, что мы будем использовать длительный срок действия (например, 24 часа) для наших токенов и останемся без гражданства, но проблема в том, если ваш JWT когда-нибудь украдут, кто угодно может его использовать, верно? Итак, чтобы предотвратить эту проблему, нам нужно сделать JWT недоступным для всех, кроме пользователя authenti c. Мы можем добиться этого, получив IP-адрес пользователя (а также идентификатор пользователя или что-то еще, что вам нужно) при входе в систему и сохраним его в полезной нагрузке JWT. Затем, чтобы проверить, находится ли JWT в надежных руках, мы проверим, совпадает ли IP-адрес в полезной нагрузке JWT с IP-адресом, который делает запрос. При совпадении мы извлекаем идентификатор пользователя из полезной нагрузки JWT, а затем загружаем данные пользователя в наше глобальное состояние аутентификации. Таким образом, даже если вы каким-то образом украдете свой JWT, они не смогут использовать его с другим IP, и это сделает ваш IP-адрес JWT c. Кроме того, если вы хотите реализовать настоящую функцию выхода из системы, вы можете использовать Redis, чтобы оставаться без состояния, при этом имея возможность отозвать JWT. *

Получить IP-адрес, который делает запрос Поместить IP в полезную нагрузку JWT (а также идентификатор пользователя или что-то еще, что вам нужно) Вернуть JWT и сохранить его в локальном хранилище

Автоматический вход с помощью JWT;

  • Проверить, существует ли JWT в локальном хранилище
  • Если существует, проверьте, совпадает ли IP-адрес, который делает запрос, с IP, который находится в полезной нагрузке JWT
  • Если совпадает, извлеките идентификатор пользователя из полезной нагрузки JWT для загрузки пользовательских данных в глобальное состояние аутентификации
  • Готово!

1 Ответ

0 голосов
/ 21 июня 2020
  1. Это уже много раз обсуждалось раньше.
  2. Это не предотвратит атаки, когда злоумышленник находится в той же сети (корпоративной, NAT).
  3. Это не сработает для пользователи, которые обычно меняют свои IP-адреса (с мобильного на проводной, между сетями Wi-Fi и т. д.).
  4. Использование базы данных (любого типа, например Redis) для сохранения состояния для выхода из системы не является апатридом. 1009 *

    Он может все еще использоваться, если обстоятельства благоприятны (ie. Он может смягчить определенные угрозы в вашей модели угроз, но не может смягчить другие), но это далеко не общее c решение для решения этой проблемы.

...