【AWS】AWS Cognitoの役割と連携:ユーザープール、IDプールを解説

アプリケーション開発において、よく挙がる課題にユーザー認証や認可機能の実装があります。これらの機能をゼロから構築するには非常に面倒ですが、AWS Cognitoを効率的に実装ができます。
本記事では、AWS Cognitoが提供する機能の全体像、その主要コンポーネントである「ユーザープール」「IDプール」の役割について解説し、それぞれの使い分けや違いをまとめます。

試験でも問われやすく、混乱しやすい内容です。最後まで読んで理解を深めてみてください!
AWS Cognitoとは?提供機能と利用シーン
AWS Cognitoは、Webアプリケーションやモバイルアプリケーション向けの認証、承認、およびユーザー管理のためのフルマネージドサービスです。開発者はCognitoを利用することで、ユーザー管理のバックエンド機能を容易に導入できます。

面倒な認証や判定はCognitoがやってくれて、アプリ側ではその結果を受けた実装をするだけでOKになります。
Congitoを使うと、アプリ開発者は
- Cognito SDKなどを使って、「ログイン画面でユーザー名とパスワードを入力されたら、Cognitoにチェックをお願いする」というコードを書く。
- Cognitoからの「ログインOK」という結果を受け取ったら、「じゃあ、ユーザーさん向けのマイページを表示しよう」という画面の実装や、IDプールから一時認証情報をもらってAWSサービスを呼び出すコードを書く。
といったように、認証や権限付与の複雑なロジックそのものを自分でイチから書く必要がなくなります。Cognitoが返してくれる結果に基づいて、アプリの次の動作を実装することに集中できるようになります。
セキュリティの専門家でなくても、AWSが提供する安全な認証基盤を利用できる、これがCognitoの強力な点です。
Cognitoが提供する主な機能
cognitoが提供している機能の中で、よく使う・試験で問われるものをピックアップします。
- ユーザーのサインアップおよびサインイン機能:
新規ユーザー登録のワークフローを提供し、多様な認証方法(ユーザー名/パスワード、電話番号、Eメールなど)による安全なサインインを可能にします。 - ユーザーディレクトリの管理:
アプリケーションのユーザー情報を一元的に管理できます。ユーザー属性の定義、アカウントの状態管理(有効化/無効化)、パスワード管理などが含まれます。 - 多要素認証 (MFA):
パスワードに加えて、SMSや時間ベースのワンタイムパスワード(TOTP)アプリを用いたMFAを設定し、アカウントのセキュリティを強化できます。 - 外部IDプロバイダとの連携:
Google, Facebook, Amazon, AppleなどのソーシャルIDプロバイダや、SAML 2.0, OpenID Connectに対応したエンタープライズIDプロバイダ(Okta, Azure ADなど)との連携をサポートし、既存のアカウントでのサインインを可能にします。 - AWSサービスへのアクセス制御:
アプリケーションユーザーに対して、S3バケットへのファイルのアップロードやDynamoDBテーブルからのデータの読み込みなど、AWSリソースへのアクセス権限を一時的に付与できます。 - カスタム認証フロー:
標準の認証フローに加えて、Lambda関数などを利用して独自の認証ロジックやステップを組み込むことが可能です。
Cognitoの主な利用シーン
これらの機能を使うと、下記のシーンで役立ちます。
- Webサイト等のユーザー認証・管理バックエンド:
ユーザー登録、ログイン、プロフィール管理機能が必要な各種アプリケーション。 - 既存のユーザーディレクトリとの連携:
オンプレミスのActive Directoryなどのユーザー情報を活用して、クラウド上で動作するアプリケーションへの認証基盤を構築する場合。 - ユーザーの認証状態に基づいたAWSリソースへのアクセス制御:
例えば、ログインユーザーのみに特定のS3バケットへの書き込み権限を許可するなど、認証状態に応じた動的な権限定義が必要なケース。 - サーバーレスアーキテクチャにおける認証基盤:
AWS LambdaやAPI Gatewayといったサーバーレスサービスを用いたアプリケーションの認証機能を容易に組み込む場合。

ユーザー毎に権限を管理したいことは多いので、頻繁にお世話になる便利なサービスです。
Cognitoの主要コンポーネント:ユーザープールとIDプール
Cognitoは、主に以下の2つの主要なコンポーネントで構成され、それぞれの役割を通じて上記の機能を実現します。
- ユーザープール (User Pools):
ユーザーの認証と管理を行うためのユーザーディレクトリ機能です。 - IDプール (Identity Pools):
認証されたユーザーまたは未認証のユーザーに、AWSサービスにアクセスするための一時的なAWS認証情報を提供する機能です。

ユーザーデータ同期機能を持つCognito Syncもありますが、現在は非推奨です。代替サービスであるAWS AppSync(後述)を使いましょう。
ユーザープール (User Pools)
ユーザープールは、アプリケーションを使うユーザーを管理できるユーザーディレクトリを提供します。これは、アプリケーションのユーザーの「認証」と「管理」に特化した機能であり、ユーザーは直接ユーザープールにサインアップしたり、外部のIDプロバイダを介してサインインしたりします。
- ユーザー登録・認証フロー:
標準のサインアップ/サインインフロー、ユーザー確認 (メール/電話番号認証) の仕組み。 - 多要素認証 (MFA):
SMSまたはTOTPに対応。追加の認証要素を要求することでアカウントセキュリティを強化できる。 - 外部IDプロバイダ連携:
Google, Facebook, AppleといったソーシャルIDや、SAML/OIDC互換のエンタープライズIDプロバイダとの連携設定が可能。コンシューマ向けWEBサービスではよくある要件。 - ユーザー属性管理:
標準的なユーザー属性に加え、アプリケーション固有の情報を管理するためのカスタム属性を定義できる。 - パスワードポリシー:
パスワードの複雑さ、最小文字数、有効期限などを設定し、セキュリティレベルを管理できる。 - Cognito Hosted UI:
AWSが提供する認証UI(カスタマイズ可能)を認証画面として実装可能。

