JSON Web トークンの検証 - Amazon Cognito

JSON Web トークンの検証

これらのステップは、ユーザープールの JSON Web トークン (JWT) の検証を説明します。

Prerequisites

このセクションのタスクは、ライブラリ、SDK、またはソフトウェアフレームワークで既に処理されている可能性があります。例えば、ユーザープールトークンの処理と管理は、Amazon Cognito SDK を通じてクライアント側で提供されます。同様に、Mobile SDK for iOS と Mobile SDK for Android は、有効な (期限が切れていない) 更新トークンが存在し、ID トークンとアクセストークンに 5 分間の最小残存有効期間があるという 2 つの条件が満たされる場合に、ID トークンとアクセストークンを自動的に更新します。これらの SDK、および JavaScript、Android、iOS のサンプルコードについては、Amazon Cognito ユーザープール SDK を参照してください。

JSON Web トークン (JWT) の復号化と検証には、多数の優れたライブラリを利用できます。このようなライブラリは、サーバー側の API 処理用にトークンを手動で処理する必要がある場合、または他のプログラミング言語を使用している場合に役立ちます。OpenID Foundation の JWT トークンでの作業のためのライブラリのリストを参照してください。

ステップ 1: JWT の構造を確認する

JSON ウェブトークン (JWT) は、次の 3 つのセクションで構成されます。

  1. ヘッダー

  2. ペイロード

  3. 署名

11111111111.22222222222.33333333333

これらのセクションは、Base64url 文字列としてエンコードされており、ドット (.) 文字で区切られています。JWT がこの構造に従わない場合は、無効と見なして受け入れないでください。

ステップ 2: JWT 署名を検証する

JWT 署名は、ヘッダーとペイロードのハッシュされた組み合わせです。Amazon Cognito は、ユーザープールごとに 2 組の RSA 暗号化キーを生成します。プライベートキーの 1 つは、トークンの署名に使用されます。

JWT トークンの署名を検証する

  1. ID トークンを復号化します。

    ユーザープール JWT の復号化には、AWS Lambda を使用できます。詳細については、Lambda を使用した「Decode and verify Amazon Cognito JWT tokens」を参照してください。

    OpenID Foundation では、JWT トークンでの作業のためのライブラリのリストも維持されています

  2. ローカルキー ID (kid) とパブリック kid を比較します。

    1. ユーザープール用に、対応するパブリック JSON Web キー (JWK) をダウンロードして保存します。これは、JSON Web キーセット (JWKS) の一部として提供されており、https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json にあります。

      JWK と JWK セットの詳細については、「JSON Web Key (JWK)」を参照してください。

      注記

      これは、Web API がトークンを処理する前の 1 回限りのステップです。これで、Web API で ID トークンまたはアクセストークンが使用されるたびに以下のステップを実行できるようになります。

      以下は、サンプル jwks.json ファイルです。

      { "keys": [{ "kid": "1234example=", "alg": "RS256", "kty": "RSA", "e": "AQAB", "n": "1234567890", "use": "sig" }, { "kid": "5678example=", "alg": "RS256", "kty": "RSA", "e": "AQAB", "n": "987654321", "use": "sig" }] }
      Key ID (kid)

      kid は、トークンの JSON Web 署名 (JWS) をセキュア化するために使用されたキーを示すヒントです。

      Algorithm (alg)

      alg ヘッダーパラメータは、ID トークンを保護する暗号化アルゴリズムを表します。ユーザープールは、SHA-256 による RSA 署名である RS256 暗号化アルゴリズム を使用します。RSA の詳細については、「RSA Cryptography」を参照してください。

      Key type (kty)

      kty パラメータは、この例の「RSA」など、キーで使用する暗号化アルゴリズムファミリーを識別します。

      RSA exponent (e)

      e パラメータには、RSA パブリックキーの指数値が含まれています。これは、Base64urlUInt でエンコードされた値として表されます。

      RSA modulus (n)

      n パラメータには、RSA パブリックキーのモジュール値が含まれます。これは、Base64urlUInt でエンコードされた値として表されます。

      Use (use)

      use パラメータは、パブリックキーの用途を表します。この例では、use 値の sig が署名を表しています。

    2. JWT の kid に一致する kid のパブリック JSON Web キーを検索します。

  3. JWT ライブラリを使用して署名を検証するには、このパブリックキーを使用します。まず、JWK を PEM 形式に変換する必要がある場合があります。この例には JWT と JWK があり、Node.js ライブラリの jsonwebtoken を使用して JWT 署名を検証します。

    Node.js
    var jwt = require('jsonwebtoken'); var jwkToPem = require('jwk-to-pem'); var pem = jwkToPem(jwk); jwt.verify(token, pem, { algorithms: ['RS256'] }, function(err, decodedToken) { });

ステップ 3: クレームを検証する

JWT クレームを検証する

  1. トークンの有効期限が切れていないことを確認します。

  2. Audience (aud) クレームは、Amazon Cognito ユーザープールで作成されたアプリクライアント ID と一致する必要があります。

  3. Issuer (iss) クレームは、ユーザープールと一致する必要があります。例えば、us-east-1 リージョンで作成されたユーザープールには、以下の iss 値があります。

    https://cognito-idp.us-east-1.amazonaws.com/<userpoolID>.

  4. token_use クレームをチェックします。

    • Web API でアクセストークンのみを受け入れている場合、その値は access にする必要があります。

    • ID トークンのみを使用している場合、その値は id にする必要があります。

    • ID とアクセストークンのいずれも使用している場合、token_use クレームは、id または access になります。

これで、トークン内のクレームを信頼できるようになりました。