

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# ユーザープールトークンの有効期限とキャッシュの管理
<a name="amazon-cognito-user-pools-using-tokens-caching-tokens"></a>

新しい JSON ウェブトークン (JWT) を取得するたびに、アプリは次のいずれかのリクエストを正常に完了する必要があります。
+ [トークンエンドポイント](token-endpoint.md) からクライアント認証情報または認可コードの[付与](https://www.rfc-editor.org/rfc/rfc6749#section-1.3)をリクエストする。
+ マネージドログインページに対して暗黙的な付与をリクエストします。
+ [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html) のような Amazon Cognito API リクエストでローカルユーザーを認証する。

トークンの有効期限が分単位、時間単位、または日単位になるようにユーザープールを設定できます。アプリケーションのパフォーマンスと可用性を確保するには、トークンの有効期間の約 75% まで Amazon Cognito トークンを使用してから、新しいトークンを取得してください。アプリ用に構築したキャッシュソリューションはトークンを利用可能な状態に保ち、リクエストレートが高すぎる場合に Amazon Cognito がリクエストを拒否するのを防ぎます。クライアント側のアプリは、トークンをメモリキャッシュに保存する必要があります。サーバー側アプリでは、暗号化されたキャッシュメカニズムを追加してトークンを保存できます。

ユーザープールがユーザーまたはマシンツーマシンのアクティビティを大量に生成する場合、Amazon Cognito が設定したトークンをリクエストできる数の制限に遭遇する可能性があります。Amazon Cognito エンドポイントへのリクエスト数を減らすには、認証データを安全に保存して再利用するか、エクスポネンシャルバックオフと再試行を実装することができます。

認証データは 2 つのクラスのエンドポイントから取得されます。Amazon Cognito の [OAuth 2.0 エンドポイント](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-userpools-server-contract-reference.html)に含まれているトークンエンドポイントでは、クライアントの認証情報とマネージドログインの認証コードのリクエストを処理します。[サービスエンドポイント](https://docs.aws.amazon.com/general/latest/gr/cognito_identity.html#cognito_identity_your_user_pools_region)は、`InitiateAuth` や `RespondToAuthChallenge` のようなユーザープール API リクエストに応答します。各タイプのリクエストには独自の制限があります。制限事項の詳細については、「[Amazon Cognito のクォータ](quotas.md)」を参照してください。

## Amazon API Gateway によるマシンツーマシンアクセストークンのキャッシュ
<a name="amazon-cognito-user-pools-using-tokens-caching-tokens-API-gateway"></a>

API Gateway トークンキャッシュを使用すると、Amazon Cognito OAuth エンドポイントのデフォルトのリクエストレートクォータを超えるイベントに応じてアプリをスケールさせることができます。

![\[M2M のアクセストークンのキャッシュを維持する API Gateway の図。API プロキシはトークンリクエストを処理し、キャッシュされたトークンが既に有効である場合はキャッシュされたトークンを返します。\]](http://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/images/user-pools-m2m-caching.png)


アクセストークンをキャッシュして、キャッシュされたトークンの有効期限が切れた場合にのみ、アプリが新しいアクセストークンをリクエストするようにできます。それ以外の場合、キャッシュエンドポイントはキャッシュからトークンを返します。これにより、Amazon Cognito API エンドポイントへの追加呼び出しを防ぐことができます。Amazon API Gateway を [トークンエンドポイント](token-endpoint.md) へのプロキシとして使用する場合、API はリクエストクォータに影響するリクエストの大半に応答し、レート制限によるリクエストの失敗を防ぎます。

次の API Gateway ベースのソリューションでは、トークンキャッシュの低レイテンシー、ローコード、ノーコード実装が提供されます。API Gateway API は転送中に暗号化され、オプションで保存時にも暗号化されます。API Gateway キャッシュは、OAuth 2.0 [クライアント認証情報の付与](https://datatracker.ietf.org/doc/html/rfc6749#section-4.4)に最適で、マシンツーマシンセッションとマイクロサービスセッションを認可するためのアクセストークンを生成し、頻繁かつ大量に付与します。マイクロサービスが水平方向にスケールするトラフィックの急増などのイベントでは、ユーザープールまたはアプリケーションクライアントの AWS リクエストレート制限を超えるボリュームで同じクライアント認証情報を使用する多くのシステムが発生する可能性があります。このようなシナリオでは、アプリの可用性と低レイテンシーを維持するために、キャッシュソリューションがベストプラクティスです。

このソリューションでは、API にキャッシュを定義して、アプリでリクエストする OAuth スコープとアプリクライアントの組み合わせごとに個別のアクセストークンを保存します。アプリがキャッシュキーと一致するリクエストを行うと、API はキャッシュキーと一致する最初のリクエストに対して Amazon Cognito が発行したアクセストークンを返します。キャッシュキーの有効期限が切れると、API はリクエストをトークンエンドポイントに転送し、新しいアクセストークンをキャッシュします。

**注記**  
キャッシュキーの有効期間は、アプリクライアントのアクセストークン有効期間よりも短くする必要があります。

キャッシュキーは、リクエスト本文の `scope` URL パラメータでリクエストした OAuth スコープと、リクエストの `Authorization` ヘッダーの組み合わせです。`Authorization` ヘッダーには、アプリのクライアント ID とクライアントシークレットが含まれます。このソリューションを実装するために、アプリに追加のロジックを実装する必要はありません。ユーザープールトークンエンドポイントへのパスを変更するには、設定を更新するだけで済みます。

トークンキャッシュは、[ElastiCache (Redis OSS)](https://docs.aws.amazon.com/elasticache/index.html) で実装することもできます。 AWS Identity and Access Management (IAM) ポリシーによるきめ細かなコントロールが必要な場合は、[Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/authentication-and-access-control.html#authentication) キャッシュをご検討ください。

**注記**  
API Gateway でのキャッシュには追加料金がかかります。[詳細については、料金表を参照してください。](https://aws.amazon.com/api-gateway/pricing)<a name="amazon-cognito-user-pools-using-tokens-caching-tokens-API-gateway-how-to"></a>

**API Gateway でキャッシュプロキシをセットアップする方法**

1. [API Gateway コンソール](https://console.aws.amazon.com/apigateway/main/apis)を開き、REST API を作成します。

1. **[Resources]** (リソース) で、POST メソッドを作成します。

   1. HTTP **[Integration type]** (統合タイプ) を選択してください。

   1. **[Use HTTP proxy integration]** (HTTP プロキシ統合の使用) を選択します。

   1. `https://<your user pool domain>/oauth2/token` の **[Endpoint URL]** (エンドポイント URL) を入力します。

1. **[Resources]** (リソース) で、キャッシュキーを設定します。

   1. POST メソッドの **[Method request]** (メソッドリクエスト) を編集します。
**注記**  
このメソッドリクエストの検証は、トークンリクエストの `client_secret_basic` 認可で使用します。これに伴って、クライアントシークレットが `Authorization` リクエストのヘッダーにエンコードされます。`client_secret_post` 認可における JSON リクエスト本文の検証では、代わりに [client\$1secret](token-endpoint.md#post-token-request-parameters-in-body) が存在することを必須とする [データモデル](https://docs.aws.amazon.com/apigateway/latest/developerguide/models-mappings-models.html)を作成します。このモデルでは、**[リクエストの検証]** で **[本文、クエリ文字列パラメータ、およびヘッダーの検証]** を行う必要があります。

   1. **[リクエストの検証]** メソッドを **[クエリ文字列パラメータおよびヘッダーの検証]** に設定します。リクエストの検証の詳細については、「*Amazon API Gateway デベロッパーガイド*」の「[リクエストの検証](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-method-request-validation.html)」を参照してください。

   1. `scope` パラメータと `Authorization` ヘッダーをキャッシュキーとして設定します。

      1. **[URL クエリ文字列パラメータ]** にクエリ文字列を追加します。`scope` の **[名前]** にクエリ文字列名を入力し、**[必須]** と **[キャッシュ]** を選択します。

      1. **[HTTP リクエストヘッダー]** にヘッダーを追加します。`Authorization` の **[名前]** にリクエストヘッダー名を入力し、**[必須]** と **[キャッシュ]** を選択します。

1. **[Stages]** (ステージ) で、キャッシュを設定します。

   1. 変更するステージを選択し、**[ステージの詳細]** で **[編集]** を選択します。

   1. **[その他の設定]** の **[キャッシュ設定]** で、**[API キャッシュをプロビジョニング]** オプションをオンにします。

   1. **[Cache capacity]** (キャッシュ容量) を選択します。キャッシュキャパシティが大きいほどパフォーマンスは向上しますが、追加コストが発生します。

   1. **[承認を必須にする]** チェックボックスをオフにします。**[Continue]** (続行) をクリックします。

   1. API Gateway は、ステージレベルの GET メソッドにのみキャッシュポリシーを適用します。POST メソッドには、キャッシュポリシーのオーバーライドを適用する必要があります。

      設定したステージを展開し、`POST` メソッドを選択します。メソッドのキャッシュ設定を作成するには、**[オーバーライドを作成]** を選択します。

   1. **[メソッドキャッシュを有効にする]** オプションを有効にします。

   1. ****[キャッシュの有効期限 (TTL)]**** として 3,600 秒を入力します。**[保存]** を選択します。

1. **[Stages]** (ステージ) で、**[Invoke URL]** (URL を呼び出す) に注目します。

1. ユーザープールの `/oauth2/token` エンドポイントの代わりに、API の **Invoke URL** (URL を呼び出す) にトークンリクエストを POST するようにアプリを更新します。