jwtを使用してノードによって生成されたトークンをどこに保存するかについての簡単な説明

jwtを使用してノードによって生成されたトークンをどこに保存するかについての簡単な説明

A: 通常はクライアントに保存されます。

jwt または JSON Web Token は、リクエストの ID 情報と ID 権限を確認するために一般的に使用される認証プロトコルです。

今朝、あるウェブサイトを閲覧していたとき、この質問をしているクラスメイトに会いました。彼は、jwt の保存場所について非常に興味を持っていました。私はたまたま少し前にこのテーマを勉強していたので、招待されなくてもこの質問に答えることに躊躇しません。
最初は、このトークンをどのように保存するかについても興味があり、このトークンを保存するために redis を使用することを考えていました。

その後、調査の結果、サーバーはこのトークンを保存する必要がないことがわかりました。クライアントは保存するだけでよく、どのような方法を使用するかは関係ありません。ユーザーにメモを書いてポケットに入れるように依頼することもできます。

それで、このトークンはどのように機能するのでしょうか?

まず、従来のセッション アプローチである、サーバー側のストレージを必要とする操作について説明します。

まず、ユーザーをログインさせるには、サーバー上でログイン テーブルを維持する必要があります。このログイン テーブルは、キャッシュまたはデータベースに配置できます。
ユーザーがログインすると、ユーザー情報がログイン テーブルに書き込まれ、ログイン ID (セッションとも呼ばれる) が生成されます。このセッションはクライアントに返され、クライアントは次回の要求時にこの情報を表示できます。

フロントエンドの担当者にとって、このプロセスは通常は気付かれません。バックエンドの担当者は、set-cookie と呼ばれる HTTP ヘッダー フィールドを使用して、データをブラウザの Cookie に書き込みます。その後、リクエストを行う際に、ブラウザはリクエスト ヘッダー自体に Cookie を書き込みます。

クライアントがサーバーへのログインを要求すると、サーバーは Cookie 内のセッションを取得し、ログイン テーブルでユーザー情報を検索し、ユーザーの権限を確認して、通常のビジネス インタラクションを完了します。

さて、さまざまな理由から、ログイン テーブルを維持したくありません。どうすればよいでしょうか?
簡単です。ユーザー情報をクライアントに送信し、クライアントが毎回ユーザー情報を取得できるようにします。このようにすると、リクエストが来たときにテーブルを確認する必要すらなく、どのユーザーがリクエストを行っているかを直接知ることができます。

しかし、この方法では、ユーザーの情報が露出してしまいます。仲介業者は、このような直接的な要求を最も好みます。仲介業者は、数日間、あなたのサーバー ポートに腰掛けて座り、データベース内のすべての関連情報が他の人に明らかに露出することになります。

これは絶対にうまくいかないので、どうすればいいでしょうか?

パスワードを追加して混乱させるだけです。こうすることで、あなたのトークンを入手した人たちはしばらく混乱し、おそらく不注意に立ち去るでしょう。そして、十分に準備された少数の人たち (KPI) だけが、それを解読するのに苦労することになります。

サーバーで復号すると、ユーザー情報が取得されます。同様に、暗号文に有効期限も書き込みます。有効期限が切れると、401 エラーでログイン ページにジャンプします。このようにして、ログイン資格情報のバックエンドストレージを必要としないソリューションが開発されます。

これは、jwt の最も基本的な動作原理です。つまり、ID 情報は安全に保管するためにクライアントに引き渡されます。

jwt によって生成されるトークンは、ヘッダー、ペイロード、署名の 3 つの部分で構成され、小数点「.」で区切られます。

ヘッダー、つまりヘッダー情報はトークンの基本情報を記述し、JSON 形式です。

{
    "アルゴリズム":"HS256",
    "タイプ":"JWT"
}

alg は署名部分を生成するために使用される暗号化アルゴリズムを表し、typ はトークンが jwt タイプであることを示します。

ペイロードはユーザーデータであり、これも json 形式です。ただし、JWT では、仕様上、ペイロードはヘッダーと同じであり、base64 で一度だけエンコードされてトークンに表示されるため、機密データを入れることは推奨されていません。

署名は、このトークンの署名です。通常は、前のヘッダーとペイロードを、自分で定義した秘密鍵文字列とともに暗号化して生成される文字列です。

前述のように、jwt はペイロードの内容を base64 でエンコードするだけなので、攻撃者がコンテンツを変更するのは非常に簡単です。ただし、攻撃者は秘密鍵を知らないため、変更後に正しい署名を生成することはできません。暗号化を使用してリクエストの header.payload を再度検証し、署名と一致しないことを発見します。この時点で、誰かが問題を引き起こしていることを明確に知ることができ、サーバーがダウンしているふりをするために直接 500 を返すことができます。
より安全にしたい場合は、プロセス全体を通じてリクエスト通信に https プロトコルを使用することをお勧めします。

