Ручка украденная JWT?
Я создаю сервер nodejs с аутентификацией jwt.
На данный момент мой JWTS имеет срок годности 1 месяц. Если пользователь заходит на страницу входа в систему, я проверяю, содержит ли его запрос действительный jwt, если да, ему не нужно вводить свое имя пользователя и пароль. Если он выходит из системы, jwt удаляется на стороне клиента, поэтому пользователь должен войти в следующий раз со своими учетными данными.
Что делать, если злоумышленник прослушивает соединение (я уже использую ssl) и получает токен. Даже если пользователь выйдет из системы и получит новый токен в своем следующем сеансе, злоумышленник может выдать себя за пользователя старым токеном, если он действителен, верно?
Стоит ли хранить IAT "текущего" токена пользователя в БД и сравнивать его с IAT токена в запросе, чтобы избежать доступа злоумышленника?
Я знаю, 1 месяц - это довольно много для JWT. У меня также была идея сгенерировать новый токен, каждый раз, когда клиент входит в систему (со сроком действия 2 дня). Но если злоумышленник получает только 1 действующий токен, он также получает новые токены, не так ли?
У вас есть какие-нибудь предложения?
Спасибо, ура!
2 ответа
Ваши опасения как раз и являются одной из причин, по которой сотрудники службы безопасности советуют не использовать JWT для данных сеанса - см. Раздел "Нельзя аннулировать отдельные токены JWT". Другими словами, единственный способ аннулировать токены JWT - принудительно выполнить поиск в базе данных при его представлении, но это в первую очередь сводит на нет всю точку JWT (большинство людей используют их, потому что пытаются избежать поиска в базе данных). на сервере).
Сохраните токены и любые данные сеанса (например, идентификатор пользователя для вошедшего в систему пользователя) на сервере. Это дает вам полный контроль над данными и сессиями. Это также устраняет множество возможностей для злоупотреблений (что позволяет стандарт JWT).
При этом, если вы знаете, что токен украден, вы можете просто пометить его как недействительный на своем сервере, и ваше приложение проигнорирует его.
На практике это означает просто наличие токена в файле cookie и сохранение идентификатора пользователя и других данных сеанса в таблице базы данных или в кэше на стороне сервера (например, в таблице MySQL или кэше Redis).