ユーザー認証の実装 - Cognito によるセキュアな認証基盤の構築
Amazon Cognito を活用したユーザー認証基盤の設計と実装を解説し、ユーザープール、ID プール、外部 ID プロバイダー連携による認証フローの構築方法を紹介します。
モダンアプリケーションにおけるユーザー認証の課題
ユーザー認証はあらゆるアプリケーションの基盤ですが、安全な認証システムの自前実装は複雑でリスクが高い作業です。パスワードのハッシュ化、セッション管理、MFA 対応、ブルートフォース攻撃対策、トークンの発行と検証など、考慮すべき要素は多岐にわたります。Amazon Cognito は、これらの認証機能をフルマネージドで提供するサービスで、開発者は認証ロジックの実装から解放され、アプリケーションのビジネスロジックに集中できます。Cognito は新規プール標準の Essentials ティアで月間 10,000 アクティブユーザーまで無料で利用でき、スタートアップから大規模エンタープライズまで幅広い規模に対応します。Cognito は Lambda トリガーで認証フローをカスタマイズでき、JavaScript や Python など馴染みのある言語でロジックを記述できる点が開発者にとって大きな利点です。
Cognito ユーザープールによる認証管理
Cognito ユーザープールは、ユーザーのサインアップ、サインイン、パスワードリセット、MFA を管理するユーザーディレクトリです。ユーザープールは OAuth 2.0 と OpenID Connect に準拠しており、標準的な認証フローを提供します。パスワードポリシーのカスタマイズ (最小文字数、大文字・小文字・数字・記号の要件) により、組織のセキュリティ要件に合わせた設定が可能です。MFA は認証アプリによる TOTP (Google Authenticator 等) と SMS のワンタイムコードが全ティアで利用でき、メールのワンタイムコードによる MFA、FIDO2 認証器を使うパスキーサインイン、ワンタイムコードだけでサインインするパスワードレス認証は Essentials 以上のティアで有効化できます (2026 年 8 月時点の公式ドキュメント記載)。リスクの高いサインイン試行時にのみ MFA を要求するリスクベースのアダプティブ認証は最上位の Plus ティア限定の機能で、Essentials では利用できません。Lambda トリガーを使用すれば、認証フローの各段階にカスタムロジックを挿入でき、ビジネス要件に応じた柔軟な認証フローを構築できます。以下は AWS CLI でユーザープールを作成する例です。
aws cognito-idp create-user-pool \
--pool-name MyAppUserPool \
--policies '{"PasswordPolicy": {"MinimumLength": 12, "RequireUppercase": true, "RequireLowercase": true, "RequireNumbers": true, "RequireSymbols": true}}' \
--mfa-configuration OPTIONAL \
--auto-verified-attributes email \
--region ap-northeast-1サインイン画面は Cognito がホストするログインページを使えば自前実装なしで用意できます。現行の managed login はノーコードのブランディングエディターで配色・ロゴ・背景画像・ダークモードまで設定でき、パスキーやパスワードレスのフローにも対応しますが、利用には Essentials または Plus のティアが必要です。従来の hosted UI (classic) は全ティアで使える一方、カスタマイズは CSS ファイルとロゴ画像の差し替えに限られます。
ID プールとフェデレーション認証
Cognito ID プール (フェデレーテッドアイデンティティ) は、認証済みユーザーに一時的な AWS 認証情報を発行し、 S3 、 DynamoDB などの AWS リソースへの直接アクセスを可能にします。ユーザープールで認証されたユーザーだけでなく、 Google 、 Facebook 、 Apple 、 Amazon などのソーシャル ID プロバイダーや、 SAML 2.0 、 OpenID Connect 準拠の企業 ID プロバイダーからの認証情報も受け入れます。認証済みロールと未認証ロールを分離し、ゲストユーザーには読み取り専用の限定的なアクセスを、認証済みユーザーには書き込み権限を含む拡張アクセスを付与する設計が可能です。属性ベースのアクセス制御 (ABAC) により、ユーザーの属性に基づいて動的にアクセス権限を制御でき、きめ細かな認可ロジックを実現します。
| 観点 | ユーザープール | ID プール (フェデレーテッドアイデンティティ) |
|---|---|---|
| 担う仕事 | ユーザーディレクトリ。サインアップ、サインイン、パスワードリセット、MFA を管理する | 認証済みユーザーへ一時的な AWS 認証情報を発行する |
| 準拠する標準と受け入れる ID | OAuth 2.0 と OpenID Connect に準拠した標準的な認証フロー | ユーザープールの認証済みユーザーに加えて、Google、Facebook、Apple、Amazon などのソーシャル ID プロバイダー、SAML 2.0 や OpenID Connect 準拠の企業 ID プロバイダー |
| 主な制御ポイント | パスワードポリシー (最小文字数、大文字・小文字・数字・記号の要件)、MFA は認証アプリの TOTP と SMS が全ティア、メールのワンタイムコードとパスキーは Essentials 以上、リスクベースのアダプティブ認証は Plus 限定 | 認証済みロールと未認証ロールの分離、属性ベースのアクセス制御 (ABAC) による動的な権限制御 |
| 拡張の入り口 | Lambda トリガーで認証フローの各段階にカスタムロジックを挿入。Cognito がホストするログインページでサインイン画面を用意できる (managed login は Essentials 以上、classic hosted UI は全ティア) | ゲストユーザーには読み取り専用の限定的なアクセス、認証済みユーザーには書き込みを含む拡張アクセスを与える設計 |
| 典型的な使いどころ | API Gateway の Cognito オーソライザーに JWT トークンを検証させ、無効なトークンを API に届く前に拒否する | クライアントから S3 や DynamoDB といった AWS リソースへ直接アクセスさせる |
API Gateway と Lambda との統合パターン
Cognito と API Gateway の統合は、サーバーレスアプリケーションの認証パターンとして広く採用されています。API Gateway の Cognito オーソライザーを設定すれば、API リクエストに含まれる JWT トークンを自動的に検証し、無効なトークンを持つリクエストを API に到達する前に拒否できます。Lambda 関数内では、検証済みのトークンからユーザー ID やカスタム属性を取得し、ユーザー固有のデータアクセスやビジネスロジックの分岐に活用できます。Amplify ライブラリを使用すれば、フロントエンドアプリケーションから Cognito の認証フローを数行のコードで実装でき、トークンの自動更新やセッション管理も自動化されます。この構成により、認証・認可・ API 処理の各層が明確に分離され、セキュリティと保守性の両立が実現します。
Cognito の料金
Cognito ユーザープールは月間アクティブユーザー (MAU) 数で課金され、2024 年 11 月の改定で Lite / Essentials / Plus の 3 ティア制になりました。以下の単価は 2026 年 8 月時点・バージニア北部 (us-east-1) と東京 (ap-northeast-1) の実測値で、この 2 リージョンは同額です。新規プールの既定である Essentials ティアは超過分が 1 MAU あたり 0.0150 USD、最上位の Plus ティアは 1 MAU あたり 0.0200 USD、旧世代にあたる Lite ティアは 1 MAU あたり 0.0055 USD から始まる段階制です。直接サインインとソーシャル ID プロバイダー経由のサインインには月 10,000 MAU の無料枠がありますが、これは Lite または Essentials に設定したプールだけが対象で、Plus には無料枠がありません。無料枠はアカウントまたは AWS Organization 単位で数えられ、12 ヶ月間限定の AWS 無料利用枠とは違って期限がありません。2024 年 11 月 22 日以前に作成された既存プールには 50,000 MAU までの無料枠が維持されています。SAML 2.0 / OIDC の企業 ID プロバイダー経由のフェデレーションユーザーは、プールのティア構成に関係なく月 50 MAU まで無料で、超過分は 1 MAU あたり 0.0150 USD です。侵害された認証情報の検出やリスクベースのアダプティブ認証といった脅威保護の機能は、現在は Plus ティアに含まれる形に整理されました。旧来の高度なセキュリティ機能 (ASF) をアドオンとして有効にしていたプールに限り、最初の 50,000 MAU が 1 MAU あたり 0.0500 USD、次の 50,000 MAU が 0.0350 USD という従来料金が継続されます (ASF の加算料金自体には無料枠がなく 1 MAU 目から課金されます。プール本体の MAU 無料枠は別途維持されます)。ティアは運用しながら随時切り替えられるため、無料枠の範囲で開発を始め、脅威保護が必要になった段階で Plus へ引き上げる進め方が取れます。10,000 MAU までの無料枠は多くのスタートアップにとって十分で、認証基盤を自前実装する場合の開発・運用コストと比べれば大幅に低コストです。段階ごとの区切りや最新の単価は AWS の Cognito 料金ページで確認してください。
まとめ
Amazon Cognito は、ユーザー認証の複雑さをフルマネージドサービスとして抽象化し、安全な認証基盤を迅速に構築できるサービスです。ユーザープールによる認証管理、ID プールによる AWS リソースへのアクセス制御、外部 ID プロバイダーとのフェデレーション認証を統合的に提供します。月間 10,000 アクティブユーザーまでの無料利用枠 (Lite または Essentials ティアが対象) と、Lambda トリガーによる柔軟なカスタマイズは、あらゆる規模のアプリケーションに対応します。API Gateway との統合により、サーバーレスアーキテクチャにおける認証・認可のベストプラクティスを容易に実装でき、開発者はビジネスロジックに集中できます。
参考資料 (AWS 公式)
本ページの一次情報は AWS 公式サイトおよび公式ドキュメントです。最新の仕様 / 料金は次の公式ページで確認できます。
本ページと公式ドキュメントの記述が食い違う場合は、公式ドキュメントを正としてください。