変更要約: in-scopeサービス網羅(軸B): s3にSystems Manager(Parameter Store)とAppConfigによる設定/フィーチャーフラグ外部化の定義・役割・選択基準を追記。
3.2Amazon Cognito によるユーザー認証
Cognito のユーザープール(サインアップ/サインイン・JWT 発行)とアイデンティティプール(トークンを一時 AWS 認証情報に交換)の違い、アプリのユーザー認証フローを理解します。
アプリのエンドユーザーのサインイン/サインアップを担うのが Amazon Cognito です。ユーザープールとアイデンティティプールの役割の違いが重要です。
3.2.1ユーザープールとアイデンティティプール
- ユーザープール:サインアップ/サインイン(認証)を提供し、成功すると JWT トークン(ID/アクセストークン)を発行する。「あなたは誰か」を扱う。
- アイデンティティプール(フェデレーテッド ID):トークンを 一時的な AWS 認証情報 に交換し、S3 等へ直接アクセスさせる。「どの AWS アクセスを与えるか」を扱う。
- 外部 ID プロバイダー(Google・Facebook・SAML/OIDC 等)とのフェデレーションにも対応。
- API Gateway の Cognito オーソライザーでユーザープールの JWT を検証できる。
アプリのエンドユーザーをどう扱うかは、まず「認証(誰か)」と「AWS 認可(何にアクセスできるか)」を分けて考えます。ユーザープール はサインアップ/サインインを担い、成功すると JWT トークンを返します。アプリはこのトークンを API Gateway の Cognito オーソライザーに渡して保護 API を呼び出せます。一方、クライアントから S3 や DynamoDB などの AWS サービスを直接呼び出したい場合は アイデンティティプール を使い、ユーザープールや外部 ID プロバイダーのトークンを 一時的な AWS 認証情報 に交換します。両者は併用が基本で、「ユーザープールで認証 → アイデンティティプールで AWS 認可」という流れになります。MFA や Hosted UI、SRP によるパスワード保護もユーザープール側の機能です。
| 観点 | ユーザープール | アイデンティティプール |
|---|---|---|
| 役割 | 認証(誰か) | AWS 認可(何にアクセス) |
| 出力 | JWT トークン | 一時的な AWS 認証情報 |
| 用途 | サインイン・API 保護 | S3/DynamoDB を直接呼ぶ |
ユーザープールが発行するトークンは3種類あります。ID トークン はユーザーの属性(メール等)を含み、アクセストークン は API へのアクセス可否、リフレッシュトークン は失効したトークンの再取得に使います。いずれも JWT で、有効期限が切れたらリフレッシュトークンで更新します。セキュリティを高めるには MFA(SMS・TOTP)や、パスワードを平文で送らない SRP(Secure Remote Password) を使います。サインアップ前後やトークン生成時に独自処理を挟みたいときは Lambda トリガー(Pre/Post 認証、Pre トークン生成など)を使い、独自の検証やクレーム追加ができます。ログイン画面を自作せず素早く用意したいなら Hosted UI が便利で、Google などの外部 IdP ボタンも統合できます。これらはすべてユーザープール側の機能で、アイデンティティプールはあくまで「AWS 認証情報への交換役」に徹します。
シナリオ:モバイルアプリがログイン後に S3 へ写真を直接アップロード。 まず ユーザープールでサインインし JWT を取得。保護 API は API Gateway の Cognito オーソライザーで JWT を検証。クライアントが S3 へ直接書き込むため、アイデンティティプールで JWT を一時 AWS 認証情報に交換し、最小権限(そのユーザー領域だけ)で PutObject を許可します。
Q. ユーザープールとアイデンティティプールの違いは? ユーザープール=認証(JWT 発行)、アイデンティティプール=トークンを一時 AWS 認証情報に交換。Q. API Gateway で JWT を検証するには? Cognito オーソライザーを使う。Q. 外部の Google ログインを使える? はい、フェデレーションで対応。
混同に注意: 「JWT を発行=ユーザープール」「一時 AWS 認証情報=アイデンティティプール」を取り違えないこと。クライアントから AWS サービスを直接呼ぶならアイデンティティプールが必要で、ユーザープールだけでは AWS 認証情報は得られません。
「アプリのサインイン/サインアップ=ユーザープール(JWT 発行)」「トークンを一時 AWS 認証情報に交換=アイデンティティプール」 の役割分担は DVA で頻出です。API Gateway は Cognito オーソライザーでこの JWT を検証できます。
3.2.2この節のまとめ
- ユーザープール=認証(JWT)/アイデンティティプール=一時 AWS 認証情報
- API Gateway は Cognito オーソライザーで JWT を検証
進捗の記録にはログインが必要です。
理解度チェック
(軽い確認用)Q1. アプリのエンドユーザーのサインアップ/サインインを提供し、JWT トークンを発行するのはどれですか?
Q2. サインイン後のトークンを、S3 等へ直接アクセスするための一時 AWS 認証情報に交換するのはどれですか?
Q3. API Gateway で Cognito ユーザープールの JWT を検証してアクセスを制御する仕組みはどれですか?

