Столкнулся с, на первый взгляд, не сложной задачей. А именно - как правильно инвалидировать токен? Например, если пользователь делает logout или изменяет свой пароль.
Коротко о задаче: есть обычное REST API, в котором часть функционала требует чтобы пользователь был авторизован. Это реализуем через JWT.
Поискав ответ в сети нашел несколько идей на этот счет:
- На клиенте "забывать" токен
Это самое простое решение, но реально токен ведь продолжает работать до тех пор, пока не истечет его срок жизни. А значит это решение не очень безопасно.
- Хранить в БД blacklist с токенами
Если пользователь инвалидирует токен, то мы записываем его в БД. И при каждом запросе проверяем нет ли переданного токена в черном списке. И, конечно, чистим базу по expire.
Вполне жизнеспособный вариант, но тогда отчасти теряется смысл JWT.
- Изменять secret
Удобный вариант когда нужно инвалидировать токены у всех пользователей. Но если делать индивидуальный secret для каждого пользователя, то его нужно где-то хранить (снова БД?) и нельзя использовать более надежный алгоритм RS256. Кстати, дополнительный вопрос - есть ли смысл его использовать для web токенов?
Честно говоря, ни один из найденных мною вариантов мне не кажется полноценным решением. Есть чувство что я что-то упустил. Буду рад услышать любые мысли и советы на этот счет.