もちろん、これがどのように機能するかを理解した今、ペイロードを再度暗号化してから gzip 圧縮するなど、独自の不快な仕様を思いつくことは不可能ではありません。

では、jwt を使用する利点は何でしょうか?

最初のポイントは、サーバーがログイン テーブルを維持する必要がないため、特にユーザー数が多い場合にスペースを節約できることです。
2 つ目のポイントは、トラブルを起こさず、コンテンツを表現するために JSON 形式を忠実に守れば、拡張は簡単だということです。
3 つ目のポイントは、ステートレスであることです。サーバーがパースをサポートしていれば、業務を遂行できます。セッションを共有したりマシンを追加したりするために特別な仕組みを設ける必要はありません。
4つ目に、さまざまなクライアントをサポートしており、Cookieをサポートしていなくてもプレイできます。
欠点は、リクエストが行われるたびにこれらのデータをやり取りする必要があり、リクエストの内容が確実に増加することです。さらに、リクエストが届くたびに、それを検証し、ヘッダーとペイロードを暗号化し、署名を検証する必要があり、これによってもリクエストの処理時間が長くなります。従来の操作と比較すると、これは実際には時間とスペースのトレードオフです。最終的には、選択次第です。

jwt を使ってノードが生成したトークンをどこに保存するかについてはこれで終わりです。jwt で生成したトークンをどこに保存するかについての詳細は、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • SpringBootはJWTを統合してトークンを生成し、メソッドプロセス分析を検証します。
  • Laravel5.5はトークンを生成するためにjwt-authをインストールします。トークンの例
  • Java で JWT を使用してインターフェース認証用のトークンを生成する方法

<<:  Windows に Docker をインストールする詳細なチュートリアル

>>:  MySQLデータベースのスケジュールバックアップを実装する方法

推薦する

vscodeを使用してuniappを開発する方法

私はフロントエンド プロジェクトの開発に常に vscode を使用してきたため、現在ではいくつかの小...

JS 面接の質問: forEach はループから抜け出すことができますか?

この質問をされたとき、私は無知で頭が真っ白になりました。もちろん、正しく答えられませんでした。私はず...

Vue 仮想 DOM クイックスタート

目次仮想DOM仮想DOMとは何か仮想DOMの役割Vue の仮想 DOM vノードvNodeとはvNo...

dockerコンテナがIP経由でホストマシンにアクセスできない問題を解決する方法の詳細な説明

問題の起源docker を使用する場合、残念ながら docker コンテナ内のホストのポート 80 ...

リストループスクロールを実現するための HTML+CSS+JavaScript サンプルコード

説明: 指定された時間内に前のノードのコンテンツを置き換えるタイマーを設定します。 1. キーコード...

clipboard.js の使用法の概要

目次(1)はじめに: (2)クリップボードの内容をコピーする方法は次のとおりです。 (3)関数演算に...

Win10 の組み込み Linux システムを使用して Spring Boot プロジェクトを開始する方法

1. Windows10の組み込みLinuxサブシステムをインストールする1.1. Linuxサブシ...

エンコードが utf-8 に設定されている場合に Web ページが文字化けする問題の解決策

最近、PHP で Web ページを書いているときに、エンコードを UTF-8 に設定しました。しかし...

JS 開発効率を上げる4つの超実践的なヒント

目次1. 短絡判定2. オプション連鎖演算子 (?) 3. ヌル合体演算子 (??) 4. 終了関数...

テーブルはセルとimg画像を結合してtd HTML全体を埋めます

ソースコード(一部のクラスは削除されています):コードをコピーコードは次のとおりです。 <テー...

MySQL で sum 関数を使用する例のチュートリアル

導入今日は、MySQL の sum 関数の使い方を紹介します。この関数は、MySQL データベースを...

React は antd のアップロード コンポーネントを使用してファイル フォーム送信機能を実装します (完全なコード)

私はプロジェクトを実行するために react を使い始めたばかりで、非常に未熟で完全な初心者です。私...

MySQL の重複データの処理方法 (防止と削除)

一部の MySQL テーブルには重複レコードが含まれている場合があります。重複データが存在することを...

MySql キャッシュ クエリの原理とキャッシュ監視およびインデックス監視の概要

クエリキャッシュ1. クエリキャッシュの動作原理クエリ ステートメントを実行する前に、MySQL は...

VMware Workstation 14 Pro(仮想マシン)にシステムをインストールする方法の詳細な説明

この記事では、VMware Workstation 14 Pro (仮想マシン) にシステムをインス...