JSON Web Token の無効化 質問する

JSON Web Token の無効化 質問する

私が取り組んでいる新しい node.js プロジェクトでは、Cookie ベースのセッション アプローチ (つまり、ユーザーのブラウザー内のユーザー セッションを含むキー値ストアに ID を保存する) から、JSON Web Token (jwt) を使用するトークン ベースのセッション アプローチ (キー値ストアなし) に切り替えることを考えています。

このプロジェクトは socket.io を利用するゲームです。トークンベースのセッションは、単一のセッション (Web と socket.io) に複数の通信チャネルが存在するようなシナリオで役立ちます。

jwt アプローチを使用してサーバーからトークン/セッションの無効化を提供するにはどうすればよいでしょうか?

また、この種のパラダイムで注意すべき一般的な(または一般的でない)落とし穴や攻撃についても理解したいと思いました。たとえば、このパラダイムは、セッション ストア/Cookie ベースのアプローチと同じ/異なる種類の攻撃に対して脆弱であるかどうかなどです。

そこで、次のようなものがあったとします(これそしてこれ):

セッションストアログイン:

app.get('/login', function(request, response) {
    var user = {username: request.body.username, password: request.body.password };
    // Validate somehow
    validate(user, function(isValid, profile) {
        // Create session token
        var token= createSessionToken();

        // Add to a key-value database
        KeyValueStore.add({token: {userid: profile.id, expiresInMinutes: 60}});

        // The client should save this session token in a cookie
        response.json({sessionToken: token});
    });
}

トークンベースのログイン:

var jwt = require('jsonwebtoken');
app.get('/login', function(request, response) {
    var user = {username: request.body.username, password: request.body.password };
    // Validate somehow
    validate(user, function(isValid, profile) {
        var token = jwt.sign(profile, 'My Super Secret', {expiresInMinutes: 60});
        response.json({token: token});
    });
}

--

セッション ストア アプローチのログアウト (または無効化) には、指定されたトークンを使用して KeyValueStore データベースを更新する必要があります。

トークン自体に通常はキー値ストアに存在する情報が含まれるため、トークンベースのアプローチではこのようなメカニズムは存在しないようです。

ベストアンサー1

私もこの質問について調査してきましたが、以下のアイデアはどれも完全な解決策ではありませんが、他の人のアイデアを排除したり、さらなるアイデアを提供したりすることに役立つかもしれません。

1) クライアントからトークンを削除するだけです

明らかに、これはサーバー側のセキュリティには何の役にも立ちませんが、トークンを存在から削除することで攻撃者を阻止します (つまり、ログアウトする前にトークンを盗む必要があります)。

2) トークンブロックリストを作成する

無効なトークンを最初の有効期限まで保存し、受信したリクエストと比較することができます。ただし、すべてのリクエストでデータベースにアクセスする必要があるため、最初から完全にトークンベースにする理由がなくなるようです。ただし、ログアウトと有効期限の間のトークンのみを保存する必要があるため、ストレージ サイズは小さくなる可能性があります (これは直感であり、コンテキストに大きく依存します)。

3) トークンの有効期限を短くし、頻繁にローテーションする

トークンの有効期限を十分に短い間隔に保ち、実行中のクライアントに追跡させて、必要に応じて更新を要求するようにすれば、1 番は完全なログアウト システムとして効果的に機能します。この方法の問題点は、クライアント コードを閉じるまでの間、ユーザーをログイン状態に保つことが不可能になることです (有効期限間隔をどのくらい長くするかによって異なります)。

緊急時対応計画

緊急事態が発生した場合、またはユーザー トークンが侵害された場合、ユーザーがログイン資格情報を使用して基礎となるユーザー検索 ID を変更できるようにすることが 1 つの方法です。これにより、関連付けられているユーザーが見つからなくなるため、関連付けられているすべてのトークンが無効になります。

また、一定期間後に再ログインを強制できるように、トークンに最終ログイン日を含めることもお勧めします。

トークンを使用した攻撃に関する類似点/相違点に関して、この投稿では次の質問に答えます。https://github.com/dentarg/auth0-blog/blob/master/_posts/2014-01-07-angularjs-authentication-with-cookies-vs-token.markdown

おすすめ記事