NRIネットコム Blog

NRIネットコム社員が様々な視点で、日々の気づきやナレッジを発信するメディアです

【祝10周年!】歴史・年表でみるAWSサービス(Amazon Cognito編) -機能一覧・概要・アップデートのまとめ・入門-

本記事は  AWSアワード記念!夏のアドベントカレンダー  3日目の記事です。
🎆🏆  2日目  ▶▶ 本記事 ▶▶  4日目  🏆🎆

小西秀和です。
今年も私は2024 Japan AWS Top Engineer、2024 Japan AWS All Certifications Engineerに選出され、弊社の表彰者が参加するブログイベント「AWSアワード記念!夏のアドベントカレンダー」に記事を投稿することができました。

私は時々、AWSサービスのアップデートの歴史を辿って、その機能をまとめる記事を書いていますが、今回はちょうど良いタイミングのAWSサービスがありましたので、それについて書いてみます。

ということで「歴史・年表でみるAWS全サービス一覧 -アナウンス日、General Availability(GA)、AWSサービス概要のまとめ-」から始まった、AWSサービスを歴史・年表から機能を洗い出してまとめるシリーズの第9弾です(過去、Amazon S3AWS Systems ManagerAmazon Route 53Amazon EventBridgeAWS KMSAmazon SQSAWS Lambdaについて書きました)。

今回は2014年7月10日にアナウンスおよびGAになったサーバーレスでフルマネージドな認証・認可サービスを提供するAmazon Cognitoについて歴史年表を作成してみました。
本日、2024年7月10日はAmazon CognitoがアナウンスおよびGAとなった日から、ちょうど10周年を迎える記念すべき日です。
この記事でもAmazon Cognitoの誕生から機能追加やアップデートを追いながら主要機能を現在のAmazon Cognitoの機能一覧と概要としてまとめています。
これらが、各AWSサービスの機能概要に加えてコンセプトや変わらないもの、変わってきたものを知る手がかりとなればと考えています。
今回の記事の内容は次のような構成になっています。

Amazon Cognito歴史年表の作成経緯と方法

今回、Amazon Cognitoの歴史年表を作成したのは、今年2024年にAmazon Cognitoがアナウンスから10周年を迎えることに他なりません。

また、Amazon Cognitoが2014年7月にアナウンスおよびGAになって以降、様々なAWSサービスとの統合や機能の拡張がされてきたため、次のアプローチでAmazon Cognitoの情報を整理したいと考えたことも理由の一つです。

  • Amazon Cognitoの歴史を追いながら、アップデートの変遷を整理する
  • Amazon Cognitoの機能一覧と特徴をまとめる

この年表は主に次のブログやドキュメント履歴のAmazon Cognitoに関する内容を参考にしています。

参考にした資料によってアナウンスや記事投稿のタイミングが違う場合もあったため、年表の日付には若干のブレがあります。
掲載している内容は現在のAmazon Cognitoと関係している主要な機能と概要説明に必要なものに限定しています。
つまり、ここの年表にあるものがAmazon Cognitoの機能のアップデートの全てではなく、あくまで私がピックアップした代表的なアップデートであることにご注意ください

Amazon Cognito歴史年表(2014年07月10日~2024年07月10日までのアップデート)

さて、ここからがAmazon Cognitoの機能に関する年表です。

※テーブルは項目名クリックでソートできます。

年月日 概要
2014/07/10 Amazon CognitoがアナウンスおよびGeneral Availability(GA)となる。
初期のAmazon CognitoはAmazon、Facebook、Googleといった既存のIDプロバイダーと連携し、認証されていないゲストユーザーもサポートしてユーザー固有のデータを安全に管理するIdentity Poolsと、データの同期を担い、ユーザーのアプリ設定やゲーム状態などをデバイス間で同期するCognito Syncに相当する機能を提供していました。
2014/09/29 独自のユーザーIDシステムを利用できるDeveloper authenticated identities(開発者認証ID)が追加される。ユーザーが所有する認証およびID管理システムをAmazon Cognitoのアイデンティティプロバイダーとして扱えるようになる。
2014/10/23 OpenID Connectプロバイダーのサポートが追加される。
2014/11/06 Amazon Cognito Syncによるプッシュ同期のサポートが追加される。
2015/03/04 ユーザーIDデータをAmazon Kinesisに自動的にストリーミングするAmazon Cognito Streamsが追加され、データストリームの制御と洞察が可能になる。
2015/04/09 AWS Lambdaとの統合が追加され、Amazon Cognitoの重要なイベントに応じてAWS Lambda関数を実行できるようになる。
2015/04/30 パブリックログインプロバイダーとしてTwitterとDigitsが追加される。
2016/02/18 AWS CloudTrailでAmazon Cognito Identity PoolsとAmazon Cognito Syncの作成・変更・削除を追跡できるようになる。
2016/04/19 Amazon Cognito Identity Poolsでユーザーのサインアップとサインインを追加できるようになる。
2016/06/23 SAML2.0を使用したアイデンティティプロバイダーによる認証のサポートが追加される。
2016/07/28 Amazon Cognito User Poolsが一般提供開始。ユーザーディレクトリを作成・維持し、ユーザープールを使用してモバイルアプリやウェブアプリケーションにサインアップとサインイン機能を追加できるようになる。
2016/09/01 Amazon Cognito User Poolsに一括インポート機能が追加される。既存のアイデンティティプロバイダーからAmazon Cognito User Poolsへのユーザー移行が可能になる。
AWS CloudTrailでAmazon Cognito User Poolsの作成・変更・削除を追跡できるようになる。
2016/10/06 Amazon CognitoコンソールとAPIで、管理者がユーザーアカウントを作成する機能が追加される。
2016/11/09 AWS Mobile Hubでメールとパスワードのオプションを使用すると、Amazon Cognitoでアプリのフルマネージドユーザーディレクトリをプロビジョニングできるようになる。
2016/12/15 Amazon Cognito User Poolsでグループ機能が追加される。Amazon Cognito Identity PoolsでRole-Based Access Control(RBAC)が追加される。
2017/04/28 Amazon CognitoがAWS CloudFormationでサポートされる。
2017/07/06 Amazon CognitoがHIPAA適格性とPCIコンプライアンスを達成。ユーザーが電話番号またはメールアドレスをユーザー名として使用できるようになる。
2017/08/10 Amazon Cognito User Poolsにフェデレーションと組み込みアプリUI機能が追加される。ユーザーがOAuth 2.0を使用してFacebook・Google・Login with Amazon・SAMLアイデンティティプロバイダーを使用してユーザープールにサインインできるようになる。
2017/09/26 Amazon Pinpointとの統合が追加される。Amazon Cognito User Poolsアプリの分析にAmazon Pinpointを使用し、Amazon Pinpointキャンペーンのユーザーデータを強化できるようになる。
2017/11/28 Amazon Cognito Advanced Security(ベータ版)が追加される。悪意のあるボットからアプリとユーザーを保護し、インターネット上の他の場所で漏洩した認証情報からユーザーアカウントを保護し、サインイン試行の計算されたリスクに基づいてサインインに必要なチャレンジを自動的に調整する新しいセキュリティ機能が追加される。
2018/02/08 Amazon Cognito Lambda Migration Triggerをサポート。ユーザープールにおけるユーザー存在確認をし、既存のアプリケーションディレクトリからユーザープールにユーザーのプロファイルデータをコピーできるようになる。
2018/05/17 Amazon Cognito User PoolsにOpenID Connect(OIDC)アイデンティティプロバイダー(Salesforce、Ping Identityなど)を使用したサインインが追加される。
2018/06/04 Amazon Cognito User PoolsでホストされたログインUIに独自のカスタムドメインを使用できるようになる。
2018/06/14 Amazon Cognito Advanced Securityが一般提供される。悪意のあるボットからアプリとユーザーを保護し、インターネット上の他の場所で漏洩した認証情報からユーザーアカウントを保護し、サインイン試行の計算されたリスクに基づいてサインインに必要なチャレンジを自動的に調整する新しいセキュリティ機能が追加される。
2019/01/22 Amazon Cognitoが99.9%のサービスレベルアグリーメント(SLA)をアナウンス。
2019/03/26 タグ付けサポートが追加される。Amazon Cognito リソースのタグ付けに関する情報が追加される。
2019/04/08 Amazon Cognito User PoolsのAmazon SESメール設定機能が追加される。Amazon Cognitoが Amazon SES設定を使用してユーザーにメールを送信するようにユーザープールを設定できるようになる。
2019/05/06 管理者がエンドユーザーの一時パスワードまたは永続パスワードを設定できるようにするユーザーパスワードリセットAPIを追加。確認済みの電話やメールが利用できない場合でもエンドユーザーが利用できるようになる。
2019/10/07 AWS CloudFormationでAmazon CognitoのホストされたUIドメインを安全かつ自動的に構成する機能、ホストされたUIのカスタマイズを構成する機能、IdentityProviderを構成する機能、Amazon Cognito Advanced Securityの動作を構成する機能、リソースサーバーを構成する機能を追加でサポート。
2019/11/20 Amazon Cognito User PoolsがAppleでのサインインをサポート。
2019/11/26 Amazon Cognito User Poolsでパスワードを忘れた場合の復旧方法の優先順位付けをサポート。
2020/01/10 Amazon CognitoがAmazon CloudWatch Usage Metrics(使用状況メトリクス)をサポート。
2020/02/05 AWS CloudTrailでAmazon Cognito User PoolsのすべてのAPI呼び出しのログ記録をサポート。
2020/02/12 Amazon Cognito User Poolsがユーザーエイリアスの大文字と小文字を区別しない機能をサポート。ユーザープールを作成する前にユーザー名の大文字小文字の区別を無効にすることが推奨されるようになる。
2020/04/07 Amazon Cognito Identity PoolsがApple(Sign in with Apple)でのサインインをサポート。
2020/08/12 Amazon Cognito ユーザープールがアクセストークンとリフレッシュトークンの有効期限のカスタマイズをサポート。
2020/10/30 Amazon Cognito User Poolsのクォータ管理と使用状況の追跡がAWS Service QuotasとAmazon CloudWatchメトリクスを使用してできるようになる。
2021/01/14 Amazon Cognito Identity Poolsでアイデンティティプロバイダーのユーザー属性を使用したアクセス制御によって、AWSリソースへのアクセス許可管理を簡素化できるようになる。
2021/06/02 Amazon CognitoがAmazon SNSのSMS Sandboxをサポート。
2021/06/10 Amazon Cognitoがリフレッシュトークンをリアルタイムで取り消すことによるターゲットサインアウトをサポート。RevokeToken APIと失効エンドポイントが追加され、RevokeToken操作を使用したユーザーの更新トークンを失効させることができるようになる。
2021/11/18 Amazon Cognito User Poolsで新しいコンソールエクスペリエンスが追加される。
2022/03/14 Amazon Cognito User PoolsでAmazon SNSとAmazon SESとの同一リージョン内統合をサポート。Amazon SNSをSMSメッセージに、Amazon SESをメールメッセージに使用できるようになる。
2022/05/31 Amazon Cognito Advanced Securityのリスク評価が改善され、Amazon Cognitoへの認証されていない呼び出しで、呼び出し元のコンテキストデータの一部としてIPアドレスを伝播できるようになる。
2022/08/11 Amazon Cognito User PoolsにAWS WAF Web ACLを関連付けられるようになる。
2022/09/09 Amazon CognitoのホストされたUIでTime-Based-One-Time-Password(TOTP) MFAデバイスを登録できるようになる。
2022/10/24 Amazon Cognito User Poolsの削除保護を提供開始。
2023/02/15 AWS CloudTrailでAmazon Cognito Identity Poolsのデータイベントを記録できるようになる。
2023/05/16 Amazon Cognito Identity Poolsのコンソールエクスペリエンスが改善される。
2023/08/01 Amazon Verified PermissionsがGeneral Availability(GA)になり、Amazon Cognitoの属性に基づいてポリシーを検証し、Amazon Cognitoトークンを使用してリクエストを認可できるアプリケーション用の統合認証および認可ソリューションが可能になる。
2023/12/12 Amazon Cognito Identity Poolsがアクセストークンの内容をカスタマイズ機能をサポート。ユーザープールアクセストークンのクレームとスコープを追加、変更、および削除できるようになる。
2023/12/19 Amazon Cognito User PoolsがAWS Service Quotasでアイデンティティの作成と取得、およびアイデンティティプールのタグの管理によく使用される操作のクォータを管理できるようになる。
2024/02/01 Amazon Cognitoで署名されたSAML認証リクエストを送信し、SAML IDプロバイダーからの暗号化された応答を要求し、SAMLフェデレーションにIDプロバイダーが開始するシングルサインオン(SSO)を使用できるようになる。
2024/04/05 Amazon Verified Permissionsを使用して承認されたAmazon CognitoグループのユーザーのみがアプリケーションのAPIにアクセスできるようになる。
2024/05/21 Amazon Verified Permissionsを使用してCognitoトークンを使用して認証する場合にCognitoグループのメンバーシップに基づいてCedarポリシーを作成できるようになる。
2024/05/30 Amazon Cognito User Poolsがアクセストークンのカスタマイズ機能を拡張して、IDトークンとアクセストークンの両方で、配列・マップ・JSONオブジェクトなどの複雑なカスタム属性をサポートするようになる。

