JSON Web Tokenを検証する

Overview

重要なコンセプト

  • Auth0がアクセス、ID、リフレッシュとログアウトのトークンに使うJSON Web Token(JWT)の詳細を理解する

  • 署名アルゴリズムを確認し、トークンにとっての署名を理解する

  • JWTを検証し、改ざんされていないことを確認する

  • JWT.ioでAuth0 SDK、ミドルウェア、または第三者のライブラリーの1つを使ってJWTを検証する

Auth0では、 JSON Web Token(JWT) を使用して安全なデータ送信、認証、および認可を行います。トークンは漏洩されず、署名が本人のものであるように、通常のWeb、ネイティブ、およびシングルページのアプリケーションで解析および検証される必要があります。トークンが改ざん、不正使用されたり、期限が切れたりした場合などにセキュリティリスクを減らすために、トークンを検証する必要があります。JWT検証では、リスクを最小限に抑えるために、構造、クレーム、および署名を確認します。



JWTトークンの署名は、 署名アルゴリズムを使用して生成されます。トークンでは複数の署名アルゴリズムを使用できますが、Auth0では、RS256、SHA-256ハッシュ関数を含むRSA暗号化、またはHS256、SHA-256を含むHMACメッセージ認証コード(MAC)をサポートします。Auth0の推奨アルゴリズムの詳細については、「署名アルゴリズム」をお読みください。

JWTを検証する場合は通常、現在のハッシュ値と元のハッシュ値が解析またはデコードされてから、トークンの署名が本物かどうかを検証するために比較されます。全てのバックエンドAPIのクイックスタートは、JWT検証と解析を実行するSDKを使用します。

解析と検証

JWT検証と解析を実行するいずれかのSDKを使用していない場合は、以下の方法でJWTを解析および検証することができます。

  • Webフレームワークに既存のミドルウェアを使用する

  • JWT.ioからサードパーティのライブラリーを選択する

  • specification RFC 7519 > 7.2 Validating a JWTで説明されているように、チェックを手動で実装する

ミドルウェアか、既存のサードパーティのオープンソースライブラリーを使用して、JWTを解析し検証することをお勧めします。JWT.ioでは、.NETやPython、Java、Ruby、Objective-C、Swift、PHPといった、さまざまなプラットフォームと言語のライブラリーが揃っています。

ミドルウェア

ASP.NET Coreなど多くのWebフレームワークには、JWT検証を処理するJWTミドルウェアが揃っています。ミドルウェアはフレームワークの全体的な認証メカニズムとうまく統合するため、通常、この方法が最も確実な方法です。

サードパーティのライブラリー

サードパーティのライブラリーを選択する場合は、アプリケーションまたはAuth0を含むAPIを登録したときに選択した署名アルゴリズムをサポートするライブラリーを選択します。すべてのライブラリーがJWTクレームを検証するわけではない点にもご注意ください。JWT.ioでは、各ライブラリーがサポートする検証を確認することができます(緑のチェックマークを探します)。

ほとんどのサードパーティのライブラリーは、1つのメソッドを実装してJWTを実装し、検証をカスタマイズできるようにさまざまな引数を組み込みます。たとえば、Node.jsおよびnode-jsonwebtokenライブラリーを使用している場合は、jwt.verify()メソッドを呼び出します。このメソッドは、許可されたアルゴリズムをカスタマイズできるalgorithms引数(noneを必ず拒否すること)、シークレットまたはRSA公開鍵(選択した署名アルゴリズムに応じる)で入力するsecretOrPublicKey引数、およびクレームの検証をカスタマイズできるその他の入力引数をサポートします。解析に失敗すると、ライブラリーではJsonWebTokenErrorエラーjwt malformedメッセージとともに返され、その後、関連する要求を拒否しなければなりません

サードパーティのライブラリーを使用する上での一般的な推奨事項

  • JWTからクレームを取得するには、verify()メソッドを使用してクレームと署名を検証します。トークンがパブリッククライアントから発行されている場合は特に、decode()メソッドを使用するのを避けます。

  • 選択したライブラリーを使用する方法についての全手順に慎重に従います。ライブラリーはデフォルト値またはセキュリティリスクを生じさせる恐れがある設定を使用する可能性があります。

チェックを手動で実装する

手動でJWTの検証を行う場合、実装が正しく行われなかったり、一部の重要な詳細が抜けたりして、重大なセキュリティ脆弱性につながりかねません。このため、JWTの手動検証は控えてください。ほとんどのJWTライブラリーは、JWT検証をユーザーに代わって処理します。お使いのプラットフォームとプログラミング言語用のJWTライブラリーを検索するには、JWT.ioにアクセスしてください。

JWTを手動で検証する方法については、「RFC 7519」を参照してください。Auth0が発行したJWTにはすべて、JSON Web Signature(JWS)が付いています。つまり、暗号化でなく署名されていることを表します。

RS256で署名されたトークンを検証する

RS256で署名されたトークンを検証するには、以下のようにします。

  1. [Dashboard]>[Applications(アプリケーション)]に移動します。

  2. [Settings(設定)]ビューで、[Advanced Settings(高度な設定)]を開きます。

  3. [Certificates(証明書)]ビューに移動し、[Signed Certificate(署名付き証明書)]フィールドを見つけて、[Public Key(公開鍵)]をコピーします。

  4. JWT.ioのWebサイトに移動し、[Algorithm(アルゴリズム)]ドロップダウンから[RS256]を選択します。

  5. [Verify Signature(署名の検証)]セクションを見つけて、前にコピーした公開鍵を-----BEGIN PUBLIC KEY-----から始まるフィールドのコンテンツの代わりに貼り付けます。

いずれかのアプリケーションからトークンの署名を検証するには、以下のようにします。

公開鍵はこちらのテナントのJWKSから取得することを推奨します: https://{yourDomain}/.well-known/jwks.json

もっと詳しく