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

JSON web トークンの検証

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

前提条件

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

JSON ウェブトークン (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 を使用できます。詳細については、「Decode and verify Amazon Cognito JWT tokens using AWS Lambda」を参照してください。

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

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

    1. ユーザープール用に、対応するパブリック JSON Web キー (JWK) をダウンロードして保存します。これは、JSON Web キーセット (JWKS) の一部として提供されており、環境に合わせて次のように URL を構築することで、その場所を特定できます。

      https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json

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

      注記

      ウェブ API オペレーションでトークンを処理できるようにするには、ユーザープールの JWK を一度だけダウンロードして保存する必要があります。その後、ウェブ 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 ウェブキーを検索します。

  3. GitHub の aws-jwt-verify ライブラリ」などの JWT ライブラリを使用して、発行者の署名をトークン内の署名と比較します。発行者の署名は、トークンと一致する jwks.json の kid の公開キー(RSA モジュラス "n")から取得されます。kid。まず、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. ID トークンの aud クレームとアクセストークンの client_id クレームは、Amazon Cognito ユーザープールで作成されたアプリクライアント ID と一致する必要があります。

  3. 発行者 (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 になります。

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