現在のAmazon Cognitoの機能一覧と概要

ここからは、現在のAmazon Cognitoの主要な機能について詳しく解説していきます。
Amazon Cognitoは、モバイルおよびWebアプリケーションの開発者がユーザー認証とデータ同期を簡単に実現できる、フルマネージドな認証サービスです。

Amazon Cognitoは主に二つの機能を提供します。
一つ目の「User Pools」は、ユーザーディレクトリを管理し、サインアップやサインインなどのユーザー認証を行い、アプリケーションに必要な認証フレームワークを簡単に統合できます。また、認証後にJWTトークンを発行し、アプリケーション内での認可にも使用できます。
二つ目の「Identity Pools」は、認証済みおよび未認証のユーザーに対して一時的なAWSクレデンシャルを付与し、AWSリソースへのアクセスを許可することで、AWS環境での認可を実現します。

認証は主に「User Pools」を使用してユーザーの身元を確認します。認可については、アプリケーション内では「User Pools」が発行するトークンを使用し、AWSリソースへのアクセスは「Identity Pools」を経由して制御します。
この双方を使用することで、アプリケーション開発者はユーザーの認証情報とアクセス権限を効果的に管理することができます。

さらに、Amazon Cognitoは他のAWSサービスとの簡単な統合が可能であり、デバイス間でのユーザーデータの同期もサポートしているため、ユーザーエクスペリエンスの向上に寄与します。
また、AWS IAMによるアクセス制御と組み合わせることで、セキュリティを強化しつつ、開発の柔軟性を保ちながらアプリケーションを安全に運用できます。

Amazon Cognitoのユースケース

Amazon Cognitoは、認証と認可をセキュアに管理することで、アプリケーション開発者がユーザー情報の取り扱いを簡素化できるようにデザインされています。
Amazon Cognitoの主要なコンポーネントであるUser PoolsとIdentity Poolsを活用した主なユースケースには以下のようなものが挙げられます。

  • ユーザー認証
    User Poolsを使用してモバイルやウェブアプリケーションで安全にユーザー登録とログイン機能を提供します。
    ソーシャルIDプロバイダー(Facebook・Google・Amazon・Apple)やOIDC、SAMLを通じたフェデレーション認証もサポートします。

  • ユーザー認可とリソースアクセス管理
    Identity Poolsを使用して、認証済みおよび未認証のユーザーにAWSリソースへの一時的なアクセスを許可します。
    User Poolsのグループ機能を使用して、アプリケーション内の権限管理を行います。

  • サーバーサイドリソースへのアクセス制御
    User Poolsから発行されたトークンを使用して、サーバーサイドリソースへのアクセスを制御します。

  • API GatewayとLambdaを介したリソースアクセス
    API GatewayでUser Poolsのトークンを検証し、Lambdaファンクションや自作APIへのアクセスを制御します。

  • AWSサービスへのアクセス
    User PoolsとIdentity Poolsを組み合わせて、認証されたユーザーに対してAWSサービスへの一時的なアクセス権を付与します。

  • サードパーティ認証とAWSサービスアクセス
    Identity Poolsを使用して、サードパーティIDプロバイダーで認証されたユーザーにAWSサービスへのアクセスを許可します。

  • AWS AppSyncリソースへのアクセス
    User Poolsのトークンを使用して、AWS AppSyncリソースへのアクセスを制御します。
    Identity Poolsから取得したIAM認証情報を使用して、AWS AppSync GraphQL APIにリクエストを送信します。

  • アプリケーション間でのユーザーデータの同期
    User Poolsの機能を活用して、ユーザーのデバイス間で設定情報やアプリケーションの状態を同期させます。

