1. ホーム
  2. javascript

[解決済み] JSONウェブトークンの無効化

2022-03-18 04:31:01

質問

私が取り組んでいる新しいnode.jsプロジェクトでは、JSON Web Tokens(jwt)を使用して、クッキーベースのセッションアプローチ(これは、ユーザーのブラウザでユーザーセッションを含むキーバリューストアにIDを格納することを意味します)からトークンベースのセッションアプローチ(キーバリューストアなし)に切り替えようと思っています。

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

jwt Approachを使用して、サーバーからどのようにトークンとセッションの無効化を行うのでしょうか?

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

そこで、次のようなものがあるとします(以下、引用元)。 これ これ ):

セッションストアのログイン。

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) 単純にクライアントからトークンを削除する。

もちろん、これはサーバー側のセキュリティには何の役にも立ちませんが、トークンの存在を消すことで攻撃者を止めることができます(つまり、ログアウト前にトークンを盗まなければならない)。

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

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

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

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

コンティンジェンシープラン

緊急事態が発生した場合、またはユーザートークンが漏洩した場合、ユーザが自分のログイン情報を使ってユーザ検索IDを変更できるようにすることができます。この場合、関連するユーザーを見つけることができなくなるため、関連するすべてのトークンを無効にすることができます。

また、トークンに最終ログイン日時を含めると、一定期間後に再ログインを強制することができるので、良いアイデアだと思います。

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