1. ホーム
  2. javascript

node.jsでパスワード変更やログアウト時にJWTを無効化するベストプラクティス?[クローズド]です。

2023-09-18 16:42:08

質問

パスワードやログアウトを変更する際に、DBを叩くことなくJWTを無効にするためのベストプラクティスを知りたいのですが。

上記の2つのケースをユーザーデータベースを叩くことで処理するために、以下のようなアイディアを持っています。

1.パスワードが変更された場合、ユーザーデータベースに保存されているパスワード(ハッシュ化されたもの)を確認する。

2.ログアウトした場合、ユーザーデータベースに最終ログアウト時刻が保存されているので、トークン作成時刻とログアウト時刻を比較することで、このケースを無効とすることができます。

しかし、これらの2つのケースは、ユーザがAPIにアクセスするたびにユーザデータベースをヒットさせるという代償を負っています。何かベストプラクティスがあれば、教えてください。

UPDATEです。 JWTを無効化する際に、データベースへの負荷がかからないようにできるとは思えません。そこで、私は解決策を考え出しました。私は私の答えを投稿しました、あなたが何か懸念がある場合、あなたは歓迎します。

どのように解決するのですか?

リフレッシュトークンを使用しない場合。

1.パスワード変更中 ユーザーが彼のパスワードを変更するとき、ユーザーdbの変更パスワードの時間を記録しなさい、従って変更パスワードの時間がトークン作成時間より大きいとき、そのトークンは有効でない。したがって、残りのセッションはすぐにログアウトされます。

2.ユーザーがログアウトした場合 ユーザーがログアウトするとき、別のDB(例えば:InvalidTokenDBとトークンの有効期限が切れたときにDBからトークンを削除する)にトークンを保存します。したがって、ユーザーはそれぞれのデバイスからログアウトし、他のデバイスの彼のセッションは邪魔されずに残っています。

したがって、JWTを無効化する間、私は以下のステップに従います。

  1. トークンが有効かどうかをチェックします。
  2. 有効な場合は、invalidTokenDB(ログアウトしたトークンが有効期限まで保存されるデータベース)に存在するかどうかを確認します。
  3. 存在しない場合は、ユーザーデータベースでトークン作成時刻とパスワード変更時刻を確認します。
  4. パスワード変更時刻とトークン作成時刻が一致した場合、トークンは有効です。

上記の方法での懸念点 :

  1. 各APIリクエストのために、私は上記のすべてのステップを実行する必要があり、パフォーマンスに影響を与える可能性があります。

Refreshトークンが使用される場合。 アクセストークンの有効期限は1日、リフレッシュトークンの有効期限は無期限です。

1. パスワード変更中。 ユーザーがパスワードを変更した場合、そのユーザーのリフレッシュトークンを変更します。そのため、残りのセッションはすぐにログアウトされます。

2. ユーザがログアウトした場合 : ユーザーがログアウトするとき、トークンを別のDB(例えばInvalidTokenDB)に保存し、トークンの期限が切れたときにDBからトークンを削除します。したがって、ユーザーはそれぞれのデバイスからログアウトし、他のデバイスの彼のセッションは邪魔されずに残っています。

したがって、JWTを無効化する間、私は以下のステップに従います。

  1. トークンが有効かどうかをチェックする
  2. 有効な場合、InvalidTokenDBにトークンが存在するかどうかを確認します。
  3. 存在しない場合、userDBのリフレッシュトークンと照合します。
  4. 等しい場合は、有効なトークンです。

上記の方法での懸念点 :

  1. 各APIリクエストのために、私は上記のすべてのステップを実行する必要があり、パフォーマンスに影響を与える可能性があります。
  2. どのように私はリフレッシュトークンを無効にするには、リフレッシュトークンは、それがハッカーによって使用される場合、まだ認証が有効なものであるとして、有効性を持っていない、常に要求が成功することになります。

ノート : Hanz はリフレッシュトークンを安全にする方法を Token-based AuthenticationでRefesh Tokenを使用することは安全ですか? にて、リフレッシュトークンを保護する方法を提案していますが、何を言っているのか理解できません。何か助言を頂ければ幸いです。

というわけで、もしどなたかいい提案があれば、コメントをお待ちしています。

UPDATEです。 あなたのアプリが有効期限付きのリフレッシュトークンを必要としない場合に備えて、私は回答を追加しています。この回答は Sudhanshu ( https://stackoverflow.com/users/4062630/sudhanshu-gaur ). Sudhanshuさん、ありがとうございます。なので、これが一番いい方法だと思います。

リフレッシュトークンが不要で、アクセストークンの有効期限もない場合。

ユーザがログインしたときに、そのユーザのデータベースに有効期限なしのログイントークンを作成します。

したがって、JWTを無効化する場合は、以下の手順で行います。

  1. ユーザー情報を取得し、そのトークンがユーザーデータベースにあるかどうかを確認します。もしあれば、許可する。
  2. ユーザがログアウトしたら、そのユーザのデータベースからこのトークンだけを削除する。
  3. ユーザーがパスワードを変更した場合、ユーザーデータベースからすべてのトークンを削除し、再度ログインするよう要求します。

このアプローチでは、上記のケースで必要だった、ログアウトトークンを有効期限までデータベースに保存したり、パスワード変更時にトークン作成時刻を保存したりする必要がありません。しかし、この方法は、リフレッシュトークンが不要で、トークンの有効期限がないアプリの要件がある場合のみ有効だと思います。

もし、このアプローチに懸念がある方がいらっしゃいましたら、ぜひ教えてください。コメントをお待ちしています。)