ユースケースの具体例

  • ソーシャルメディア統合ログイン
    ウェブやモバイルアプリケーションで、ユーザーがFacebookやGoogleなどのソーシャルアカウントを使用してログインする機能を提供します。User Poolsがこの認証を処理します。

  • モバイルアプリのカスタム認証フロー
    モバイルアプリケーションでワンタイムパスワード(OTP)やバイオメトリックスを使ったセキュリティ強化されたログインプロセスを実装します。User Poolsでこれらの認証方法をサポートします。

  • サーバーレスバックエンドへのアクセス認可
    アプリケーションがAmazon S3やDynamoDBなどのAWSサービスにアクセスする際、Identity Poolsを使用して一時的なAWSクレデンシャルを発行し、認証されたユーザーのみがリソースにアクセスできるようにします。

  • マイクロサービスアーキテクチャでの認証
    API GatewayとLambdaを使用したマイクロサービスアーキテクチャで、User Poolsのトークンを利用して各サービスへのアクセスを制御します。

  • ユーザーグループベースのアクセス制御
    User Poolsのグループ機能を使用して、アプリケーション内で異なる権限レベルを持つユーザーグループ(例:管理者・一般ユーザー)を作成し、それぞれに適切なアクセス権を付与します。

  • クロスプラットフォームアプリケーションでのユーザー体験の一貫性
    User Poolsを使用して、ウェブ・iOS・Androidなど異なるプラットフォーム間でユーザープロファイルと認証状態を同期し、一貫したユーザー体験を提供します。

  • GraphQLベースのアプリケーション開発
    AWS AppSyncを使用したGraphQLベースのアプリケーションで、User PoolsとIdentity Poolsを組み合わせてデータアクセスを制御します。

これらのユースケースは、Amazon Cognitoを使ってユーザー認証と認可を効率的かつ安全に行い、様々なシナリオでアプリケーションの開発を加速させる具体的な例です。

Amazon Cognitoの概念図

ここから、Amazon Cognitoの主な機能や特徴について説明していきますが、その前にAmazon Cognitoの全体像を想像しやすくするためにAmazon Cognitoの概念図を次に示します。

Amazon Cognitoの概念図
Amazon Cognitoの概念図

この概念図は、Amazon Cognitoの主要な機能であるUser PoolsとIdentity Poolsを使用した典型的な認証フローを示しています。
認証プロセスは次の3つの主要なステップで構成されています。

  1. ユーザーはまずAmazon Cognito User Poolsで認証を行い、トークンを取得します。
  2. 次に、このトークンをAmazon Cognito Identity Poolsと交換して、一時的なAWS認証情報を取得します。
  3. 最後に、これらの認証情報を使用して、アプリケーションはAWSの各種サービスやリソースにアクセスできるようになります。

この概念図のように、Amazon Cognito User PoolsとAmazon Cognito Identity Poolsは同じAmazon Cognitoのサービスでありながら、異なる役割と用途と提供します。
以降では主にAmazon Cognito User PoolsとAmazon Cognito Identity Poolsのそれぞれの機能の概要について、説明してきます。

Amazon Cognito User Pools

Amazon Cognito User Poolsの機能概要

Amazon Cognito User Poolsは、ウェブやモバイルアプリケーションのユーザー認証を管理するための包括的なサービスです。
独自のユーザーディレクトリとして機能し、自己登録やアドミニストレーター主導のユーザー作成・管理・認証をサポートします。
OpenID Connect(OIDC)標準に基づいて動作し、安全な情報の伝送に使用されるコンパクトで自己完結型の署名付きJSONオブジェクトであるJSON Web Token(JWT)を発行して、アプリケーションやAPIに直接認証を提供します。

User Poolsの特筆すべき機能の一つは、サードパーティのIDプロバイダー(IdP)との高度な連携です。
SAML 2.0・OIDC・OAuth 2.0プロトコルを介して、企業のワークフォース識別子やカスタマー識別子、さらにはFacebook・Google・Amazon・Appleなどの一般的なソーシャルIDプロバイダーとの統合をサポートします。
この連携において、属性マッピング機能が重要な役割を果たします。
ユーザーは、外部IdPからのユーザー属性をUser Pool内の属性に柔軟にマッピングでき、データの一貫性と互換性を確保できます。

さらに、User Poolsはフェデレーションユーザーを既存のユーザープロファイルにリンクする機能も提供します。
この機能によって、ユーザーは複数の認証方法(例:ローカルアカウントとFacebookアカウント)を同一のユーザープロファイルに関連付けることができ、シームレスなユーザーエクスペリエンスを実現します。

セキュリティ面では、多要素認証(MFA)・カスタム認証フロー・悪意のあるアクティビティからの保護など、高度な機能を提供します。
ユーザーエクスペリエンスのカスタマイズも可能で、Lambda関数を使用して認証プロセスをカスタマイズしたり、ホストされたUIのデザインをカスタマイズしたりできます。

監視と分析機能も充実しており、AWS CloudTrail・Amazon CloudWatch・Amazon Pinpointとの統合によって、ユーザーアクティビティの詳細な分析と監視が可能です。
また、Amazon Cognito Identity Poolsとの連携で、AWSサービスへのアクセス権限の管理も容易になります。

これらの機能を総合すると、Amazon Cognito User Poolsは、複雑な認証シナリオに対応できる柔軟性と、強力なセキュリティ機能を兼ね備えた、現代のアプリケーション開発に不可欠なツールとなっています。
属性マッピングとユーザープロファイルのリンク機能によって、異なるIDプロバイダー間でのユーザー情報の統合と管理が容易になり、シームレスなユーザー体験を提供することができます。

Amazon Cognito User Poolsへのサインイン方法

Amazon Cognito User Poolsは、ウェブおよびモバイルアプリケーションの認証と認可のための柔軟で強力なソリューションを提供します。
ユーザーが自分のアプリケーションにアクセスする方法は複数あり、それぞれのニーズや既存のインフラストラクチャに合わせて選択できます。
以下では、Amazon Cognito User Poolsで利用可能な主要なサインイン方法について説明します。

ユーザープールを介した直接サインイン

Amazon Cognito User Poolsでは、スタンドアロンのユーザーディレクトリおよびIDプロバイダー(IdP)として機能する場合に、直接サインインをサポートしています。
ユーザーは、Amazon CognitoがホストするUI(Hosted UI)を使用するか、Amazon Cognito User Pools APIを介してカスタムUIからサインインできます。

Social IdPを介したフェデレーション

