Обращаться к украденному JWT?

Я создаю сервер nodejs с аутентификацией jwt.

На данный момент срок годности моих jwts составляет 1 месяц. Если пользователь переходит на страницу входа в систему, я проверяю, содержит ли его запрос действительный jwt, если да, ему не нужно вводить свое имя пользователя и пароль. Если он выходит из системы, jwt удаляется на стороне клиента, поэтому в следующий раз пользователю придется войти в систему со своими учетными данными.

Что делать, если злоумышленник прослушивает соединение (я уже использую ssl) и получает токен. Даже если пользователь выйдет из системы и получит новый токен в следующем сеансе, злоумышленник может выдать себя за пользователя со старым токеном, если он действителен, верно?

  1. Является ли хорошей идеей хранить IAT «текущего» токена пользователя в БД и сравнивать его с IAT токена в запросе, чтобы избежать доступа злоумышленника?

  2. Я знаю, 1 месяц - довольно большой срок для jwt. У меня также была идея генерировать новый токен каждый раз, когда клиент входит в систему (со сроком действия 2 дня). Но если злоумышленник получает только 1 действующий токен, он также получает новые токены, не так ли?

Есть ли у вас какие-либо предложения?

Спасибо, ура!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
792
2

Ответы 2

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

При этом, если вы знаете, что токен украден, вы можете просто пометить его как недействительный на своем сервере, и ваше приложение его проигнорирует.

На практике это означает просто наличие токена в файле cookie, а также наличие идентификатора пользователя и других данных сеанса, хранящихся в таблице базы данных или в кеше на стороне сервера (например, в таблице mysql или кеше Redis).

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

что мне тогда использовать вместо JWT?;)

mcAngular2 25.10.2018 21:33

@ mcAngular2 Традиционный способ управления сеансом заключается в использовании идентификатора сеанса, который хранится в базе данных. Практически каждый фреймворк веб-приложений поддерживает это. Многие разработчики переходят на JWT, чтобы избежать доступа к базе данных, но, как мы видим, именно в том смысле, который вы подняли, это имеет последствия для безопасности. Если вы используете Oauth или соединение с открытым идентификатором, использование JWT является разумным при условии, что у вас короткое время жизни для токенов доступа, но вы не захотите делать это для токенов обновления.

TheGreatContini 25.10.2018 22:57

Я согласен с этим ответом. JWT не должен использоваться для управления сеансом. Для записи обратите внимание, что последние спецификации также позволяют привязать токен к текущему соединению (HTTPS или HTTP) от RFC8471 до RFC8473, предотвращая использование украденных токенов.

Spomky-Labs 27.10.2018 01:01

Другие вопросы по теме