[解決済み] JSONウェブトークンの無効化
質問
私が取り組んでいる新しい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
関連
-
JavaScriptの関数この指摘の問題を説明
-
[解決済み] 配列の結合時に未定義のプロパティ 'push' を読み込むことができない
-
[解決済み】「.addEventListener is not a function」なぜこのエラーが発生するのか?
-
[解決済み] なぜGoogleはJSONレスポンスにwhile(1);を前置するのでしょうか?
-
[解決済み] JavaScriptでJSONをきれいに印刷する
-
[解決済み] 画面サイズ、現在のウェブページ、ブラウザウィンドウのサイズを取得する
-
[解決済み] Reduxの非同期フローになぜミドルウェアが必要なのか?
-
[解決済み] セッションとは何ですか?どのように機能するのですか?
-
[解決済み】「ログインしたままにする」 - 最適な方法とは?
-
[解決済み】セッションは本当にRESTfulnessに違反するのか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
JavaScriptの関数この指摘の問題を説明
-
親子コンポーネント通信を解決する3つのVueスロット
-
WeChatアプレット用ユニアプリによるグローバルシェアリング
-
VUEグローバルフィルターの概念と留意点、基本的な使い方
-
[解決済み】最大呼び出しスタックサイズ超過エラー
-
[解決済み] テスト
-
[解決済み】Node.js getaddrinfo ENOTFOUND
-
[解決済み] TypeError: $.ajax(...) is not a function?
-
[解決済み】<select>で現在選択されている<option>をJavaScriptで取得するにはどうすればよいですか?
-
フロントエンド null のプロパティ 'disabled' を読み取れない 問題が解決された