banner
ホームページ / ブログ / JSON Web トークン (JWT): 安全に使用するためのキー
ブログ

JSON Web トークン (JWT): 安全に使用するためのキー

Jul 19, 2023Jul 19, 2023

数週間前、開発同僚の一部が、新しいツールの統合の一環として行っている JSON Web トークン (JWT) の生成についての懸念を私たちに伝えました。 彼らは「かなりの数の」セキュリティ問題について聞いており、発行されたトークンが正しく、いくつかの基本的なセキュリティ要件を満たしているかどうかを検証するのを私たちに手伝ってほしいと考えていました。

私たちは現在、セキュリティ テストの自動化に役立つプロジェクトである APICheck に取り組んでおり、最近これを「オープン ソース」として公開しました。 APICheck は、パイプを介して相互接続できる一連の小さなツールで構成されており、API へのリクエストに対するさまざまなテストの実行を連鎖させることができるため、発行されたトークンを検証できるツールの生成に取り組む必要がありました。 、 jwt -checker では、トークンにコメントする検証に合格する可能性を実装しました。 後ほど、このツールを使用したテストの例を示します。

JWT (JSON Web Token) は、JSON オブジェクトを使用して、主題に関するクレームをカプセル化し、異なる当事者間で安全に共有するためのコンパクトで自己完結型のメソッドを定義するオープン スタンダード (RFC 7519 で公開) です。 トークンの内容は、デジタル署名されている場合に信頼でき、検証できます (JWS、RFC 7515)。 署名は、対称キー (HMAC) または非対称キー (RSA または ECDSA) を使用して生成できます。 さらに、JWT には機密データを保護するために暗号化されたデータ (JWE、RFC 7516) が含まれる場合もありますが、このタイプのトークンはこの調査の対象ではありません。

デフォルトでは、トークンは暗号化されていないこと、また、表示される文字列は、base64url エンコードを使用した単なるシリアル化であることに注意することが重要です。これは、簡単にデコードしてトークンの JSON コンテンツを平文で確認できます。

最初の質問に対する答えは、「それは状況によります...」です。 他の多くのテクノロジーと同様、JWT は生成時に使用される構成と、消費時のトークンの適切な使用と検証に大きく依存します。

JWT (JSON Web Token) は、JSON オブジェクトを使用して、エンティティに関するアサーションを異なる当事者間で安全にカプセル化し、共有するためのコンパクトで自己完結型のメソッドを定義するオープン スタンダードです。

まず、トークンの主なタイプと主な使用例を見ていきます。

JWT は、サイズが小さいため、他の標準 (SAML) より効率的に当事者間で安全なデータ交換を可能にし、次のユースケースに最適です。

各ユースケースには異なる受信者 (クライアント アプリケーションと API サービス) がありますが、両方を同時に制御する場合は、両方のケースに 1 つのトークンを使用できます。

以下に、JWT を使用する際のベスト プラクティスを、その生成と検証のみに焦点を当ててリストします。

ごくわずかな例外 (ユーザー インターフェイスを再構築するためにセッション情報とデータを運ぶためにクライアント側で使用する場合) を除いて、トークンは署名なしで発行すべきではありません。 署名は、トークンの消費者がそれを信頼し、改ざんされていないことを保証するための基本的な保護です。

署名アルゴリズムを選択するときは、使用する鍵が十分に強力でない場合 (ペットの名前や生年月日も有効ではありません;-)、対称鍵アルゴリズムはブルート フォース攻撃に対して脆弱であることに留意してください。そのため、十分な複雑さを提供する必要があります。対称鍵アルゴリズムが選択されている場合。 一方、非対称キー アルゴリズムでは、トークンを生成するサーバー部分でのみキーが必要となるため、キーの管理が簡素化されます。

トークンは、一度署名されると、有効期限がない限り永久に有効です (claim exp)。 「アクセス トークン」の場合、誰かがこれを取得すると、許可された操作に永久にアクセスできるようになります。 トークンに識別子 (クレーム jti) を割り当てると、その取り消しが可能になります。トークンが侵害された場合に備えて、それを取り消すオプションがあることが非常に望ましいです。