ここで何かが欠けているかどうかはわかりませんが、受け入れられた答えは必要以上に複雑であることがわかりました。
API リクエストごとにトークンを検証または無効化するには、db をヒットする必要があることがわかりますが、ここにあるように、全体のプロセスはより簡単になる可能性があります。
jwt が作成されるたびに、つまりログイン時またはパスワードの変更/リセット時に、ユーザー ID を持つ jwt をテーブルに挿入し、各 jwt の jti (基本的には uuid 番号) を維持します。同じ jti が jwt ペイロードにも入ります。事実上、jti は jwt を一意に識別します。アカウントが複数のデバイスまたはブラウザーからアクセスされる場合、ユーザーは同時に複数の jwt を持つことができます。この場合、jti はデバイスまたはユーザー エージェントを区別します。
したがって、テーブル スキーマは次のようになります。ユーザーID。(そしてもちろん主キー)
各 API について、jti がテーブルにあるかどうかを確認します。これは、jwt が有効であることを意味します。
ユーザーがパスワードを変更またはリセットすると、そのユーザー ID のすべての jti がデータベースから削除されます。新しい jti を持つ新しい jwt を作成してテーブルに挿入します。これにより、パスワードを変更またはリセットしたものを除く、他のすべてのデバイスおよびブラウザーからのすべてのセッションが無効になります。
ユーザーがログアウトするとき、そのユーザーの特定の jti を削除しますが、すべてではありません。シングル ログインはありますが、シングル ログアウトはありません。そのため、ユーザーがログアウトするときに、すべてのデバイスからログアウトする必要はありません。ただし、すべての jtis を削除すると、すべてのデバイスからもログアウトされます。
したがって、それは 1 つのテーブルであり、日付の比較はありません。また、リフレッシュ トークンを使用する場合も使用しない場合も同様です。
ただし、データベースの干渉と遅延の可能性を最小限に抑えるために、キャッシュの使用は処理時間の面で物事を容易にするのに役立ちます。
注:反対票を投じる場合は、理由を付けてください。