Как правильно инвалидировать JWT токены?

Столкнулся с, на первый взгляд, не сложной задачей. А именно - как правильно инвалидировать токен? Например, если пользователь делает logout или изменяет свой пароль.

Коротко о задаче: есть обычное REST API, в котором часть функционала требует чтобы пользователь был авторизован. Это реализуем через JWT.

Поискав ответ в сети нашел несколько идей на этот счет:
  • На клиенте "забывать" токен
    Это самое простое решение, но реально токен ведь продолжает работать до тех пор, пока не истечет его срок жизни. А значит это решение не очень безопасно.

  • Хранить в БД blacklist с токенами
    Если пользователь инвалидирует токен, то мы записываем его в БД. И при каждом запросе проверяем нет ли переданного токена в черном списке. И, конечно, чистим базу по expire.
    Вполне жизнеспособный вариант, но тогда отчасти теряется смысл JWT.

  • Изменять secret
    Удобный вариант когда нужно инвалидировать токены у всех пользователей. Но если делать индивидуальный secret для каждого пользователя, то его нужно где-то хранить (снова БД?) и нельзя использовать более надежный алгоритм RS256. Кстати, дополнительный вопрос - есть ли смысл его использовать для web токенов?


Честно говоря, ни один из найденных мною вариантов мне не кажется полноценным решением. Есть чувство что я что-то упустил. Буду рад услышать любые мысли и советы на этот счет.
  • Вопрос задан
  • 3058 просмотров
Пригласить эксперта
Ответы на вопрос 1
VGrabko
@VGrabko
Golang, Php, Js
Для этого юзайте быстрое хранилище, а не бд (аля редис). В редисе храним секретный ключ для токенов (у каждого токена свой). При выходе обновляете ключ. Ну и конечно забываем на клиенте.

UPD.
В редисе записи вида
user_id : secret

По такой схеме и работают все.
Ответ написан
Ваш ответ на вопрос

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

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