Как правильно обновлять jwt?

Хочу разобраться как правильно реализовать обновление jwt для web - приложения.

Путем гугления нашел ответ stackoverflow.com/questions/26739167/jwt-json-web-...
Но как я понял там предлагают хранить в самом токене время, когда текущий токен нужно заблокировать и выдать новый.
Т.е. получается, что если токен украдут, то его можно использовать до бесконечности т.к. при наличии токена и истечении времени обновления, выдается новый валидный токен. Или забиваем на проблему кражи токена, надеясь на HTTPS?

Еще натыкался на схему с jwt и refresh токеном, типа новый jwt можно получить только если предъявить refresh токен. В такой схеме я видел следующую ситуацию:
1. Клиент делает запрос на сервер передавая уже просроченный jwt
2. Сервер отдает 401/403
3. Чтобы конечному пользователю не проходить аутентификацию снова, клиент ловит эту 401/403 ошибку и делает запрос на получение нового jwt предъявив refresh
4. Сервер выдает новый jwt (и возможно плюс новый refresh токен еще) и клиент повторяет запрос №1 но уже с валидным jwt и все почти счастливы.
Для конечного пользователя такая схема, скорее всего, будет выглядеть долгой загрузкой страницы.

В итоге, как же правильно обновлять jwt, чтобы это было безопасно и конечный пользователь был доволен?
  • Вопрос задан
  • 5631 просмотр
Пригласить эксперта
Ответы на вопрос 2
DirecTwiX
@DirecTwiX
"display: flex;" уже предлагали?
cryto.net/~joepie91/blog/2016/06/19/stop-using-jwt...

jwt-flowchart.pngTL;DR Сессии - наше всё
Ответ написан
Комментировать
@Barmunk
У токена должен быть короткий срок жизни, к примеру 60 минут. После того, как токен протухнет у вас есть 2 выбора:

1. Авторизоваться заново по логину паролю и получить новый токен на 60 минут. В этом случае срок жизни токена минимален и можно не заботиться о его краже. Авторизация проходит раз в час, что усложняет кражу пароля, но если его и украдут, то срок жизни токена мизерный.

2. Воспользоваться методом рефреша просроченного токена. При этом такую возможность нужно ограничить временем, к примеру максимум 14 дней после истечения существующего токена.

Возможность выхода из сессии с занесением в черный список текущего еще действующего токена. Он может храниться прямо в кэше и удаляться, когда его время жизни закончится.

Я для себя выбрал первый вариант с возможностью выхода из сессии для особых параноиков. Если текущий токен будет украден, то клиент меняет пароль, а его выданный токен заносится в черный список. Через 60 минут можно считать, что клиента мы защитили. А рефреш я не стал делать, потому что в случае кражи могу не уследить за выданными или обновленными токенами.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы