node.jsでパスワード変更やログアウト時にJWTを無効化するベストプラクティス?[クローズド]です。
質問
パスワードやログアウトを変更する際に、DBを叩くことなくJWTを無効にするためのベストプラクティスを知りたいのですが。
上記の2つのケースをユーザーデータベースを叩くことで処理するために、以下のようなアイディアを持っています。
1.パスワードが変更された場合、ユーザーデータベースに保存されているパスワード(ハッシュ化されたもの)を確認する。
2.ログアウトした場合、ユーザーデータベースに最終ログアウト時刻が保存されているので、トークン作成時刻とログアウト時刻を比較することで、このケースを無効とすることができます。
しかし、これらの2つのケースは、ユーザがAPIにアクセスするたびにユーザデータベースをヒットさせるという代償を負っています。何かベストプラクティスがあれば、教えてください。
UPDATEです。 JWTを無効化する際に、データベースへの負荷がかからないようにできるとは思えません。そこで、私は解決策を考え出しました。私は私の答えを投稿しました、あなたが何か懸念がある場合、あなたは歓迎します。
どのように解決するのですか?
リフレッシュトークンを使用しない場合。
1.パスワード変更中 ユーザーが彼のパスワードを変更するとき、ユーザーdbの変更パスワードの時間を記録しなさい、従って変更パスワードの時間がトークン作成時間より大きいとき、そのトークンは有効でない。したがって、残りのセッションはすぐにログアウトされます。
2.ユーザーがログアウトした場合 ユーザーがログアウトするとき、別のDB(例えば:InvalidTokenDBとトークンの有効期限が切れたときにDBからトークンを削除する)にトークンを保存します。したがって、ユーザーはそれぞれのデバイスからログアウトし、他のデバイスの彼のセッションは邪魔されずに残っています。
したがって、JWTを無効化する間、私は以下のステップに従います。
- トークンが有効かどうかをチェックします。
- 有効な場合は、invalidTokenDB(ログアウトしたトークンが有効期限まで保存されるデータベース)に存在するかどうかを確認します。
- 存在しない場合は、ユーザーデータベースでトークン作成時刻とパスワード変更時刻を確認します。
- パスワード変更時刻とトークン作成時刻が一致した場合、トークンは有効です。
上記の方法での懸念点 :
- 各APIリクエストのために、私は上記のすべてのステップを実行する必要があり、パフォーマンスに影響を与える可能性があります。
Refreshトークンが使用される場合。 アクセストークンの有効期限は1日、リフレッシュトークンの有効期限は無期限です。
1. パスワード変更中。 ユーザーがパスワードを変更した場合、そのユーザーのリフレッシュトークンを変更します。そのため、残りのセッションはすぐにログアウトされます。
2. ユーザがログアウトした場合 : ユーザーがログアウトするとき、トークンを別のDB(例えばInvalidTokenDB)に保存し、トークンの期限が切れたときにDBからトークンを削除します。したがって、ユーザーはそれぞれのデバイスからログアウトし、他のデバイスの彼のセッションは邪魔されずに残っています。
したがって、JWTを無効化する間、私は以下のステップに従います。
- トークンが有効かどうかをチェックする
- 有効な場合、InvalidTokenDBにトークンが存在するかどうかを確認します。
- 存在しない場合、userDBのリフレッシュトークンと照合します。
- 等しい場合は、有効なトークンです。
上記の方法での懸念点 :
- 各APIリクエストのために、私は上記のすべてのステップを実行する必要があり、パフォーマンスに影響を与える可能性があります。
- どのように私はリフレッシュトークンを無効にするには、リフレッシュトークンは、それがハッカーによって使用される場合、まだ認証が有効なものであるとして、有効性を持っていない、常に要求が成功することになります。
ノート : Hanz はリフレッシュトークンを安全にする方法を Token-based AuthenticationでRefesh Tokenを使用することは安全ですか? にて、リフレッシュトークンを保護する方法を提案していますが、何を言っているのか理解できません。何か助言を頂ければ幸いです。
というわけで、もしどなたかいい提案があれば、コメントをお待ちしています。
UPDATEです。 あなたのアプリが有効期限付きのリフレッシュトークンを必要としない場合に備えて、私は回答を追加しています。この回答は Sudhanshu ( https://stackoverflow.com/users/4062630/sudhanshu-gaur ). Sudhanshuさん、ありがとうございます。なので、これが一番いい方法だと思います。
リフレッシュトークンが不要で、アクセストークンの有効期限もない場合。
ユーザがログインしたときに、そのユーザのデータベースに有効期限なしのログイントークンを作成します。
したがって、JWTを無効化する場合は、以下の手順で行います。
- ユーザー情報を取得し、そのトークンがユーザーデータベースにあるかどうかを確認します。もしあれば、許可する。
- ユーザがログアウトしたら、そのユーザのデータベースからこのトークンだけを削除する。
- ユーザーがパスワードを変更した場合、ユーザーデータベースからすべてのトークンを削除し、再度ログインするよう要求します。
このアプローチでは、上記のケースで必要だった、ログアウトトークンを有効期限までデータベースに保存したり、パスワード変更時にトークン作成時刻を保存したりする必要がありません。しかし、この方法は、リフレッシュトークンが不要で、トークンの有効期限がないアプリの要件がある場合のみ有効だと思います。
もし、このアプローチに懸念がある方がいらっしゃいましたら、ぜひ教えてください。コメントをお待ちしています。)
関連
-
[解決済み] チェックボックスが選択されているかどうかを確認するjQuery
-
[解決済み] javascript の関数から `undefined` と `null` のどちらを返すのが良いのでしょうか?
-
[解決済み] CORS OriginヘッダーとCSRFトークンによるCSRF保護
-
[解決済み] 無効になっている入力フィールドの値を送信する
-
[解決済み] jqueryはjavascriptのライブラリなのかフレームワークなのか?[クローズド]
-
[解決済み] イテレータでmap()を使用する
-
[解決済み] CORS: 認証モードは 'include' です。
-
[解決済み] Chromeのwebkitインスペクタで「Unsafe JavaScript attempt to access frame with URL...」というエラーが継続的に発生する。
-
[解決済み] jQueryのバージョン1、バージョン2、バージョン3の違いは何ですか?[クローズド]
-
[解決済み] ログアウト時にJWTトークンを破棄するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JWT(JSONウェブトークン)の有効期限を自動的に延長する機能
-
[解決済み] JavaScriptで次の要素/前の要素を取得しますか?
-
[解決済み] チェックボックスが選択されているかどうかを確認するjQuery
-
[解決済み] reactのrender関数でdynamic hrefを作成するには?
-
[解決済み] URL/アドレスバーからJavascriptの関数を呼び出す
-
[解決済み] bootstrap のポップオーバーがすべての要素の上に表示されない
-
[解決済み] react-routerのハッシュフラグメントからクエリパラメータを取得する
-
[解決済み] javascriptで文字列から関数を作成する方法はありますか?
-
[解決済み] AJAX Mailchimp サインアップフォームの統合
-
[解決済み] JavaScriptでDIVを表示・非表示にするには?