Amazon Cognito User Poolsでは、OAuth 2.0ソーシャルサインインをサポートしています。
ユーザーは、Google・Facebook・Amazon・Appleなどのソーシャルアイデンティティプロバイダーを介してサインインできます。
Social IdPを介したフェデレーションによって、コンシューマーユーザーのサインインが可能になり、同時にそのユーザーのプロファイル情報をAmazon Cognito User Poolsにインポートすることができます。
インポートされる情報には、ユーザーの基本的なプロファイル属性((例: 名前・メールアドレス・プロフィール画像のURL)が含まれます。
これらの属性は、設定したマッピングルールに基づいてUser Pools内のユーザープロファイルに保存されます。

SAML IdPを介したフェデレーション

Amazon Cognito User Poolsでは、SAML(Security Assertion Markup Language)フェデレーションも使用できます。
Amazon Cognito User Poolsは、任意のSAML IdPからの要求を受け入れるように設定することができます。
SAML IdPを介したフェデレーションによって、組織のユーザーデータを使用したサインインとインポートにも適しており、既存の組織のIDシステムとの統合が容易になります。
SAML認証を経由して、ユーザーの属性やロールなどの情報をAmazon Cognito User Poolsに安全に転送し、アプリケーションでの認証に活用することができます。

OIDC IdPを介したフェデレーション

Amazon Cognito User Poolsでは、OpenID Connect(OIDC)プロトコルを使用するIdPを通じたフェデレーションも可能です。
Amazon Cognitoは、OIDCに準拠した任意のIdPからの要求を処理できます。
OIDC IdPを介したフェデレーションによって、さまざまな標準準拠のIDプロバイダーとの連携が可能になります。

これらの方法を組み合わせることで、ユーザーに柔軟な認証オプションを提供し、既存のIDインフラストラクチャとシームレスに統合することができます。

Hosted UI

Amazon Cognito User PoolsのHosted UIは、すぐに利用可能なユーザー認証ウェブインターフェースです。
これは、OAuth 2.0準拠の認可サーバーとして機能し、以下の特徴を持っています。

  • 基本的なサインアップ、サインイン、多要素認証(MFA)、パスワードリセットなどの機能を提供します。
  • サードパーティのアイデンティティプロバイダー(IdP)との認証を統合するハブとしても機能します。
  • カスタマイズ可能で、ロゴやCSSを使用してブランドに合わせた外観を作成できます。
  • 認証リクエストのルーティング、JSON Webトークン(JWT)の発行と管理、ユーザー属性情報の提供を行います。

Hosted UIの主な利点は、アプリケーションに簡単に統合できる点で、ユーザープールのドメイン・アプリクライアントID・リダイレクトURIなどのパラメータを使用して、認証エンドポイントにアクセスできます。
例えば、以下のようなURLで Hosted UI にアクセスできます。

https://<your user pool domain>/authorize?client_id=<your app client ID>&response_type=<code/token>&scope=<scopes to request>&redirect_uri=<your callback URL>

Hosted UIの機能によって、開発者は認証プロセスを簡単に実装でき、ユーザーにとっても使いやすい認証エクスペリエンスを提供できます。
Amazon Cognito User PoolsのHosted UIを使用することで、開発者は複雑な認証システムを自前で構築する必要がなく、安全で標準化された認証プロセスを簡単に実装できます。

Lambdaトリガーの種類

Amazon Cognito User Poolsでは、Lambdaトリガーを使用して、ユーザー認証プロセスの様々な段階でカスタムロジックを実行し、認証フローをカスタマイズできます。
Lambdaトリガーで実行できる処理には主に次のようなものが挙げられます。

  • サインアップ関連
    Pre sign-up: サインアップ前にカスタムバリデーションや他の前処理を行うトリガーです。ユーザー登録の承認または拒否も可能です。
    Post confirmation: サインアップの確認(メールやSMSでの認証後)が完了した後に行われる処理で、カスタムメッセージの送信やログの記録などが可能です。

  • 認証関連
    Pre authentication: 認証前にカスタムバリデーションを行うトリガーです。例えば、特定の条件を満たすユーザーのログインを拒否することができます。
    Post authentication: ユーザーの認証が成功した後にログ記録や分析データの収集などの処理を行うトリガーです。

  • カスタム認証チャレンジ関連
    Define auth challenge: 認証プロセス中の次のチャレンジ(認証ステップ)を決定します。
    Create auth challenge: 新しい認証チャレンジを作成します。
    Verify auth challenge response: ユーザーからのレスポンスを検証し、認証の成功または失敗を決定します。

  • トークン生成関連
    Pre token generation: IDトークンやアクセストークンが生成される前に、トークンのクレームを変更したり、新しいクレームを追加したりするトリガーです。

  • ユーザー移行関連
    Migrate user: 既存のユーザーディレクトリからAmazon Cognito User Poolへのユーザー情報の移行を支援するトリガーです。ユーザーが初めてサインインする際に古いシステムから情報を移行します。

  • メッセージカスタマイズ関連
    Custom message: メールやSMSで送信されるメッセージの内容をカスタマイズするトリガーです。言語のローカライズも可能です。

  • カスタム送信者関連
    Custom email sender: 第三者のプロバイダーを使用して、Eメールをカスタマイズして送信するトリガーです。
    Custom SMS sender: 第三者のプロバイダーを使用して、SMSメッセージをカスタマイズして送信するトリガーです。

Amazon Pinpoint分析

Amazon Pinpointは、マルチチャネルマーケティングプラットフォームで、ユーザーエンゲージメントの向上とターゲットを絞ったキャンペーンの実施を支援します。
Amazon Pinpointキャンペーンは、ユーザーセグメントに対して特定のメッセージやプロモーションを配信する機能を提供します。

Amazon Cognito User PoolsはAmazon Pinpointと統合されており、ユーザープールの分析機能を提供するとともにAmazon Pinpointキャンペーンのユーザーデータを強化します。
この統合によって、次のようなことが可能になります。

  • ユーザープールのサインアップ、サインイン・認証失敗・日次アクティブユーザー(DAU)・月次アクティブユーザー(MAU)などの追跡
  • デバイスプラットフォーム・デバイスロケール・アプリバージョンなどの属性に基づくデータ分析
  • カスタム属性の設定とそれを用いたユーザーセグメンテーション
  • ターゲットを絞ったプッシュ通知の送信

Amazon Cognitoコンソールで分析を有効にすると、サービスにリンクされたロールが作成され、Amazon CognitoがAmazon PinpointへのAPIリクエストを行う際に使用されます。
Amazon CognitoとAmazon Pinpointの地域可用性には制限があり、一部の地域ではAmazon Pinpointプロジェクトを同じ地域またはus-east-1(N. Virginia)に作成する必要があります。

分析設定を指定するには、Amazon Cognitoコンソール、AWS CLI、またはAWS APIを使用できます。
設定後、アプリケーションでAnalyticsMetadataパラメータを含めることで、Amazon Pinpointにメタデータを渡すことができます。

このようにAmazon Cognito User PoolsとAmazon Pinpointの統合によって、モバイルアプリのユーザーエンゲージメントを向上させ、より効果的なターゲティングとアナリティクスが可能になります。

ユーザーの管理

Amazon Cognito User Poolsを使用すると、ユーザープールを作成した後にユーザーアカウントを作成、確認、および管理することができます。
ユーザープールのグループを利用することで、IAMロールをグループにマッピングし、ユーザーとそのリソースへのアクセスを管理できます。

また、Migrate user Lambdaトリガーを用いてユーザーをユーザープールにインポートすることも可能です。
この方法を用いると、ユーザーが初めてユーザープールにサインインした際に、既存のユーザーディレクトリからユーザープールへのユーザーのシームレスな移行が実現します。

ユーザープールを作成した後、以下のような機能を活用してユーザーを効率的に管理できます。

  • グループ管理
    ユーザープール内にグループを作成し、IAMロールをマッピングすることで、ユーザーのアクセス権限を管理できます。
  • ユーザー移行
    Migrate user Lambdaトリガーを使用して、既存のユーザーディレクトリからユーザープールへのシームレスな移行が可能です。ユーザーが初めてサインインする際に自動的に移行されます。
  • ポリシー設定
    ユーザー作成に関するポリシーを設定し、セキュリティを強化できます。
  • アカウント管理
    管理者としてユーザーアカウントを作成したり、既存のアカウントを検索・管理したりすることができます。
  • アカウント回復
    ユーザーがパスワードを忘れた場合などに備えて、アカウント回復機能を提供しています。
  • 属性管理
    ユーザープールの属性を柔軟に設定し、必要な情報を管理できます。
  • パスワード要件
    ユーザープールのパスワード要件を追加し、セキュリティを強化することができます。

これらの機能を活用することで、Amazon Cognito User Poolsを使用したアプリケーションにおいて、効果的なユーザー管理を実現できます。

認証成功後のAWSリソースへのアクセス

前述したように、Amazon Cognito User Poolsを使用すると、ユーザーは直接ユーザープールを使用して、または第三者のアイデンティティプロバイダー(IdP)を経由して認証できます。
認証が成功すると、アプリケーションはAmazon Cognitoからユーザープールトークンを受け取ります。
これらのトークンを使用して、以下のようなさまざまな操作が可能になります

  • AWSサービス(DynamoDBやS3など)のリソースにアクセスするためのAWS認証情報の取得
  • 一時的で取り消し可能な認証の証明の提供
  • アプリケーション内のユーザープロファイルへの身元データの投入
  • ユーザープールディレクトリ内のサインインしたユーザーのプロファイル変更の承認
  • アクセストークンを使用したユーザー情報へのリクエストの承認
  • アクセストークンを使用した外部APIへのリクエストの承認
  • Amazon Verified Permissionsを使用したクライアントまたはサーバー上のアプリケーション資産へのアクセスの承認

これらの機能によって、セキュアかつ柔軟なユーザー認証とリソースアクセス管理が可能になります。

使用可能なセキュリティ機能

Amazon Cognito User Poolsでは、ユーザーIDを保護するために多様なセキュリティ機能を提供しています。
Amazon Cognito User Poolsで提供される主なセキュリティ機能には以下のようなものが挙げられます。

  • 多要素認証(MFA)
    ユーザー名とパスワード以外の第2の認証要素を追加できます。
    SMSテキストメッセージまたは時間ベースのワンタイムパスワード(TOTP)が利用可能です。

  • 適応型認証(Adaptive Authentication)
    適応型認証(Adaptive Authentication)は、ユーザーの行動パターンやリスク要因を分析し、状況に応じて適切な認証レベルを動的に調整するセキュリティ機能です。
    リスクベースモデルを使用して追加の認証要素が必要かどうかを予測します。
    追加料金が必要な「Amazon Cognito Advanced Security」の一部として提供されます。

  • 侵害された認証情報に対する保護
    既知の漏洩パスワードデータベースと照合し、ユーザーが脆弱なパスワードを使用することを防ぎます。
    追加料金が必要な「Amazon Cognito Advanced Security」の一部として提供されます。

  • AWS WAF Web ACLとの連携
    ユーザープールにAWS WAF Web ACLを関連付けできます。

  • ユーザープールの大文字小文字の区別
    ユーザー名やその他の属性の大文字小文字の扱いを管理できます。

  • ユーザープール削除保護
    意図しないユーザープールの削除を防止します。

  • ユーザー存在エラーレスポンスの管理
    ユーザーの存在に関するエラーレスポンスをカスタマイズできます。

これらの機能を適切に組み合わせることで、ユーザープールのセキュリティを強化し、よりセキュアな認証システムを構築することができます。

Amazon Cognito Identity Pools

Amazon Cognito Identity Poolsの機能概要

Amazon Cognito Identity Poolsは、認証されたユーザーや未認証ユーザーにAWSリソースへの一時的なアクセス権を付与するためのサービスです。
Identity Poolsは、認証済みユーザーだけでなく、匿名ユーザーに対してもAWS認証情報を発行し、アプリケーションが適切なレベルのリソースアクセスを提供できるようにします。

Identity Poolsの特筆すべき機能の一つは、認証されていないユーザーを認証済みユーザーに円滑に切り替える機能で、ユーザーは最初は制限付きのゲストアクセスで始め、その後認証プロセスを経てより広範なアクセス権を得ることができます。
このような柔軟性によって、アプリケーションは新規ユーザーの獲得とエンゲージメントの向上を同時に実現できます。

さらに、Identity Poolsは多様な認証プロバイダーと連携します。
ユーザープール・SAML 2.0サービス・OIDCプロバイダー、ソーシャルIDプロバイダー(Amazon・Facebook・Google、Apple・Twitterなど)をサポートし、カスタム認証スキームも許可するため、開発者は自社のニーズに最適な認証方法を選択できます。

Identity Poolsの重要な特徴は、ロールベースと属性ベースのアクセス制御を組み合わせて使用できることです。
ロールベースのアクセス制御では、ユーザーの要求や属性に基づいて適切なIAMロールを選択し、各ロールに細かく調整されたIAMポリシーを適用します。属性ベースのアクセス制御では、ユーザーの要求から属性を抽出し、それらを一時的なセッションのプリンシパルタグにマッピングして、リソースへのアクセスをより精密に制御します。

Amazon Cognito認証情報プロバイダーを設定し、AWS認証情報を取得すると、開発者はこれらの認証情報を使用してAWSサービスクライアントを作成でき、アプリケーションはAmazon S3・Amazon DynamoDB・Amazon Pinpoint・Amazon CloudWatchなどの様々なAWSサービスと安全にやり取りできるようになります。
この機能によって、開発者はAWSのリッチなサービスエコシステムを最大限に活用し、スケーラブルで堅牢なアプリケーションを構築できます。

総じて、Amazon Cognito Identity Poolsは、ユーザー認証からAWSリソースへのアクセス管理まで、包括的かつ柔軟な認証・認可ソリューションを提供し、開発者はセキュリティを損なうことなく、シームレスなユーザーエクスペリエンスを実現できます。

ロールベースのアクセス制御(Role-Based Access Control, RBAC)

Amazon Cognito Identity Poolsは、認証されたユーザーに対して、AWSリソースにアクセスするための一時的で限定的な権限を持つ認証情報を割り当てます。
各ユーザーの権限は、作成したIAMロールによって制御されます。

ユーザーのIDトークン内のクレームに基づいて、各ユーザーに適用するロールを選択するルールを定義できます。
認証されたユーザーに対するデフォルトのロールを定義することも可能です。また、認証されていないゲストユーザーに対しては、限定的な権限を持つ別のIAMロールを定義することができます。

ロールマッピングのためのロール作成時には、そのロールがIdentity Pool内の認証されたユーザーに対してのみAmazon Cognitoによって引き受けられるように、適切な信頼ポリシーを各ロールに追加することが重要です。

ユーザーにロールを割り当てる方法には、主に以下の2つがあります。

  • トークンを使用したロールの割り当て
    ユーザープールを経由してログインしたユーザーの場合、IDトークン内の特定のクレーム(cognito:preferred_role, cognito:roles)を使用してロールを割り当てることができます。
  • ルールベースのマッピングによるロールの割り当て
    IDプロバイダートークンのクレームをIAMロールにマッピングするルールを設定できます。各ルールでは、トークンクレーム、マッチタイプ、値、およびIAMロールを指定します。

ルールベースのマッピングでは、最大25個のルールを作成でき、これらは順番に評価されます。最初にマッチするルールのIAMロールが使用されます。

セキュリティのベストプラクティスとして、エンドユーザーが直接設定できないクレームのみを、権限の高いロールにマッピングすることが重要です。
また、適切なロールを決定できない場合のデフォルトの動作を指定することもできます。

属性ベースのアクセス制御(Attribute-Based Access Control, ABAC)

Amazon Cognito Identity Poolsにおける属性ベースのアクセス制御(ABAC)は、ユーザー属性に基づいてAWSリソースへのアクセスを制御する機能です。
この機能を使用することで、ソーシャルや企業の認証プロバイダーから取得したユーザー属性を、IAMポリシーで参照可能なタグにマッピングできます。

ABACの主な特徴と利点は以下の通りです。

  • 効率的な権限管理
    ユーザー属性を使用することで、複数のポリシーを作成する代わりに、基本的な権限ポリシーを1つ作成するだけで済みます。
  • ポリシーの柔軟性
    リソースやユーザーを追加・削除する際に、ポリシーを更新する必要がありません。ポリシーは、マッチするユーザー属性を持つユーザーにのみアクセスを許可します。
  • 属性のマッピング
    デフォルトのマッピングを選択するか、カスタムマッピングを作成して、IAM権限ポリシーで参照される属性を設定できます。
  • 条件付きアクセス
    ユーザーの属性値に基づいて、特定のリソースへのアクセスを条件付きで許可または拒否できます。

セキュリティのベストプラクティスとして、信頼できるソースから取得した属性のみを使用し、ユーザーが自由に変更できない属性を重要な権限の判断に利用することが重要です。
また、属性の値が不明または存在しない場合のデフォルトの動作を定義し、最小権限の原則に従ってアクセスを制御することが推奨されます。
ユーザーセッションにプリンシパルタグを適用するために、IAMロールの信頼ポリシーを適切に設定する必要があります。
さらに、属性の組み合わせを使用してより細かなアクセス制御を実現し、定期的に属性とポリシーの関係を見直して、不要な権限が付与されていないか確認することも大切です。
これらの実践により、属性ベースのアクセス制御をより安全かつ効果的に実装することができます。

AWSリソースにアクセスできる認証情報の取得

Amazon Cognito Identity Poolsを使用すると、AWSリソースにアクセスできる一時的な限定的権限を持つ認証情報をアプリケーションへ提供できます。
認証情報の取得プロセスには、以下の重要なポイントがあります。

  • 認証済みと未認証のアイデンティティ
    未認証ユーザー: 身元確認なしでアプリにアクセスできるゲストユーザーに適しています。
    認証済みユーザー: サードパーティのIDプロバイダーまたはユーザープールを経由してログインし、身元が確認されます。
  • Amazon Cognitoアイデンティティ
    アイデンティティそのものは認証情報ではありません。
    AWS Security Token Service(STS)のWeb IDフェデレーションサポートによって認証情報と交換されます。
  • 推奨される認証情報取得方法
    Amazon Cognito Identity Pools認証情報オブジェクトであるAWS.CognitoIdentityCredentialsから、AWS認証情報を入手することが推奨されています。
    認証情報オブジェクト内のアイデンティティがAWS STSを経由して認証情報に交換されます。
  • SDKやAWS Amplifyとの統合の利用
    AWS SDKには、認証情報を自動的に探索し、使用するための仕組み(認証情報プロバイダーチェーン)が組み込まれています。ウェブIDクレデンシャルプロバイダー(Identity Poolsを含む)はこのチェーンの一部です。つまり、SDKを使用する際に、追加の設定なしでIdentity Poolsからの認証情報を簡単に利用できます。
    また、AWS AmplifyにはIdentity Pool統合機能が組み込まれており、認証やユーザー管理の実装を大幅に簡素化でき、開発時間の短縮と、より堅牢なセキュリティ実装が可能になります。
  • 各種SDK向けのリソース
    Android・iOS・JavaScript・.NET・Go・Java・PHP・Python・Rustなど、各プログラミング言語やプラットフォーム向けのSDKで、Identity Poolsを使用した認証情報の取得と設定方法が提供されています。

これらのポイントを抑えて認証情報を活用することで、アプリケーションに安全かつ効率的な認証システムを実装することができます。

開発者認証ID(Developer-Authenticated Identities)

開発者認証IDは、Amazon Cognito Identity Poolsが提供する認証方式の1つです。
この機能を使用すると、開発者は既存の認証プロセスを使用してユーザーを登録・認証しながら、Amazon Cognito Identity Poolsを利用してユーザーデータの同期やAWSリソースへのアクセスを行うことができます。
ただし、この機能はAmazon Cognito Identity Poolsと連携して使用するもので、Amazon Cognito Identity Poolsには対応していないことに注意が必要です。

開発者認証IDの主な特徴には次のものがあります。

  • カスタム認証
    開発者は独自の認証システムを使用できます。
  • バックエンドとの連携
    ユーザーデバイス・開発者のバックエンド・Amazon Cognito Identity Poolsの3者間で連携します。
  • 柔軟性
    ウェブIDフェデレーション(Facebook・Google・Amazon・Appleなど)と併用可能ですが、実装の複雑さが増す可能性があります。
  • セキュリティ
    GetOpenIdTokenForDeveloperIdentity APIをバックエンドサーバーで使用して、管理者認証情報で認証を行います。クライアントサイドでの直接呼び出しは推奨されません。
  • 実装
    本記事執筆時点で、Android・iOS・JavaScript・Unity・Xamarin向けのSDKで実装方法が提供されています。
  • IDプールとの関連付け
    開発者プロバイダー名をIDプールに関連付けて使用します。
  • トークン管理
    バックエンドでトークンを取得し、クライアントに返す仕組みが必要です。また、トークンの有効期限管理や更新メカニズムも考慮する必要があります。
  • 他の認証方式との統合
    未認証ID、ソーシャルIDプロバイダーと併用する場合の実装方法も提供されています。

開発者認証IDの認証フローは以下のようになります。

  1. アプリケーションが独自のバックエンドで認証を行います。
  2. バックエンドがAmazon Cognito Identity PoolsのGetOpenIdTokenForDeveloperIdentity APIを呼び出し、IDトークンを取得します。
  3. バックエンドがアプリケーションにIDトークンを返します。
  4. アプリケーションがこのトークンを使用してAWS認証情報を取得します。

また、エラーハンドリングやトークンの更新プロセスも考慮に入れる必要があります。
開発者認証IDを使用するには、以下の手順が必要です。

  1. Amazon Cognito Identity Pools consoleでアイデンティティプールに開発者プロバイダー名を関連付けます。
  2. アイデンティティプールに適切なIAMロールとポリシーを設定します。
  3. アプリケーション側で独自のIDプロバイダークラスを実装します。
  4. バックエンド側でGetOpenIdTokenForDeveloperIdentity APIを呼び出し、IDトークンを取得・管理します。

開発者認証IDを使用することで、既存の認証システムを活用しながら、Amazon Cognito Identity Poolsの機能を利用できるため、柔軟なユーザー管理とAWSリソースへのアクセス制御が可能になります。

外部アイデンティティプロバイダー

Amazon Cognito Identity Poolsは、複数の外部アイデンティティプロバイダー(IdP)との連携をサポートしており、ユーザーは様々な方法で認証を行うことができます。

Amazon Cognito Identity Poolsにおいて、外部IdPからの認証情報を設定するために使用される要素であるloginsプロパティを使用することで、IdPから受け取った認証情報を設定できます。
さらに、1つのアイデンティティプールを複数のIdPと関連付けることが可能です。
例えば、FacebookとGoogleの両方のトークンをloginsプロパティに設定することで、1つのAmazon Cognitoアイデンティティを複数のIdPログインと関連付けることができます。
その結果、ユーザーはどちらのアカウントでも認証でき、Amazon Cognitoは同じユーザー識別子を返します。

Amazon Cognito Identity Poolsがサポートする主な外部IdPには以下のものがあります

  • Facebook
  • Login with Amazon
  • Google
  • Sign in with Apple
  • OpenID Connect(OIDC)プロバイダー
  • SAML プロバイダー

これらの外部IdPを利用することで、アプリケーションに柔軟で堅牢な認証機能を実装することができます。

セキュリティのベストプラクティス

Amazon Cognito Identity Poolsのセキュリティを強化するためのベストプラクティスには、以下のような重要な点があります。

  • 最小権限の原則
    IAMロールとポリシーを使用して、ユーザーに必要最小限の権限のみを付与します。
  • リソースベースのポリシーの活用 ユーザーのリソースアクセスに対して、きめ細かな制御を行うためにリソースベースのポリシーを使用します。
  • セッションタグの利用
    ユーザークレームをIAMセッションタグに変換し、ユーザーの特性に基づいたアクセス制御を実装します。
  • ゲストアクセスの制限
    未認証ユーザーに対しては、限定的なスコープのAWS認証情報のみを生成するよう設定します。
  • ユーザー特性に基づくIAMロールの割り当て
    認証済みユーザーに対して、個々のユーザークレームに基づいて適切なIAMロールを割り当てます。
  • 適切な認証プロバイダーの選択
    ユースケースに適した信頼できる認証プロバイダーを選択し、適切に設定します。
  • カスタム認証の適切な実装
    開発者認証identitiesを使用する場合は、堅牢な認証メカニズムを実装し、適切に検証します。
  • 定期的な監査とモニタリング
    Amazon CloudWatchなどのサービスを活用して、ユーザーアクティビティを定期的に監査およびモニタリングします。

これらのプラクティスを適用することで、Amazon Cognito Identity Poolsのセキュリティを大幅に向上させ、アプリケーションとユーザーデータを保護することができます。

User PoolsとIdentity Poolsの違いと比較

Amazon CognitoのUser PoolsとIdentity Poolsは、異なる目的と機能を持つ2つの重要なコンポーネントです。

User Poolsは主にユーザー認証と管理に特化しており、ウェブやモバイルアプリケーションのユーザーディレクトリとして機能します。
ローカルユーザーの作成・サードパーティIdPを通じたフェデレーション・多要素認証(MFA)・カスタム認証フローなどの機能を提供します。

一方、Identity Poolsは主にAWSリソースへのアクセス制御に焦点を当てており、認証されたユーザーや未認証ユーザーに対して一時的なAWS認証情報を発行します。
Identity Poolsは、ロールベースのアクセス制御や属性ベースのアクセス制御を経由して、きめ細かなAWSリソースへのアクセス管理を可能にします。

この両者を組み合わせることで、セキュアで柔軟なユーザー認証とAWSリソースへのアクセス制御を実現できます。
例えば、User Poolsで認証されたユーザーのトークンをIdentity Poolsで使用し、適切なAWS認証情報を取得するといった連携が可能です。

次のAWSドキュメントのページにはAmazon CognitoとUser PoolsとIdentity Poolsの機能の比較表があります。
Amazon Cognito user pools and identity pools comparison

この内容をまとめるとUser PoolsとIdentity Poolsの主な違いの特徴には次のものが挙げられます。

項目 Amazon Cognito User Pools Amazon Cognito Identity Pools
認証と認可 主にユーザー認証(OIDC IdP、SAML 2.0、OAuth 2.0など)とAPI認可に特化しています。 一時的なAWS認証情報の発行に焦点を当てています。
トークン管理 IDトークンやアクセストークンの発行とカスタマイズを行います。 AWS STSと連携して一時的な認証情報を管理します。
ユーザー管理 ユーザーの登録・認証・属性管理・MFA・セキュリティ監視などの機能を提供します。 これらの機能を直接提供しません。
アクセス制御 グループ機能を経由してIAMロール要求の階層を作成できます。 ロールベースおよび属性ベースのアクセス制御を提供し、AWSリソースへのきめ細かなアクセス管理を可能にします。
未認証アクセス この機能を持ちません。 未認証ユーザーに対しても制限付きのアクセスを提供できます。
カスタマイズ カスタマイズ機能を提供します。認証フロー・ユーザー属性・IDトークンが対象になります。 カスタマイズ機能を提供します。アクセス制御に重点を置いています。

AWS AppSyncとAmazon Cognito Sync

クラウドベースのモバイルおよびウェブアプリケーション開発におけるデータの同期と管理を担う主要なAWSサービスとしてAWS AppSyncとAmazon Cognito Syncが挙げられます。
結論から言うと現在ではAmazon Cognito Syncは非推奨(deprecated)になり、AWS AppSyncの使用が推奨されています。
ここでは、これらのサービスの特徴、違い、現在の推奨される理由について説明します。

主な違い

AWS AppSyncは、GraphQLを使用してアプリケーションデータを管理するためのフルマネージドサービスです。複雑なデータ構造を扱い、リアルタイムでのデータ同期を可能にします。
Amazon Cognito Syncは、デバイス間でユーザーデータを同期するためのシンプルなサービスでした。キー・バリューペアの形式でデータを保存し、同期する機能を提供していました。

観点別に見ると次のような違いがあります。

項目 AWS AppSync Amazon Cognito Sync
データモデル GraphQLを使用し、複雑なデータ構造とリレーションシップを扱えます。 シンプルなキー・バリューペアのデータモデルに限定されます。
スケーラビリティ 大規模なアプリケーションに対応可能で、高いスケーラビリティを提供します。 小規模から中規模のアプリケーションに適していました。
リアルタイム機能 WebSocketsを使用したリアルタイムデータ更新をサポートしています。 リアルタイム更新機能は限定的でした。
統合性 多様なAWSサービス(DynamoDB, Aurora, Elasticsearchなど)と統合可能です。 主にCognito Identity Poolsと密接に統合されていました。
開発者エクスペリエンス より豊富な開発ツールとAWS Amplifyとの統合を提供します。 シンプルなAPIで基本的なデータ同期タスクに適していました。

現在の推奨事項とその理由

AWSは現在、新規のアプリケーション開発においてAWS AppSyncの使用を強く推奨しています。
一方で、Amazon Cognito Syncは非推奨(deprecated)となっており、新規での使用は推奨されていません。

この推奨の背景には以下の理由があります。

  • AWS AppSyncの優れた柔軟性とスケーラビリティ
  • モダンなアプリケーション開発ニーズへの適合性
  • より強力なセキュリティ機能と細かいアクセス制御
  • GraphQLの普及と、効率的なデータ取得の需要増加

AWS AppSyncとAmazon DynamoDBを組み合わせることで、より統合されたクラウドネイティブなアプローチを実現し、スケーラビリティとパフォーマンスの向上を図ることができます。
そのため、既存のCognito Syncを使用しているプロジェクトについては、将来的にAppSyncへの移行を検討することが望ましいといえるでしょう。

AWSサービスとの統合

Amazon Cognitoは、様々なAWSサービスと統合することで、より強力で柔軟な認証・認可ソリューションを提供します。
ここでは、主要な3つの統合方法について詳しく説明します。
これらの統合により、開発者は自身のアプリケーションニーズに最適な認証・認可システムを構築することができます。

AWS Amplifyとの統合

Amazon Cognito User Poolsは、AWS Amplifyを経由して簡単にウェブアプリやモバイルアプリに統合できます。
Amplify Authは主にAmazon Cognitoを使用して認証機能を構築します。
開発者はAmplify CLIを使用してリソースを作成・設定したり、Amplifyライブラリを使ってサインインやサインアップなどの機能を実装できます。
さらに、AmplifyのAuthenticatorコンポーネントを利用することで、カスタマイズ可能な認証UIを簡単に構築することができます。
AWS Amplifyとの統合によって、開発者はUser Poolsの機能を最大限に活用しつつ、迅速にセキュアな認証システムを実装することが可能になります。

AWS SDKとの統合

Amazon Cognito User PoolsとAmazon Cognito Identity Poolsの両方をAWS SDKsを使って統合することができます。
バックエンド開発者は、選択した言語のSDKを使用してAmazon Cognito APIと直接やり取りし、カスタムの認証マイクロサービスを構築できます。
User Pools APIを使用してユーザー管理や認証プロセスを制御し、Identity Pools APIを使用してAWSリソースへのアクセス権限を管理できます。
AWS SDKとの統合によって、開発者はより細かい制御と柔軟性を持って認証・認可システムを実装することが可能になります。

Amazon Verified Permissionsとの統合

Amazon Cognito User Poolsは、Amazon Verified Permissionsと統合して高度な認可機能を実現できます。
アプリケーションはUser Poolsから発行されたアクセストークンまたはIDトークンをVerified Permissionsに渡すことで、詳細な認可判断を得ることができます。
Amazon Verified Permissionsは、Cedar Policy Languageで記述されたポリシーに基づいて、ユーザーの属性やリクエストのコンテキストを考慮し、許可または拒否の決定を下します。

また、Amazon Verified Permissionsの中核機能であるポリシーストアは、認可ポリシーを集中管理するためのリポジトリです。
ポリシーストアを設定する際は、処理するトークンタイプ(アクセストークンまたはIDトークン)を選択し、Amazon Cognito User Poolsをアイデンティティソースとして設定します。
ポリシーストアを使用することで、ポリシー内でユーザー・グループ・アクション・リソースを階層的に参照できるようになり、きめ細かな認可ルールの定義が可能になります。

この統合によって、Amazon Cognito User Poolsの認証機能とAmazon Verified Permissionsの柔軟な認可機能を組み合わせ、きめ細かいアクセス制御を実現することができます。
特に、Amazon API Gatewayと連携させることで、RESTful APIに対する強力な認可メカニズムを構築することが可能です。

Amazon Cognito User PoolsとAmazon Verified Permissionsとの統合による認証・認可プロセスと利点をまとめると次のようになります。

Amazon Cognito User Poolsによる認証プロセス
  1. ユーザーはAmazon Cognito User Poolsを経由して認証を行います。
  2. 認証成功後、User PoolsはアクセストークンまたはIDトークンを発行します。
  3. アプリケーションは、このトークンをVerified Permissionsに渡して認可判断を要求します。
Amazon Verified Permissionsによる認可プロセス
  1. Amazon Verified Permissionsは受け取ったトークンを検証します。
    トークンの有効性、発行元、有効期限などをチェックします。
    ユーザープールがAmazon Verified Permissionsの設定済みアイデンティティソースであることを確認します。
  2. トークン内の情報(クレーム)を抽出し、ポリシー評価の入力として使用します。
  3. Cedar Policy Languageで記述されたポリシーに基づいて、認可判断を行います。
    ユーザーの属性(グループ所属、カスタム属性など)
    リクエストのコンテキスト(リソース識別子、アクション種別など)
    その他のカスタムコンテキスト情報
  4. 許可(Allow)または拒否(Deny)の決定を返します。
  5. トークンの失効と削除されたユーザーの扱い
    Verified Permissionsは、アイデンティティソースから知り得る情報とユーザートークンの有効期限のみを検証します。
    トークンの失効やユーザーの削除状態は確認しません。
    トークンが失効したり、ユーザープールからユーザーが削除されたりした場合でも、トークンの有効期限が切れるまでは有効と見なされます。
Amazon Cognito User PoolsとAmazon Verified Permissionsを統合させる利点

Amazon Cognito User PoolsとAmazon Verified Permissionsを統合させる利点には次のようなものがあります。

  • きめ細かいアクセス制御
    ユーザー属性・グループ所属・リクエストコンテキストなどに基づく詳細な認可ルールを定義できます。
  • 柔軟なポリシー管理
    Cedar Policy Languageを使用して、複雑な認可ロジックを表現できます。
  • 中央集権的な認可
    アプリケーション全体で一貫した認可ルールを適用できます。
  • スケーラビリティ
    Amazon Verified Permissionsのマネージドサービスを利用することで、大規模なアプリケーションでも効率的に認可を処理できます。
  • RBACとABACの組み合わせ
    IDトークンを使用することで、ロールベースのアクセス制御(Role-Based Access Control, RBAC)と属性ベースのアクセス制御(Attribute-Based Access Control, ABAC)を組み合わせることができます。
    ユーザーの属性とグループメンバーシップに基づいて、より細かい認可判断が可能になります。
Amazon API Gatewayの認証・認可でAmazon Cognito User PoolsとAmazon Verified Permissionsを使用した場合のプロセスと利点

Amazon API GatewayでAmazon Cognito User Poolsを使用して認証を行い、Amazon Verified Permissionsで認可を行う場合を例にとって、そのプロセスと利点を説明します。

WS API Gatewayの認証・認可でAmazon Cognito User PoolsとAmazon Verified Permissionsを使用する例
WS API Gatewayの認証・認可でAmazon Cognito User PoolsとAmazon Verified Permissionsを使用する例

  • Amazon API Gatewayの認証・認可で使用した場合のプロセス

    1. ユーザー認証(Amazon Cognito User Pools)
      ユーザーはAmazon Cognitまたは他のOIDC IdPを通じて認証を行います。
      IdPは、ユーザー情報を含むIDトークンとアクセストークン(JWT)を発行します。
    2. APIリクエスト
      クライアントはAmazon API Gatewayにリクエストを送信する際、JWTをAuthorizationヘッダーに含めます。
    3. Amazon API Gatewayの処理
      API Gatewayは、認可決定のキャッシュがある場合はそれを使用します。
      キャッシュがない場合や無効な場合、API GatewayはLambdaオーソライザーを呼び出します。
    4. Lambdaオーソライザーの処理
      AWS Lambda関数は、IsAuthorizedWithToken APIを使用してAmazon Verified Permissionsに認可リクエストを送信します。
      この際、ユーザーのトークン(プリンシパル)、APIメソッドとパス(アクション)、Application(リソース)を含めます。
    5. 認可判断(Amazon Verified Permissions)
      Amazon Verified Permissionsはトークンを検証し、ポリシーストアにあるCedar Policy Languageで記述されたポリシーに基づいて認可判断を行います。
      ユーザーの属性・リクエストのコンテキスト・その他の情報を考慮し、許可(Allow)または拒否(Deny)の決定を返します。
    6. Lambdaオーソライザーのレスポンス
      LambdaオーソライザーはVerified Permissionsからの認可結果に基づいて、API Gatewayに許可(Allow)または拒否(Deny)のレスポンスを返します。
    7. Amazon API Gatewayの最終処理
      API Gatewayは、Lambdaオーソライザーの結果に基づいてデータを返すか、ACCESS_DENIEDレスポンスを返します。
  • Amazon API Gatewayの認証・認可で使用した場合の利点
    Amazon API Gatewayの認証・認可で使用した場合の利点には次のようなものが挙げられます。

    • セキュアな認証
      Amazon Cognito User Pools の堅牢な認証メカニズムを利用できます。
      多要素認証、ソーシャル ID プロバイダとの統合などの機能を活用できます。
    • きめ細かい認可制御
      Amazon Verified Permissions を使用して、詳細な認可ルールを定義できます。
      ユーザー属性・グループ所属・リクエストコンテキストなどに基づく認可が可能です。
    • 柔軟なポリシー管理
      Cedar Policy Language を使用して、複雑な認可ロジックを表現できます。
      ポリシーの中央管理が可能で、一貫した認可ルールを適用できます。
    • スケーラビリティとパフォーマンス
      API Gateway・Cognito・Verified Permissionsはすべてマネージドサービスであり、高いスケーラビリティを提供します。
      Lambda オーソライザーを使用することで、認証・認可のロジックをカスタマイズできます。
    • セキュリティの向上
      認証と認可を分離することで、よりセキュアなアーキテクチャを実現できます。
      トークンベースの認証により、ステートレスで安全な通信が可能です。
    • 開発効率の向上
      認証・認可ロジックをアプリケーションコードから分離できます。
      マネージドサービスを使用することで、開発者は本質的なビジネスロジックに集中できます。

このような、Amazon Cognito User PoolsとAmazon Verified Permissionsの統合、およびAmazon API GatewayなどのAWSサービスでの使用によって、Amazon Cognito User Poolsの強力な認証機能とAmazon Verified Permissionsの柔軟な認可機能を組み合わせ、セキュアで管理しやすいアクセス制御を実現できます。

Amazon Cognito Identity PoolsとAmazon Verified Permissionsの役割と用途の違い

Amazon Cognito Identity PoolsとAmazon Verified Permissionsは、どちらもAmazon Cognito User Poolsで認証した後の認可機能を提供しています。
しかし、それぞれの役割と用途には次のような違いがあります。

項目 Amazon Cognito Identity Pools Amazon Verified Permissions
主な役割 AWSサービスへの一時的なアクセス権限の付与 きめ細かいアプリケーションレベルの認可
特徴
  • ユーザーにAWSの一時的な認証情報を提供
  • IAMロールを使用してAWSリソースへのアクセスを制御
  • モバイルやウェブアプリケーションから直接AWSサービスにアクセスする場合に有用
  • アプリケーション固有の認可ルールを定義・管理
  • Cedar言語を使用して柔軟な認可ポリシーを記述可能
  • リアルタイムの認可決定を提供
  • アプリケーションのビジネスロジックに密接に関連した認可を実現
使用例 モバイルアプリからS3バケットに直接アクセスする場合など 複雑な組織構造を持つアプリケーションでの権限管理、動的なアクセス制御が必要な場合など
スコープ 主にAWSサービスへのアクセスに焦点 アプリケーション固有の認可に重点
粒度 IAMロールベースの比較的粗い粒度の制御 より細かい粒度の制御が可能
制御の柔軟性 IAMポリシーによる制御 Cedar言語を使用してより複雑で動的な認可ルールを定義可能

どちらを選択するかは具体的なユースケースと要件によって異なり、場合によっては両方を組み合わせて使用することも可能です。
これらのことから、AWSサービスへのアクセス制御が主な目的であればAmazon Cognito Identity Poolsを、アプリケーション固有の複雑な認可ロジックが必要な場合はAmazon Verified Permissionsを選択するのがよいでしょう。


<参考資料>
AWS Documentation(Amazon Cognito)
[AWS Black Belt Online Seminar]Amazon Cognito
Tech Blog with related articles referenced

まとめ

今回はAmazon Cognitoの歴史年表を作成して、Amazon Cognitoの機能一覧と概要を見てきました。

Amazon Cognitoは、2014年にサービスを開始して以来、ユーザー認証と認可の複雑さを解消し、アプリケーション開発者にとって利便性の高いセキュリティ機能を提供し続けています。
User Poolsは、サインアップとサインインのプロセスを簡素化し、多様な認証オプションを提供することで、エンドユーザーにとって使いやすい認証体験を実現します。
一方、Identity Poolsは認証済みおよび未認証のユーザーに一時的なAWSクレデンシャルを提供し、AWSリソースへのセキュアなアクセスを認可します。

また、今までの10年間でAmazon Cognitoは多くの重要なアップデートを行い、ソーシャルログインのサポート・管理されたユーザーディレクトリ・アプリケーションデータの同期・セキュリティの強化といった機能を段階的に拡張してきました。
特に、Amazon Verified Permissionsとの統合など、最近のアップデートではセキュリティと利便性をさらに向上させる機能が導入される傾向があります。
Amazon Cognitoの今後の動向は、引き続きアプリケーションのセキュリティとユーザーマネジメントのニーズに応じた機能が追加されることが期待されます。

今後も継続的にAmazon Cognitoがどのような機能を提供していくのかその動向をウォッチしていきたいと思います。

なお、今回の記事の英語版やAmazon Cognito以外のサービスも含めたAWSサービス全体の歴史年表もありますので、興味がありましたら御覧ください。

Written by Hidekazu Konishi
Hidekazu Konishi (小西秀和), a Japan AWS Top Engineer and a Japan AWS All Certifications Engineer

執筆者小西秀和

Japan AWS Top Engineer, Japan AWS All Certifications Engineer(AWS認定全冠)として、知識と実践的な経験を活かし、AWSの活用に取り組んでいます。
Amazon.co.jp: 小西 秀和: books, biography, latest update
NRIネットコムBlog: 小西 秀和: 記事一覧
Personal Tech Blog