私が取り組んでいる新しい 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