私自身、要件に『SNSアカウントとの連携』があったときはCognitoを使って解決しました。
ユーザープールはアプリケーションの「入り口」として、認証のプロセスやユーザーの状態判定を担うコンポーネントです。IDプールとの比較は後ほどやります。
IDプール (Identity Pools – フェデレーテッドアイデンティティ)
IDプールは、Cognitoユーザープールやその他のIDプロバイダ(ソーシャルID、SAML/OIDCなど)によって認証されたユーザー、あるいは認証されていないゲストユーザーに対して、AWSサービスへアクセスするための一時的なAWS認証情報を提供する機能です。これにより、アプリケーションからS3へのファイルアップロードやDynamoDBからのデータ取得といったAWSサービスの利用を、安全かつアクセス権限を適切に制御した形で行うことが可能になります。これは、ユーザーの認証状態に基づいて「AWSサービスへのアクセス権限を付与する」ことに特化した機能です。
- 認証済み/未認証ユーザーへの認証情報発行:ユーザーがログインしているかどうかに応じて、異なる権限を持つIAMロールを引き受けるための認証情報を発行できます。ゲストユーザーに対しても、限定的な権限を持つ認証情報を発行可能です。
- IAMロールとの連携:IDプールはIAMと連携し、ユーザーの認証状態や所属グループなどに基づいて、適切な権限を持つIAMロールを引き受けることで、AWSリソースへのアクセス権限を動的に制御します。
- 多様なIDプロバイダとの連携:Cognitoユーザープールだけでなく、多くのソーシャルIDプロバイダやエンタープライズIDプロバイダからの認証を受け入れ、一時認証情報を発行できます。
- 一時的認証情報:発行される認証情報は有効期限が限定されており、漏洩した場合のリスクを低減します。

ゲストユーザーにお試しで使ってほしい、といった場合はIDプールの出番です。
ユーザープールとIDプールの役割
ユーザープールとIDプールはそれぞれ異なる得意分野を持ちます。アプリケーションの要件に応じて組み合わせて利用します。違いを表にまとめてみましょう。
コンポーネント | 主な役割 | 連携対象(代表例) | 主な利用目的 |
---|---|---|---|
ユーザープール | ユーザー認証・管理、ユーザーディレクトリ機能 | IDプール、その他のアプリケーションバックエンド | アプリケーションへのログイン/サインアップ機能、ユーザー情報の管理 |
IDプール | AWSリソースへのアクセス権限付与(一時認証情報の発行) | S3, DynamoDB, Lambdaなど、各種AWSサービス、その他AWS API | アプリケーションからAWSサービスへ安全にアクセスさせたい場合、認証状態によってアクセス権限を制御したい場合。 |
文章でまとめると、それぞれこのようになります。
アプリケーションの「入り口」として、「ユーザー名とパスワードが正しいか、ソーシャルログインは成功したか、MFA(二段階認証)は通過したか、といった「認証」のプロセスと、ユーザーアカウント自体の管理や基本的な判定(例:アカウントが有効かなど)を担当。
ユーザープールなどで認証された「認証済みユーザー」、あるいはログインしていない「未認証ユーザー(ゲスト)」の両方に対して、AWSリソースへアクセスするための「一時的な認証情報(秘密の鍵)」を発行することを担当。

ユーザープールによって、ユーザー認証を判定し、IDプールによってユーザーに権限を与える、といった感じです。
ユーザープールとIDプールの連携パターン
典型的な連携パターンには、このような流れがあります。
- ユーザーがユーザープールでアカウントを作成し、サインインする。
- サインインに成功したユーザーは、IDプールを介して、特定のAWSリソース(例えば、ユーザー専用のS3フォルダやDynamoDBの個人情報アイテムなど)へのアクセスを許可する一時的なAWS認証情報を取得する。
- アプリケーションは、取得した一時認証情報を使用して、S3へのファイルアップロードやDynamoDBからのデータ取得といったAWSサービスへのアクセスを行う。
このように、ユーザープールでユーザー認証を管理し、IDプールでAWSリソースへの直接アクセスを制御するなど、それぞれのサービスが持つ機能を適切に組み合わせることで、多様な要件を持つアプリケーションバックエンドをAWS上で柔軟に構築できます。
まとめ
AWS Cognitoは、アプリケーションのユーザー管理、認証、認可を効率化する中核サービスです。ユーザープールはユーザーの認証と管理を担当し、IDプールは認証状態に応じたAWSリソースへのアクセス権限付与を担います。
これらのサービスそれぞれの役割と連携方法を理解することは、AWSを用いたモダンなアプリケーション開発において非常に重要です。アプリケーションの機能要件に応じて、これらのサービスを適切に選択し、組み合わせることで、セキュアでスケーラブルなバックエンドを構築できます。

参考になればうれしいです。