Я создаю сервер nodejs с аутентификацией jwt.
На данный момент срок годности моих jwts составляет 1 месяц. Если пользователь переходит на страницу входа в систему, я проверяю, содержит ли его запрос действительный jwt, если да, ему не нужно вводить свое имя пользователя и пароль. Если он выходит из системы, jwt удаляется на стороне клиента, поэтому в следующий раз пользователю придется войти в систему со своими учетными данными.
Что делать, если злоумышленник прослушивает соединение (я уже использую ssl) и получает токен. Даже если пользователь выйдет из системы и получит новый токен в следующем сеансе, злоумышленник может выдать себя за пользователя со старым токеном, если он действителен, верно?
Является ли хорошей идеей хранить IAT «текущего» токена пользователя в БД и сравнивать его с IAT токена в запросе, чтобы избежать доступа злоумышленника?
Я знаю, 1 месяц - довольно большой срок для jwt. У меня также была идея генерировать новый токен каждый раз, когда клиент входит в систему (со сроком действия 2 дня). Но если злоумышленник получает только 1 действующий токен, он также получает новые токены, не так ли?
Есть ли у вас какие-либо предложения?
Спасибо, ура!
Сохраните токены и любые данные сеанса (например, идентификатор пользователя для вошедшего в систему пользователя) на сервере. Это дает вам полный контроль над данными и сеансами. Это также устраняет множество возможностей для злоупотреблений (что допускает стандарт JWT).
При этом, если вы знаете, что токен украден, вы можете просто пометить его как недействительный на своем сервере, и ваше приложение его проигнорирует.
На практике это означает просто наличие токена в файле cookie, а также наличие идентификатора пользователя и других данных сеанса, хранящихся в таблице базы данных или в кеше на стороне сервера (например, в таблице mysql или кеше Redis).
Ваши опасения - это как раз одна из причин того, что специалисты по безопасности советуют не использовать JWT для данных сеанса - см. Раздел «Вы не можете аннулировать отдельные токены JWT». Другими словами, единственный способ сделать токены JWT недействительными - это принудительно выполнить поиск в базе данных, когда он представлен, но это в первую очередь поражает всю точку JWT (большинство людей используют их, потому что они пытаются избежать поиска в базе данных. на сервере).
@ mcAngular2 Традиционный способ управления сеансом заключается в использовании идентификатора сеанса, который хранится в базе данных. Практически каждый фреймворк веб-приложений поддерживает это. Многие разработчики переходят на JWT, чтобы избежать доступа к базе данных, но, как мы видим, именно в том смысле, который вы подняли, это имеет последствия для безопасности. Если вы используете Oauth или соединение с открытым идентификатором, использование JWT является разумным при условии, что у вас короткое время жизни для токенов доступа, но вы не захотите делать это для токенов обновления.
Я согласен с этим ответом. JWT не должен использоваться для управления сеансом. Для записи обратите внимание, что последние спецификации также позволяют привязать токен к текущему соединению (HTTPS или HTTP) от RFC8471 до RFC8473, предотвращая использование украденных токенов.
что мне тогда использовать вместо JWT?;)