Cognito のプールは 2 種類: ユーザープール(認証とトークン)と ID プール(AWS の一時認証情報)
Cognito で迷いやすいのは、名前の似た 2 つのプールが別の仕事をしていること。ユーザープールは「この人は誰か」を確かめてトークンを出す。ID プール(Identity Pool、旧 Federated Identities)は、そのトークンと引き換えに STS の一時認証情報(アクセスキー・シークレット・セッショントークン)を払い出し、ブラウザやアプリから AWS API を直接呼べるようにする。
どちらが要るか
| やりたいこと | ユーザープール | ID プール |
|---|---|---|
| サインイン・サインアップ、自前 API の認可(JWT を API Gateway / 自前サーバーで検証) | 要る | 不要 |
| ブラウザやスマホから S3 に直接アップロード、DynamoDB を直接読むなど、AWS API を直接呼ぶ | 要る(またはソーシャルログイン等) | 要る |
| 未ログインのゲストにも限定した AWS 権限を渡す | 不要 | 要る(未認証ロール) |
サインインだけならユーザープールで足りる。「クライアントから AWS に直接触る」ときに初めて ID プールが必要になる。
流れ(ブラウザから S3 へ直接アップロードする場合)
- ユーザープールでサインインし、ID トークンを受け取る
- ID プールに ID トークンを渡す(
GetId→GetCredentialsForIdentity) - ID プールが、紐付けた IAM ロール(認証済みロール)を引き受けた一時認証情報を返す
- その認証情報で S3 の
PutObjectを呼ぶ
注意点
- 一時認証情報の権限は ID プールに紐付けた IAM ロールで決まる。バケット全体ではなく
${cognito-identity.amazonaws.com:sub}を使ってユーザーごとのプレフィックスに絞る - 未認証ロールを有効にすると、誰でもその権限を得られる。使わないなら無効のままにする
- 自前 API の認可だけが目的なら ID プールは不要で、ユーザープールの JWT を検証すればよい。権限を絞る設計全般は AWS 設計の定石メモ: 人は Identity Center・システムは IAM ロール/VPC エンドポイント/Route 53 Resolver と AWS IAM: 評価は「明示 Deny → 明示 Allow → 暗黙 Deny」 を参照