web-dev-qa-db-ja.com

node.jsでパスワードを変更してログアウトするときにJWTを無効にするベストプラクティス

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

ユーザーデータベースにアクセスすることにより、上記の2つのケースを処理するための以下のアイデアがあります。 1.パスワードが変更された場合は、ユーザーdbに保存されているパスワード(ハッシュ)を確認しますこのケースを無効にします。

しかし、これらの2つのケースは、ユーザーがAPIにアクセスするたびにユーザーDBにアクセスするという犠牲を払っています。ベストプラクティスはありがたいです。

6
Gopinath Shiva

DBにアクセスしない限り、解決策はありません。ルックアップの数を2つではなく1つに減らすこともできます。

パスワード変更時にまたはログアウトすると、CSPRNGによって生成された128ビットの数値がユーザーテーブルのそのユーザーの行に書き込まれます。

このCSPRNGはJWTの一部を形成します。すべてのアクセスで、JWTの数値がDBに保存されている値と一致することを確認する必要があります。 MACがこの値を超えて計算されることにも利点はありません。JWTに保持するだけなので、すべてが1か所にあります。

これは、そもそもJWTを使用する目的に反します。サーバー側でチェックされるセッショントークンを使用することもできます。ただし、JWTが期限切れになると、有効期限が過去の日付を受け入れることができないため、個々のセッションをサーバー側で維持する必要がないという利点があります。

別の欠点は、同じユーザーに対して2つのセッションがある場合、一方をログアウトすると他方がログアウトされることです。また、ロジックはサーバー側の管理対象システムよりも複雑であり、複雑すぎるとセキュリティが低下する傾向があります。

3
SilverlightFox

古いJWTトークンの更新を禁止するメカニズムを使用して、JWTトークンに短い存続時間を使用し、それらを頻繁に更新させることができます。 JWTには、DBに保存したものと比較できる自動更新トークンが必要です。これは、少なくとも、更新サイクルごとにデータベースにアクセスすることを意味します。これを5分に設定できます。これは、すべてのクライアントからWebへのトランザクションよりもはるかに少ないトラフィックです。

しかし、考えてみてください。これは非常に高度なメンテナンスソリューションです。実際にすべてのデバイスのログアウトを要求するユーザーはごくわずかです。

推奨されるソリューション:

選択したいくつかのIDを信頼しないようにエージェントに伝えたい場合は、どうしますか?たまに、「ブラックリスト」の記録をときどき更新するように依頼するでしょう。これで、更新をx分ごとにチェックする「ステートレス」Webサービスはごくわずかです。まだ期限が切れていない、事前に無効化されたJWTトークンのブラックリストを保持するだけで済みます。

このソリューションは拡張可能で、通常は必要ありません(即時トークンを期限切れにします。仮にそうしたとしても、すべてのトークンを無効にする要求を出すのが遅すぎる可能性があるので、60秒の違いは何ですか?非常に重要なアクションを実行する必要がある場合(核兵器を起動しますか?)-おそらくエンドユーザーに、そのアクションについてリアルタイムで再認証するように依頼する必要があります。

1
Alex Worden

JWTのベストプラクティスはnotデータベースまたはキャッシュを使用することです。JWTの全体的な考え方はステートレスな検証チェックです。ユーザーIDをトークンペイロード内に保存し、必要に応じて、セッションIDなどを同期する必要があります。

長いランダムなユーザーIDを使用するようにしてください。攻撃者がトークンを偽造した場合、連続したIDとは異なり、1人のユーザーのみを危険にさらし、他のユーザーにアクセスすることはできません。

0
Kof

リクエストごとにデータベースをチェックせずにJWTを無効にする方法はないと思います。

最善のアイデアは、短い有効期限でアクセストークンJWTを発行し、アクセストークンを更新する必要がある場合は更新トークンを利用することです。

この方法では、トークンをすぐに無効にすることはできませんが、少なくともトークンは有効期限が切れるまでしか使用できません。更新トークンを使用すると、認証コードは新しいアクセストークンを発行するかどうかを決定できます。

でも気になるのは、パスワードを変更しただけでJWTを無効にする必要があるのはなぜですか。その時点でログアウトを強制する理由はありますか? JWTにはパスワードが含まれていないため、変更されたパスワードがJWTに実際に影響を与えることはありません。

ユーザーを無効にする必要があるのは、ユーザーの権限が変更されたか、取り消された場合のみです。

ログアウトは通常、ユーザーが開始するアクションです。この場合、クライアントは、ユーザーが現在持っているJWTトークンを単にクリア/リセット/削除できます。

0
user1751825