TLDR:ある時点でトークンを取り消す機能が必要な場合は、はい、Redisなどの高速なものに保存してください。
JWTを使用することの十分に文書化された欠点の1つは、たとえばユーザーがログアウトする必要がある場合やトークンが侵害された場合に、トークンを取り消す簡単な方法がないことです。トークンを取り消すということは、あるストレージでトークンを検索してから、次に何をするかを決定することを意味します。 JWTのポイントの1つは、dbへのラウンドトリップを回避することであるため、適切な妥協案は、rdbmsよりも負担の少ないものに格納することです。これはRedisにとって完璧な仕事です。
コメントで示唆されているように、良いアプローチは、リストをブラックリスト(つまり、無効化されたトークンのリスト)にすることです。リクエストごとにリストを検索して、トークンがリストに存在しないことを確認します。確率的アルゴリズムを使用してトークンを格納することにより、ルックアップステップ中のメモリスペースとパフォーマンスをさらに向上させることができます。簡単なアプローチは、階層化されたルックアップを作成することです。たとえば、ブラックリストに登録されたトークンの最初の数バイト(1〜4バイトなど)のみを追跡する小さなアプリ内ストアを作成できます。次に、redisキャッシュは、同じトークンのもう少し完全なバージョン(たとえば、最初の2〜8バイト)を追跡します。その後、より永続的なソリューション(ファイルシステム、rdbmsなど)を使用して、ブラックリストに登録されたトークンのフルバージョンを保存できます。これは、トークンがブラックリストにないことをすばやく確認する楽観的なルックアップ戦略です(これはより一般的なケースです)。ルックアップされているトークンがアプリ内ブラックリストのアイテムと一致する場合(最初の数バイトが一致するため)、redisストアでの追加のルックアップに移動し、必要に応じて永続ストアに移動します。一部(またはすべて)のストアは、試行またはハッシュテーブルとして実装される場合があります。考慮すべきデータ構造を実装するためのもう1つの効率的で比較的簡単なものは、ブルームフィルターと呼ばれるものです。
明らかに、何百万もの長持ちするトークンを定期的にブラックリストに登録する場合は、上記のアプローチを採用する必要があります(これは、別の問題があることを示している場合もあります)。