JWT ma być z założenia bezstanowy i dylemat o którym wspominasz jest jednym z głównych argumentów przemawiających za jego niestosowaniem do implementacji sesji użytkownika: http://cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions/
Niebezpieczeństwem przy stosowaniu JWT jest właśnie to, że pozostaje on aktywny po "wylogowaniu" przez ustalony czas. Możesz temu jakoś zaradzić, np:
- Tworząc black-listę nieaktywnych tokenów (zauważ jednak, że użycie JWT nie wiele Ci wtedy daje, bo za każdym razem i tak musisz robić zapytanie do bazy)
- Zmieniając fragment secret key do jego wygenerowania.
- Tworząc tokeny o bardzo krótkim czasie życia i refresh tokeny do pozyskania nowych.
Chcąc by autoryzacja JWT była jednocześnie wygodna dla użytkownika a zarazem bezpieczna musisz się dość napracować. O wiele lepszym rozwiązaniem jest więc najczęściej klasyczny system sesji.
Tu masz przykład dla node: https://www.youtube.com/watch?v=kmAzuH2Lzug
Generalnie bezstanowe tokeny są bardzo przydatne w innych sytuacjach (np. do autoryzacji między mikroserwisami, tworzenia tymczasowych jednorazowych linków itd...).