目次

Amazon Cognito 完全ガイド 2026

初心者から実務者向けの包括的解説

Amazon Cognito は、Web・モバイル・IoT アプリ向けのエンドユーザー認証・認可・ユーザー管理をフルマネージドで提供する AWS サービスです。2 つのコンポーネント(User PoolsIdentity Pools)で、認証基盤の自前開発を排除し、セキュアで標準準拠の認証フローを数時間で実装できます。本ドキュメントは、Cognito の本質・アーキテクチャ・統合パターン・ユースケース・2026 最新動向を体系的に解説する包括的ガイドです。

ドキュメントの目的

本ガイドは以下を対象としています。

  • 初心者向け:Cognito とは何か、なぜ必要かを学びたい方
  • 開発者向け:User Pool・Identity Pool を構築したい方
  • アーキテクト向け:Federation・MFA・Passkeys・Lambda トリガーを設計したい方
  • SRE/DevOps 向け:Cognito と API Gateway / AppSync / ALB の統合
  • 意思決定者向け:Auth0・Okta・Firebase Auth との比較・投資判断

2026 年の Cognito エコシステム

  • Passkey / WebAuthn 標準化:FIDO2 に準拠したパスキー認証がスタンダードに移行
  • Adaptive Authentication(リスクベース認証):異常なログインパターンを自動検知して MFA を動的に要求
  • Cognito + API Gateway Authorizer:JWT 検証の簡素化、SigV4 との並用
  • AWS Bedrock Agent 認証:AI エージェントの Cognito ID トークン検証
  • CIAM(Customer Identity & Access Management)強化:B2C / B2B SaaS 向け機能の拡充
  • Free Tier 改定:50,000 MAU 無料の継続、Passkey 無料トライアル拡大

目次

  1. 概要
  2. Cognito が解決する課題
  3. 主な特徴
  4. アーキテクチャ
  5. User Pool(認証 IdP)
  6. Identity Pool(AWS リソースアクセスの一時認証情報発行)
  7. 認証フロー
  8. 主要ユースケース
  9. ソーシャル ID プロバイダ統合
  10. SAML / OIDC IdP 統合
  11. MFA(Multi-Factor Authentication)
  12. Passkeys(passwordless 認証)
  13. カスタム認証フロー(Lambda Trigger)
  14. Lambda トリガーの詳細
  15. Hosted UI とカスタム UI
  16. アダプティブ認証(リスクベース)
  17. トークン(ID, Access, Refresh)
  18. グループ・ロール
  19. クォータと制限
  20. セキュリティ コンプライアンス
  21. Cognito Sync(廃止予定 → AppSync 推奨)
  22. 他の類似ツールとの比較
  23. クライアントライブラリとエコシステム
  24. ベストプラクティス
  25. トラブルシューティング
  26. 2025-2026 最新動向
  27. 学習リソース
  28. 実装例・活用シーン
  29. 導入ロードマップ
  30. 実装チェックリスト
  31. まとめ
  32. 参考文献

概要

初心者向けメモ: Cognito は「ユーザー管理」のイメージが強いですが、実は 2 つ完全に異なる役割を持つコンポーネントで構成されています。User Pool はユーザーの認証(Who are you?)を担当し、Identity Pool は AWS リソースアクセス権(What can you access?)を発行します。この 2 層構造が Cognito の本質です。

Amazon Cognito は、以下を実現するフルマネージド認証・認可サービスです。

┌──────────────────────────────────────────────────────────────┐
│                   Amazon Cognito                              │
│                                                               │
│  ┌──────────────────────────────────────────────────────┐   │
│  │  User Pool(ユーザー認証)                            │   │
│  │  ├── ユーザーディレクトリ(メール/電話/ユーザー名)    │   │
│  │  ├── サインアップ / サインイン / パスワードリセット    │   │
│  │  ├── MFA(SMS/TOTP/WebAuthn)                       │   │
│  │  ├── ソーシャルログイン(Google/Facebook/Apple)    │   │
│  │  ├── SAML/OIDC Federation                          │   │
│  │  ├── Lambda トリガー(カスタマイズ)                 │   │
│  │  └── JWT Token 発行(ID/Access/Refresh)           │   │
│  └──────────────────────────────────────────────────────┘   │
│                                                               │
│  ┌──────────────────────────────────────────────────────┐   │
│  │  Identity Pool(AWS リソースアクセス)                │   │
│  │  ├── 認証済みユーザーの一時 AWS 認証情報発行          │   │
│  │  ├── ゲストアクセス(未認証)                        │   │
│  │  ├── S3/DynamoDB への直接アクセス制御               │   │
│  │  └── IAM ロール マッピング                          │   │
│  └──────────────────────────────────────────────────────┘   │
└──────────────────────────────────────────────────────────────┘

Cognito が解決する課題

認証システム自前開発の排除

問題: パスワードハッシュ・セッション管理・MFA・トークン発行を自前実装するのはセキュリティリスクと開発コストが高い。

Cognito の解決: AWSが PCI DSS / HIPAA / GDPR 準拠で管理するマネージドサービス。数時間で本番品質の認証基盤を構築。

モバイル App から AWS リソースへの直接アクセス

問題: モバイルアプリから S3 / DynamoDB に直接アップロード・アクセスしたいが、API Gateway を経由すると遅い。

Cognito の解決: Identity Pool で一時的な AWS 認証情報を発行 → モバイルアプリが直接 AWS サービスにアクセス(低レイテンシ)。

マルチテナント SaaS の認証基盤

問題: 複数の顧客がログインでき、各顧客ごとにデータを分離する必要。

Cognito の解決: User Pool でユーザー管理 + API Gateway / AppSync のオーソライザー + Lambda トリガーで顧客 ID に基づくデータフィルタリング。

エンタープライズ SSO(シングルサインオン)

問題: 企業顧客が Okta / Azure AD で管理されており、それと連携したい。

Cognito の解決: SAML / OIDC フェデレーション で既存 IdP と統合。


主な特徴

特徴 説明 使い所
ユーザーディレクトリ メール・電話・ユーザー名で管理 SaaS / モバイルアプリ
セルフサービス登録 ユーザーが自分で登録可能 B2C アプリ
MFA SMS OTP / TOTP / WebAuthn 高セキュリティが必要
Passkeys(FIDO2) パスワード不要の認証 モダンセキュリティ
ソーシャルログイン Google / Facebook / Apple 連携 B2C エクスペリエンス
SAML/OIDC Federation エンタープライズ IdP 統合 B2B SaaS / 企業向け
Lambda トリガー カスタム認証フロー・トークン拡張 複雑な要件
Hosted UI ゼロコード・ブランド化可能 迅速導入
API Gateway 統合 JWT オーソライザー で REST API 保護 REST API
AppSync 統合 GraphQL API の認証 GraphQL / リアルタイム
Adaptive Authentication 異常ログイン検知・MFA 動的要求 セキュリティ強化
Identity Pool AWS リソース直接アクセス モバイル / IoT

アーキテクチャ

初心者向けメモ: Cognito は 3 層構造です。クライアント(ブラウザ・モバイルアプリ)が User Pool で認証 → JWT を取得。その JWT を使って API Gateway / AppSync / AWS リソースにアクセス、または Identity Pool で AWS 認証情報に交換。

全体データフロー

【図1】Cognito 認証・認可フロー:

graph TD
    Client["クライアント<br/>(ブラウザ/モバイル)"]
    UP["User Pool<br/>(認証)"]
    JWT["JWT Token<br/>(ID, Access, Refresh)"]
    IP["Identity Pool<br/>(AWS リソース)"]
    AWS["AWS リソース<br/>(S3/DynamoDB/API)"]
    IDP["External IdP<br/>(Google/Okta/Azure AD)"]

    Client -->|サインアップ/サインイン| UP
    UP -->|成功| JWT
    UP -->|Federation| IDP
    IDP -->|ID Token| UP
    JWT -->|API Gateway オーソライザー| AWS
    JWT -->|交換| IP
    IP -->|一時認証情報| AWS
    Client -->|直接アクセス| AWS

User Pool の詳細

ユーザー(ブラウザ/モバイル/API)
    ↓ サインアップ
ユーザーディレクトリ
    ├── メール / 電話 / ユーザー名
    ├── パスワードハッシュ(bcrypt)
    ├── MFA デバイス
    └── カスタムアトリビュート

    ↓ サインイン
認証チャレンジ
    ├── パスワード検証
    ├── MFA チャレンジ(SMS/TOTP)
    ├── Adaptive Authentication(リスク検出)
    └── Lambda トリガー(カスタムロジック)

    ↓
JWT トークン(クレーム含む)
    ├── ID Token(ユーザー情報)
    ├── Access Token(API 呼び出し)
    └── Refresh Token(再認証)

User Pool(認証 IdP)

User Pool の主要機能

機能 説明 設定箇所
User Attributes メール・電話・カスタム属性 General Settings
Password Policy 最小長・複雑さ・有効期限 Policies
Sign-Up / Sign-In セルフサービス登録・管理者承認 App Integration
MFA SMS OTP・TOTP・WebAuthn Multi-Factor Auth
High-Risk Transactions 追加検証が必要な操作 Advanced Security
Account Takeover Protection 不正アクセス検知 Advanced Security
Account Recovery パスワードリセット・アカウント復旧 Account Recovery Settings
Groups ロールベースアクセス制御 Users and Groups
Lambda Triggers カスタマイズポイント(Pre/Post Sign-up, Auth 等) App Integration

User Pool 設定の実装例

UserPoolName: MyAppUserPool
Policies:
  PasswordPolicy:
    MinimumLength: 12
    RequireUppercase: true
    RequireLowercase: true
    RequireNumbers: true
    RequireSymbols: true
    
AutoVerifiedAttributes:
  - email
  
LambdaConfig:
  PreSignUp: arn:aws:lambda:us-east-1:123456:function:PreSignUp
  PostConfirmation: arn:aws:lambda:us-east-1:123456:function:PostConfirmation
  PreTokenGeneration: arn:aws:lambda:us-east-1:123456:function:PreTokenGeneration
  
Schema:
  - Name: email
    AttributeDataType: String
    Mutable: true
    Required: true
  - Name: phone_number
    AttributeDataType: String
    Mutable: true
  - Name: organization
    AttributeDataType: String
    Mutable: true
    DeveloperOnlyAttribute: false

Identity Pool(AWS リソースアクセスの一時認証情報発行)

Identity Pool の役割

認証済みユーザー(JWT)
    ↓
Cognito Identity Pool
    ↓ STS AssumeRoleWithWebIdentity
IAM 一時認証情報
    ├── AccessKey
    ├── SecretAccessKey
    └── SessionToken(有効期限付き)
    ↓
AWS リソース に直接アクセス
    ├── S3(PUT / GET)
    ├── DynamoDB(Query / Scan)
    ├── Kinesis
    └── API Gateway Invoke

未認証(ゲスト)アクセス

未認証ユーザー
    ↓
Identity Pool(ゲストロール)
    ↓ STS AssumeRole
制限付き AWS 認証情報
    ↓
S3 からダウンロード(特定プレフィックスのみ)
DynamoDB スキャン禁止(Query のみ)

User Pool vs Identity Pool

観点 User Pool Identity Pool
役割 ユーザー認証(Who are you?) AWS リソースアクセス(What can you do?)
発行するもの JWT トークン AWS 一時認証情報(STS)
対象ユーザー アプリのエンドユーザー AWS リソースへのアクセスが必要な者
使用例 1 API Gateway Cognito オーソライザー モバイルアプリが S3 に直接アップロード
使用例 2 SPA ログイン IoT デバイスが DynamoDB に直接書き込み
使用例 3 B2B SaaS SSO フロントエンド + Lambda が DynamoDB にアクセス
寿命 長い(Refresh Token で再取得) 短い(1 時間以下)

2 つを組み合わせるパターン

User Pool でサインイン
    ↓
ID Token + Access Token 取得
    ↓
フロントエンドが Identity Pool に ID Token を渡す
    ↓
Identity Pool が STS AssumeRoleWithWebIdentity を実行
    ↓
AWS 一時認証情報を取得
    ↓
AWS SDK を使い S3 / DynamoDB に直接アクセス

認証フロー

1. OAuth 2.0 Authorization Code Flow(標準)

最も安全。Web App・モバイルアプリに推奨。

1. ユーザーが「Login」クリック
2. Cognito Hosted UI へリダイレクト
3. ユーザーがクレデンシャルを入力
4. Cognito が Authorization Code を返す
5. バックエンド が Authorization Code を JWT に交換(PKCE 検証)
6. JWT をフロントエンドに返す
7. フロントエンドが JWT でリクエスト(Authorization ヘッダ)

2. Implicit Flow(非推奨 → PKCE に統合)

過去の標準だが、PKCE が推奨される理由で非推奨。

3. Resource Owner Password Credentials(直接入力)

ユーザーがアプリ内でパスワードを入力。セキュリティリスク。レガシーシステムのみ。

4. SRP(Secure Remote Password)

Cognito SDK でのクライアント側実装。パスワードが平文で送信されない。

from boto3 import client

cognito = client('cognito-idp')

response = cognito.initiate_auth(
    ClientId='your_client_id',
    AuthFlow='USER_SRP_AUTH',
    AuthParameters={
        'USERNAME': 'user@example.com',
        'SRP_A': srp_a_value
    }
)

# チャレンジレスポンス処理...

5. Custom Authentication Flow(Lambda トリガー)

独自の認証ロジック(OTP・生体認証等)を実装。

6. SAML / OIDC Federation Flow

外部 IdP(Okta・Azure AD)でログイン。

ユーザー → Cognito User Pool
    ↓ SAML/OIDC Auth Request
外部 IdP(Okta / Azure AD)
    ↓ SAML/OIDC Response(Assertion)
Cognito
    ↓ JWT に変換
アプリ

主要ユースケース

初心者向けメモ: Cognito は「B2C App 向け」と思われがちですが、実は SaaS・IoT・エンタープライズ等、様々なシナリオで使われます。ここでは実務でよくある 10+ のユースケースを整理します。

1. B2C アプリのユーザー認証

典型的な SaaS / Web アプリ。ユーザーがセルフサービスで登録・ログイン。

活用例:

  • E-commerce サイト(Amazon・楽天型)
  • コンテンツプラットフォーム(Netflix・Medium 型)
  • SaaS ツール(Figma・Notion 型)

実装:

  • Hosted UI → User Pool → JWT → API Gateway Cognito オーソライザー → Lambda

2. モバイルアプリ + DynamoDB 直接アクセス

モバイルゲーム・IoT がバックエンド API を経由せず DynamoDB / S3 に直接書き込み。

活用例:

  • リーダーボード(DynamoDB)にスコア直接書き込み
  • ユーザーのプロフィール画像を S3 に直接アップロード
  • オフラインでローカル DB、オンライン時に DynamoDB 同期

実装:

User Pool JWT
    ↓
Identity Pool で AWS 認証情報に交換
    ↓
AWS SDK(iOS/Android)で DynamoDB Query

3. B2B SaaS マルチテナント

顧客ごとにデータを分離。Cognito Groups + Lambda カスタマイズ。

活用例:

  • Slack / Salesforce / HubSpot 型の SaaS
  • 顧客ごとに組織・ユーザーを管理
  • API レスポンス にテナント ID フィルタを自動付加

実装:

User Pool サインイン
    ↓
Lambda Pre Token Generation で customer_id を JWT に追加
    ↓
API Gateway Lambda オーソライザーで JWT.customer_id 検証
    ↓
Lambda が customer_id でデータ フィルタ

4. エンタープライズ SSO(SAML)

企業ユーザーが Okta / Azure AD でログイン。

活用例:

  • 社員向けポータルサイト
  • B2B パートナーポータル
  • Slack / Jira 等の SaaS 連携

実装:

企業 IdP(Okta / Azure AD)との SAML 統合
    ↓
Cognito が SAML Assertion を JWT に変換
    ↓
アプリ が JWT でリクエスト

5. IoT デバイス認証

IoT センサー・エッジデバイスが MQTT / HTTP で AWS にデータ送信。

活用例:

  • 工業用途:温度・気圧センサー
  • スマートホーム:照明・空調制御
  • 農業 IoT:土壌水分・光量測定

実装:

IoT Device Certificates(別途管理)と併用
もしくは
Device が User Pool に登録 → Device Secret で認証
    ↓
Identity Pool で AWS 認証情報取得
    ↓
AWS IoT Core / Kinesis へデータ送信

6. フロントエンド + Cognito + GraphQL(AppSync)

リアルタイムデータが必要な App。AppSync(GraphQL)と Cognito を組み合わせ。

活用例:

  • リアルタイムチャットアプリ
  • コラボレーションツール
  • ライブダッシュボード

実装:

AppSync API Authorization Type: USER_POOL
    ↓
User Pool JWT を Authorization ヘッダに
    ↓
AppSync が JWT 検証 → Resolver 実行
    ↓
Subscription で リアルタイム更新

7. Admin / User 階層アクセス制御

ユーザーのロールに応じて API アクセスを制御。

活用例:

  • CMS:Admin が投稿編集、Viewer が閲覧のみ
  • エンタープライズポータル:管理者・一般ユーザー・ゲスト の 3 レベル

実装:

User Pool Groups(Admin / Editor / Viewer)
    ↓
JWT Claim に groups を追加(Lambda Pre Token Generation)
    ↓
API Gateway Lambda オーソライザーで groups 検証
    ↓
権限に応じた処理分岐

8. ソーシャルログイン(Google / Facebook / Apple)

外部プロバイダーのアカウントで One-Tap ログイン。

活用例:

  • 消費者向けアプリ(手軽なサインアップ)
  • Web サービス(プロフィール情報の自動取得)

実装:

Google / Facebook / Apple Sign-in Button
    ↓
Cognito User Pool にフェデレーション設定
    ↓
Cognito が ID Token を JWT に変換
    ↓
アプリが JWT で API 呼び出し

9. Compliance + HIPAA / PCI-DSS

医療・金融業界の厳格な規制。Cognito の組み込みコンプライアンス機能。

活用例:

  • 医療 SaaS:患者 ID / 処方情報を HIPAA 準拠で管理
  • 決済 SaaS:カード番号不保持(PCI-DSS)

実装:

Cognito Encryption(AWS KMS)
    ↓
Audit Logs(CloudTrail)
    ↓
VPC Endpoint で Private Link 通信
    ↓
Data Residency(特定リージョンのみ)

10. パスキー / WebAuthn(Passwordless)

パスワード不要。生体認証・セキュリティキー。最新標準。

活用例:

  • 高セキュリティが求められるアプリ
  • ユーザー体験向上(パスワード忘却なし)

実装:

User が フェイスID / Touch ID / USB セキュリティキー で認証
    ↓
Cognito が WebAuthn Assertion を検証
    ↓
JWT 発行

11. API Gateway + Cognito Authorizer

REST API 全体を Cognito User Pool で保護。

活用例:

API Gateway Method
    ↓ Authorizer Type: Cognito User Pools
    ↓ User Pool: MyUserPool
    ↓
クライアント Authorization: Bearer $ID_TOKEN
    ↓
API Gateway が JWT を検証
    ↓ 成功 → Lambda 実行
    ↓ 失敗 → 401 Unauthorized

12. ユースケース適性マトリクス

シナリオ Cognito 適性 備考
B2C App ★★★★★ 最も王道
B2B SaaS マルチテナント ★★★★★ Groups + Lambda で実装可
エンタープライズ SSO ★★★★ SAML/OIDC Federation
モバイル + DynamoDB ★★★★★ Identity Pool との組み合わせ
IoT 認証 ★★★★ Device Certificates と併用
Passwordless ★★★★★ WebAuthn / Passkey 標準化
GraphQL + リアルタイム ★★★★ AppSync との統合
HIPAA/PCI-DSS 準拠 ★★★★ 組み込み Audit / Encryption
高スケール(100M+ ユーザー) ★★★★ 完全マネージド
レガシー LDAP 統合 ★★ Lambda カスタマイズで対応

ソーシャル ID プロバイダ統合

対応プロバイダ

Cognito はネイティブサポート:

プロバイダ 設定項目 取得属性
Google Client ID / Client Secret email, name, picture, locale
Facebook App ID / App Secret email, name, picture, hometown
Apple Team ID / Service ID / Key email, name(初回のみ)
Amazon Client ID / Client Secret email, name, profile
Custom OIDC Discovery URL / Client ID / Secret スコープで指定

実装フロー

1. App Client Settings で Social Providers 登録
2. User Pool に OAuth 2.0 Scopes 設定(email / profile 等)
3. Hosted UI or Custom UI で プロバイダボタン表示
4. ユーザーがボタンクリック → 外部 IdP へリダイレクト
5. ユーザーが認可 → IdP が Code をアプリに返す
6. Cognito が ID Token と一緒に JWT 発行
7. アプリが JWT で API 呼び出し

Cognito Hosted UI の Social Login

<!-- ブラウザリダイレクト -->
<a href="https://myapp.auth.us-east-1.amazoncognito.com/oauth2/authorize?
  client_id=YOUR_CLIENT_ID&
  response_type=code&
  scope=openid+profile+email&
  redirect_uri=https://myapp.example.com/callback&
  identity_provider=Google">
  Sign in with Google
</a>

SAML / OIDC IdP 統合

Okta との SAML 連携

企業ユーザー(Okta 管理)
    ↓ Okta ログイン
Okta Identity Provider
    ↓ SAML Assertion
Cognito User Pool
    ↓ Just-In-Time Provisioning(初回自動登録)
User Pool ユーザーディレクトリ
    ↓
JWT Token

Okta 設定例

<!-- SAML Metadata(Okta発行) -->
<EntityDescriptor entityID="https://company.okta.com">
  <IDPSSODescriptor ...>
    <KeyDescriptor use="signing">
      <KeyInfo>
        <X509Certificate>...</X509Certificate>
      </KeyInfo>
    </KeyDescriptor>
    <SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
      Location="https://company.okta.com/app/amazon_aws/exk.../sso/saml" />
  </IDPSSODescriptor>
</EntityDescriptor>

Cognito 側:

1. User Pool → Identity Providers → Add Provider
2. Type: SAML
3. Provider name: Okta
4. Metadata URL: https://company.okta.com/app/.../metadata.xml
5. Save
6. App Client に Okta プロバイダを追加

Azure AD との OIDC 連携

Azure AD ユーザー(企業管理)
    ↓
Azure AD OAuth2 Token Endpoint
    ↓
Cognito User Pool
    ↓ JWT Token

MFA(Multi-Factor Authentication)

対応 MFA 方式

MFA タイプ 説明 セキュリティ UX
SMS OTP SMS で 6 桁コード送信 中(SIM スワップ攻撃) 中(SMS 遅延)
TOTP Google Authenticator / Authy 高(デバイス内)
WebAuthn セキュリティキー / 生体認証 最高 最高(FIDO2)
Email OTP メールで OTP 送信 低(メール盗聴)

MFA 有効化

# User Pool Settings
user_pool = {
    'MfaConfiguration': 'OPTIONAL',  # OPTIONAL / REQUIRED / OFF
    'EnabledMfas': ['SOFTWARE_TOKEN_MFA', 'SMS_MFA']
}

# User が MFA デバイスを登録
response = cognito.admin_set_user_mfa_preference(
    UserPoolId='user_pool_id',
    Username='user@example.com',
    SMSMfaSettings={'Enabled': True, 'Preferred': True}
)

MFA チャレンジフロー

  1. ユーザーがパスワード入力
  2. Cognito が MFA チャレンジを返す(ChallengeName: SOFTWARE_TOKEN_MFA)
  3. ユーザーが TOTP コードを入力
  4. Cognito が検証 → JWT 発行

Passkeys(passwordless 認証)

WebAuthn / FIDO2 標準

Passkeys は FIDO2 仕様に基づくパスワード不要の認証。秘密鍵がユーザーのデバイスに保管され、サーバーには公開鍵のみ保存。

対応デバイス

ローカルデバイス内

  • 顔認証(Face ID / Windows Hello)
  • 指紋認証(Touch ID / Android Biometric)

物理セキュリティキー

  • FIDO2 セキュリティキー(YubiKey、Google Titan 等)

クロスデバイス

  • 携帯が認証器(QR コード)

Cognito での Passkey 設定

UserPool:
  PasswordPolicy:
    # Passkey のみで、パスワードは不要に設定可
    TemporaryPasswordValidityDays: 0
  
  Schema:
    # WebAuthn 対応属性は自動的に含まれる
    - Name: email
    - Name: phone_number

Passkey 登録・認証フロー

// 1. Passkey 登録
const credentialCreationOptions = await cognito.startWebAuthnRegistration({
  username: 'user@example.com'
});

const credential = await navigator.credentials.create({
  publicKey: credentialCreationOptions.publicKeyCredentialCreationOptions
});

await cognito.completeWebAuthnRegistration({
  credential,
  userHandle: credentialCreationOptions.userHandle
});

// 2. Passkey 認証
const credentialRequestOptions = await cognito.startWebAuthnAuthentication({
  username: 'user@example.com'
});

const assertion = await navigator.credentials.get({
  publicKey: credentialRequestOptions.publicKeyCredentialRequestOptions
});

const tokens = await cognito.completeWebAuthnAuthentication({
  assertion,
  challenge: credentialRequestOptions.challenge
});

カスタム認証フロー(Lambda Trigger)

Custom Auth Challenge

独自の認証ロジック(OTP・セキュリティ質問・生体認証等)を Lambda で実装。

クライアント
    ↓ InitiateAuth(AuthFlow: CUSTOM_AUTH)
Cognito User Pool
    ↓ Lambda Trigger: CustomMessage, DefineAuthChallenge
Lambda(カスタム認証ロジック)
    ↓ チャレンジ内容を返す
クライアント
    ↓ チャレンジレスポンス
Lambda(検証)
    ↓
JWT 発行

実装例:OTP ベースカスタム認証

def define_auth_challenge(event, context):
    """
    認証フロー定義:
    1. 初回 → OTP チャレンジを返す
    2. 2 回目 → OTP 検証(Lambda Trigger: VerifyAuthChallengeResponse)
    """
    if event['request']['session'] == []:
        # 初回リクエスト
        event['response']['challengeName'] = 'CUSTOM_CHALLENGE'
        event['response']['issueTokens'] = False
        event['response']['failAuthentication'] = False
    elif len(event['request']['session']) >= 1:
        # OTP 検証後
        last_session = event['request']['session'][-1]
        if last_session['authFlow'] == 'CUSTOM_CHALLENGE' and last_session['challengeResult'] == True:
            event['response']['issueTokens'] = True
            event['response']['failAuthentication'] = False
        else:
            event['response']['failAuthentication'] = True
    
    return event

def verify_auth_challenge_response(event, context):
    """OTP 検証"""
    user_id = event['userName']
    challenge_answer = event['request']['challengeAnswer']
    
    # DynamoDB から保存済み OTP を取得
    otp_code = get_otp_from_dynamodb(user_id)
    
    if challenge_answer == otp_code:
        event['response']['answerCorrect'] = True
    else:
        event['response']['answerCorrect'] = False
    
    return event

Lambda トリガーの詳細

トリガータイミング

トリガー タイミング 用途
Pre Sign-up サインアップ前 バリデーション・自動承認 メールドメイン制限
Post Confirmation 登録確認後 ユーザー DB 作成 DynamoDB にユーザー作成
Pre Authentication サインイン前 ユーザー検証 2 要素認証準備
Post Authentication サインイン後 ログ記録・分析 CloudWatch Logs 送信
Pre Token Generation JWT 生成前 クレーム追加・カスタマイズ customer_id を JWT に追加
User Migration レガシーシステムから移行 オンデマンド認証 旧システムの認証関数呼び出し
Custom Message メール/SMS 送信前 メッセージカスタマイズ メールテンプレート動的生成
Define Auth Challenge 認証フロー定義 カスタム認証フロー OTP・セキュリティ質問
Verify Auth Challenge Response チャレンジレスポンス検証 検証ロジック OTP コード検証
Custom Authentication カスタム認証 認証フロー実装 独自プロトコル

Pre Token Generation 例

def lambda_handler(event, context):
    """
    JWT に カスタムクレームを追加
    """
    user_attributes = event['request']['userAttributes']
    user_id = user_attributes['sub']
    email = user_attributes['email']
    
    # DynamoDB から顧客情報を取得
    customer = get_customer_from_dynamodb(user_id)
    
    # JWT の custom claim に追加
    event['response']['claimsOverrideDetails'] = {
        'claimsToAddOrOverride': {
            'customer_id': customer['id'],
            'tenant_id': customer['tenant_id'],
            'role': customer['role'],
            'permissions': ','.join(customer['permissions'])
        },
        'claimsToSuppress': [],
        'groupConfigurationOverrides': {
            'groupsToOverride': [],
            'iamRolesToOverride': [],
            'preferredRole': None
        }
    }
    
    return event

生成された JWT(デコード後):

{
  "sub": "12345",
  "email": "user@example.com",
  "customer_id": "cust_123",
  "tenant_id": "tenant_456",
  "role": "admin",
  "permissions": "read,write,delete",
  "iat": 1234567890,
  "exp": 1234571490
}

Hosted UI とカスタム UI

Cognito Hosted UI の利点

ゼロコード

  • ログイン・パスワードリセット・MFA 画面が自動生成

セキュリティ標準

  • PKCE、CSRF トークン自動実装

ブランディング

  • ロゴ・配色・カスタム CSS でカスタマイズ

マルチ言語対応

  • UI が多言語で自動表示

Hosted UI 設定

Cognito User Pool → App Integration → App Client
    ↓
Hosted UI Domain: myapp.auth.us-east-1.amazoncognito.com
    ↓
Callback URLs: https://myapp.example.com/callback
    ↓
Allowed OAuth Flows: Authorization Code Grant
    ↓
Allowed OAuth Scopes: openid profile email

Hosted UI へのリダイレクト

<a href="https://myapp.auth.us-east-1.amazoncognito.com/login?
  client_id=YOUR_CLIENT_ID&
  response_type=code&
  scope=openid+profile+email&
  redirect_uri=https://myapp.example.com/callback">
  Login
</a>

カスタム UI

Cognito SDK(AWS Amplify Auth、boto3、AWS SDK)を使い独自 UI を実装。

// Amplify Auth(React)
import { Auth } from 'aws-amplify';

const signIn = async () => {
  try {
    const user = await Auth.signIn(username, password);
    console.log('Logged in', user);
  } catch (error) {
    console.error('Sign in error', error);
  }
};

// MFA チャレンジ
const challengeResponse = await Auth.confirmSignIn(user, code, 'SOFTWARE_TOKEN_MFA');

アダプティブ認証(リスクベース)

Advanced Security Features

Cognito は ユーザーのログイン行動を分析し、異常検知。

機能 動作 効果
Account Takeover Protection 未知のデバイス・ロケーション・時間帯 → MFA 強制 不正ログイン検知
Compromised Credentials Detection 漏洩パスワード検出 → パスワード変更強制 流出対策
Risk Configuration リスクレベルに応じた動的 MFA セキュリティバランス

設定例

UserPool:
  AccountRecoverySetting:
    RecoveryMechanisms:
      - Name: verified_email
      - Name: verified_phone_number
  
  DeviceConfiguration:
    ChallengeRequiredOnNewDevice: true
    DeviceOnlyRememberedOnUserPrompt: false
  
  UserAttributeUpdateSettings:
    AttributesRequireVerificationBeforeUpdate:
      - email
      - phone_number

トークン(ID, Access, Refresh)

JWT クレーム詳細

ID Token(ユーザー情報)

{
  "sub": "12345",                 // User ID
  "email": "user@example.com",
  "email_verified": true,
  "name": "John Doe",
  "given_name": "John",
  "family_name": "Doe",
  "phone_number": "+1234567890",
  "phone_number_verified": true,
  "cognito:username": "john.doe",
  "cognito:groups": ["admin", "moderator"],
  "custom:tenant_id": "tenant_123",
  "aud": "client_id_123",          // Client ID
  "event_id": "event_123",
  "token_use": "id",
  "iat": 1234567890,               // Issued at
  "exp": 1234571490,               // Expires
  "auth_time": 1234567890,
  "iss": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_abc123"
}

Access Token(API 呼び出し・リソースアクセス)

{
  "sub": "12345",
  "device_key": "us-east-1_abc123",
  "cognito:groups": ["admin"],
  "event_id": "event_123",
  "token_use": "access",
  "scope": "openid profile email",
  "auth_time": 1234567890,
  "iss": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_abc123",
  "exp": 1234571490,
  "iat": 1234567890,
  "jti": "jti_123",
  "client_id": "client_id_123",
  "username": "john.doe"
}

Refresh Token(長寿命)

  • Refresh Token: eyJjdHkiOiJKV1QiLCJhbGciOiJIUzI1NiJ9…
  • 用途: 新しい ID / Access Token を取得
  • 有効期限: 最大 365 日(設定可能)
  • 送信先: /oauth2/token エンドポイント

トークン有効期限設定

AppClient:
  IdTokenValidity: 60              # 分単位(default: 60)
  AccessTokenValidity: 60          # 分単位(default: 60)
  RefreshTokenValidity: 30         # 日単位(default: 30)
  TokenValidityUnits:
    IdToken: 'minutes'
    AccessToken: 'minutes'
    RefreshToken: 'days'

グループ・ロール

User Pool Groups

ロールベースアクセス制御(RBAC)を User Pool Groups で実装。

Admin Group
    ├── Permission: user:create, user:delete, user:update
    └── IAM Role: arn:aws:iam::123456:role/AdminRole

Editor Group
    ├── Permission: post:create, post:update
    └── IAM Role: arn:aws:iam::123456:role/EditorRole

Viewer Group
    ├── Permission: post:read
    └── IAM Role: arn:aws:iam::123456:role/ViewerRole

Group 割り当て

# ユーザーをグループに追加
cognito.admin_add_user_to_group(
    UserPoolId='user_pool_id',
    Username='john.doe',
    GroupName='Admin'
)

# ユーザーのグループ一覧
groups = cognito.admin_list_groups_for_user(
    UserPoolId='user_pool_id',
    Username='john.doe'
)

JWT に Groups を含める

Lambda Pre Token Generation で自動的に JWT に cognito:groups が含まれる。

{
  "cognito:groups": ["Admin", "Editor"],
  "cognito:username": "john.doe",
  ...
}

クォータと制限

主要制限値

項目 制限 増強方法
User Pool あたりのユーザー数 無制限 -
User Attributes 最大 50 個(カスタム 50 個) -
App Client 数 最大 25 個 AWS Support に申請
Identity Provider 数 最大 20 個 AWS Support に申請
User Pool 数 リージョンあたり制限なし -
API リクエスト Rate 制限あり(API タイプ別) Throttling 対応設計
パスワードの有効期限 最大 365 日 -
MFA デバイス数 ユーザーあたり最大 20 個 -

セキュリティ コンプライアンス

コンプライアンス認証

PCI DSS 3.2.1

  • クレジットカード情報処理基準

HIPAA / HITECH

  • 医療情報保護

GDPR

  • 欧州個人データ保護

SOC 2 Type I & II

  • セキュリティ・可用性・処理完全性

FedRAMP

  • 米国政府クラウドセキュリティ

セキュリティ機能

機能 説明
Encryption at Rest AWS KMS でデータベース暗号化
Encryption in Transit TLS 1.2+ で通信暗号化
Audit Logs CloudTrail で全操作ログ
VPC Support VPC Endpoint で Private Link 通信
IP Whitelisting App Client IP 制限
Account Lockout ブルートフォース攻撃対策
Session Token Rotation セッショントークン定期更新

Cognito Sync(廃止予定 → AppSync 推奨)

Cognito Sync は 廃止予定。今後は AppSync(AWS GraphQL サービス) への移行を推奨。

代替手段

AppSync

  • GraphQL API でリアルタイムデータ同期
  • Cognito User Pool と統合

DynamoDB Streams

  • Lambda 経由でクライアントに更新通知

Amazon MQ / EventBridge

  • パブサブ型のイベント配信

他の類似ツールとの比較

初心者向けメモ: 認証・認可サービスは Cognito 以外にも Auth0・Okta・Firebase Auth 等があります。選定軸は「AWS 統合の深さ」「機能の豊富さ」「コスト」「サポート」です。

Cognito vs Auth0

項目 Cognito Auth0
AWS 統合 深い(IAM・API Gateway 等) プラグイン必要
機能 基本~中級 エンタープライズ級
カスタマイズ Lambda トリガー Rules / Actions
無料枠 50,000 MAU 7,500 MAU
料金(中規模) 中~高
ベンダロック 低(AWS) 高(Auth0 専用)
サポート AWS Support 24/7 プレミアム

Cognito vs Okta

項目 Cognito Okta
対象 B2C / B2B / エンタープライズ エンタープライズ重視
SSO SAML/OIDC 対応 高度な SSO
Mobile 得意 弱い
コスト
複雑な要件 Lambda で対応 Policy Engine

Cognito vs Firebase Authentication

項目 Cognito Firebase Auth
AWS 統合 最高 なし(Google Cloud)
データベース DynamoDB と自動連携 Firestore / Realtime DB
機能 豊富 基本機能
無料枠 50,000 MAU 利用量ベース
価格 AWS pricing(従量) Google Cloud pricing
学習コスト
エコシステム AWS 製品多数 Google Cloud 限定

Cognito vs Azure AD B2C

項目 Cognito Azure AD B2C
クラウド AWS Azure
Machine Learning Basic 高度な異常検知
SAML
コスト
サポート AWS Support Microsoft Support

クライアントライブラリとエコシステム

初心者向けメモ: Cognito は Web・モバイル・サーバーサイド等、様々な言語・フレームワークから使用できます。AWS Amplify(推奨)から低レベル SDK まで、選択肢が豊富です。

公式 SDK・ライブラリ

言語 / フレームワーク ライブラリ 推奨度
JavaScript / React aws-amplify (Auth) ★★★★★
iOS / Swift amplify-swift ★★★★★
Android / Kotlin amplify-android ★★★★★
Python boto3 / python-cognito ★★★★
Node.js aws-sdk-js-v3 ★★★★
Java aws-java-sdk-cognitoidp ★★★★
Go aws-sdk-go-v2 ★★★
.NET / C# AWSSDK.CognitoIdentity ★★★

AWS Amplify(推奨)

最新の Web・モバイル開発向けツールセット。

// React + Amplify Auth
import { Authenticator } from '@aws-amplify/ui-react';
import { Auth } from 'aws-amplify';

<Authenticator>
  {({ signOut, user }) => (
    <main>
      <h1>Hello {user.username}</h1>
      <button onClick={signOut}>Sign out</button>
    </main>
  )}
</Authenticator>

REST API(低レベル)

# Authorization Code Flow
curl -X POST \
  https://myapp.auth.us-east-1.amazoncognito.com/oauth2/token \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=authorization_code&
      client_id=YOUR_CLIENT_ID&
      code=AUTH_CODE&
      redirect_uri=https://myapp.example.com/callback"

ベストプラクティス

✅ Do’s(実装推奨)

PKCE(Proof Key for Code Exchange)を使用

  • Authorization Code Flow で PKCE を必須に設定
  • スマートフォンアプリの認可コード奪取対策

Refresh Token を安全に保管

  • HttpOnly / Secure Cookie でサーバー側保管
  • クライアント側に Refresh Token を保持しない

ID Token vs Access Token を使い分け

  • API 呼び出し → Access Token
  • ユーザー情報表示 → ID Token

Lambda Pre Token Generation で JWT カスタマイズ

  • tenant_id・customer_id を JWT に追加
  • 一元的なアクセス制御

User Pool Groups で RBAC を実装

  • Admin / Editor / Viewer ロール
  • API Gateway Lambda オーソライザーで検証

MFA を本番環境で必須に

  • OPTIONAL → REQUIRED に変更(段階的導入)

パスワードポリシーを強制

  • 最小 12 文字
  • 大文字・小文字・数字・記号必須

Hosted UI の HTTPS 化

  • カスタムドメイン(自社 CNAME)を設定

❌ Don’ts(アンチパターン)

Implicit Grant Flow を使用(廃止)

  • ID Token / Access Token がブラウザ URL に露出
  • → PKCE + Authorization Code Flow を使用

Refresh Token をローカルストレージに保存

  • XSS 攻撃で盗まれる
  • → HttpOnly Cookie で保管

デフォルト Cognito ドメインを本番で使用

  • ブランドイメージに影響
  • → カスタムドメイン設定(App Integration → Domain Name)

User Pool のパスワードで AWS リソースアクセス

  • パスワードが漏洩 → AWS が侵害される
  • → Identity Pool で一時認証情報を発行

Lambda トリガーで重い処理(API 呼び出し等)

  • トリガーがタイムアウト(15 秒)
  • → 非同期化(SQS / SNS)を検討

App Client の Client Secret をフロントエンドに埋め込み

  • Secret が漏洩 → 不正な Token 取得可能
  • → Secret を使用しない設定(SPA / Mobile 向け)

トラブルシューティング

問題 1:JWT Token が Invalid

症状: API Gateway が 401 Unauthorized

原因:

  • JWT の署名検証失敗
  • Token の有効期限切れ
  • User Pool ID が変更

解決:

# Token の内容確認(JWT.io で デコード)
# 1. aud(Audience) が App Client ID と一致?
# 2. exp(Expiration) がまだ有効?
# 3. iss(Issuer) が正しい User Pool?

# API Gateway Authorizer ログ確認
CloudWatch Logs → /aws/apigateway/YOUR_STAGE

問題 2:MFA チャレンジが進まない

症状: SMS/TOTP 入力後も JWT が発行されない

原因:

  • MFA デバイス未登録
  • チャレンジレスポンス API の引数ミス

解決:

# MFA デバイス登録状況確認
response = cognito.admin_get_user(
    UserPoolId='user_pool_id',
    Username='user@example.com'
)
# UserMFASettingList に TOTP / SMS が含まれているか?

# チャレンジレスポンス送信
cognito.respond_to_auth_challenge(
    ClientId='app_client_id',
    ChallengeName='SOFTWARE_TOKEN_MFA',
    ChallengeResponse={'USERNAME': '...', 'SOFTWARE_TOKEN_MFA_CODE': '...'},
    Session='session_token_from_init_auth'
)

問題 3:Hosted UI でログイン後、callback にリダイレクトされない

症状: Hosted UI でログイン → redirect_uri に遷移しない

原因:

  • redirect_uri が App Client に登録されていない
  • PKCE state パラメータ不一致

解決:

Cognito User Pool → App Integration → App Clients
    ↓
Allowed Callback URLs: https://myapp.example.com/callback
Allowed Sign-Out URLs: https://myapp.example.com/signout
    ↓
保存(Save)

問題 4:Lambda Pre Token Generation で変更が反映されない

症状: JWT カスタムクレーム が出現しない

原因:

  • Lambda 実行ロール権限不足
  • イベント構造の理解ミス(claimsToAddOrOverride)

解決:

# Lambda ログ確認
print(json.dumps(event, indent=2))

# 返り値の構造確認
event['response']['claimsOverrideDetails'] = {
    'claimsToAddOrOverride': {
        'custom_claim': 'value'
    }
}

問題 5:Identity Pool で AWS リソースアクセス権限エラー

症状: S3 PutObject → AccessDenied

原因:

  • Identity Pool のロール ポリシーが不完全
  • 認証済みロール IAM ポリシーに S3 権限なし

解決:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject"
      ],
      "Resource": "arn:aws:s3:::mybucket/users/${aws:username}/*"
    }
  ]
}

2025-2026 最新動向

1. Passkey / WebAuthn の標準化

FIDO2 Alliance に準拠したパスキー認証が業界標準に。

動向: Apple / Google / Microsoft が Safari / Chrome / Edge で実装。Cognito も 2024 年に WebAuthn サポート拡大。

メリット:

  • パスワード漏洩リスク排除
  • UX 向上(フェイス ID / Touch ID)
  • フィッシング耐性

2. Adaptive Authentication(リスクベース)

異常ログインパターン検知 → 動的に MFA 要求。

実装: AWS ML Service と統合し、IP / デバイス / ロケーション / 時間帯を分析。

3. Cognito + API Gateway v2(HTTP API)

v2 の HTTP API では JWT オーソライザーがネイティブ対応。

# HTTP API + Cognito Authorizer(シンプル)
httpApi:
  authorizers:
    userPool:
      type: USER_POOLS
      identity:
        source: header.Authorization
        reauthorizeEvery: 3600
      identitySource: method.request.header.Authorization

4. AWS Bedrock Agent 認証

AI エージェントが Cognito ID トークンを使用して AWS リソースにアクセス。

# Bedrock Agent が Cognito 認証
agent = bedrock_agents.Agent(
    name='MyAgent',
    authorization_method='COGNITO',
    user_pool_id='us-east-1_abc123'
)

5. Zero Trust Security

エッジでの JWT 検証強化。

AWS WAF + Cognito で デバイス・IP・振る舞い検証を多層化。

6. CIAM(Customer Identity & Access Management)強化

B2C / B2B2C SaaS 向け機能拡充。

  • Progressive Profiling:段階的プロフィール入力
  • Passwordless At Scale:大規模パスキー展開
  • Consent Management:GDPR 同意管理

学習リソース

公式ドキュメント

リソース URL 用途
Cognito 開発者ガイド https://docs.aws.amazon.com/cognito/latest/developerguide/ 完全リファレンス
API リファレンス https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/ API 詳細
セキュリティベストプラクティス https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-security.html セキュリティ
Cognito アーキテクチャ https://docs.aws.amazon.com/whitepapers/latest/cognito-user-identity-architectures/ ホワイトペーパー

オンライン学習

  • Udemy : “AWS Cognito” コース
  • LinuxAcademy / A Cloud Guru : Cognito セッション
  • AWS Hands-on : Cognito Lab

ブログ・コミュニティ

  • AWS Developers Blog
  • Medium / Dev.to : Cognito チュートリアル
  • Stack Overflow : [amazon-cognito] タグ

実装例・活用シーン

シーン 1:SaaS マルチテナント

# User Pool + Lambda Pre Token Generation + API Gateway

# Lambda Pre Token Generation
def add_tenant_id_to_token(event, context):
    user_id = event['request']['userAttributes']['sub']
    tenant = get_user_tenant(user_id)  # DynamoDB から取得
    
    event['response']['claimsOverrideDetails'] = {
        'claimsToAddOrOverride': {
            'tenant_id': tenant['id'],
            'role': tenant['role']
        }
    }
    return event

# API Gateway Lambda オーソライザー
def authorize(event, context):
    token = event['authorizationToken']
    decoded = jwt.decode(token, options={"verify_signature": False})
    
    policy = {
        'principalId': decoded['sub'],
        'policyDocument': {
            'Statement': [{
                'Action': 'execute-api:Invoke',
                'Effect': 'Allow',
                'Resource': event['methodArn']
            }]
        },
        'context': {
            'tenantId': decoded['tenant_id'],
            'role': decoded['role']
        }
    }
    return policy

# Lambda ハンドラー
def handler(event, context):
    tenant_id = event['requestContext']['authorizer']['tenantId']
    # tenant_id でデータフィルタ
    items = dynamodb.query(
        TableName='Items',
        KeyConditionExpression='tenant_id = :tid',
        ExpressionAttributeValues={':tid': tenant_id}
    )
    return items

シーン 2:モバイルアプリ + DynamoDB 直接書き込み

// iOS + AWS Amplify + Cognito

import Amplify
import AWSCognitoAuthPlugin
import AWSS3StoragePlugin

// 初期化
func initializeAmplify() {
    do {
        try Amplify.add(plugin: AWSCognitoAuthPlugin())
        try Amplify.add(plugin: AWSS3StoragePlugin())
        try Amplify.configure()
    } catch {
        print("Failed to initialize", error)
    }
}

// サインアップ
func signUp(email: String, password: String) async {
    let userAttributes = [AuthUserAttribute(.email, value: email)]
    let options = AuthSignUpRequest.Options(userAttributes: userAttributes)
    
    let signUpResult = try await Amplify.Auth.signUp(
        username: email,
        password: password,
        options: options
    )
}

// サインイン
func signIn(email: String, password: String) async {
    let signInResult = try await Amplify.Auth.signIn(
        username: email,
        password: password
    )
}

// DynamoDB 直接書き込み
func writeToDatabase(leaderboardEntry: LeaderboardEntry) async {
    let data = try JSONEncoder().encode(leaderboardEntry)
    let request = AmazonDynamoDBRequest(
        tableName: "Leaderboard",
        item: data
    )
    
    let result = try await AmazonDynamoDB.putItem(request)
}

導入ロードマップ

Phase 1:基本設計(1-2 週間)

  • [ ] User Pool / Identity Pool の要件定義
  • [ ] 認証フロー(Hosted UI / Custom UI)決定
  • [ ] MFA 戦略(SMS / TOTP / Passkey)
  • [ ] Federation 要件(Social / SAML)

Phase 2:User Pool セットアップ(2-3 週間)

  • [ ] User Pool 作成 / 属性定義
  • [ ] App Client 設定(Redirect URI など)
  • [ ] メール / SMS 送信設定
  • [ ] Lambda トリガー作成(Pre Sign-up / Pre Token Generation)

Phase 3:UI 実装(2-4 週間)

  • [ ] Hosted UI デプロイ
  • または
  • [ ] Custom UI 開発(Amplify Auth)
  • [ ] Sign-up / Sign-in / MFA UI
  • [ ] パスワードリセット・メール検証

Phase 4:API・バックエンド統合(2-3 週間)

  • [ ] API Gateway + Cognito オーソライザー
  • [ ] Lambda でテナント ID フィルタ
  • [ ] Identity Pool + AWS リソースアクセス
  • [ ] DynamoDB ユーザーテーブル作成

Phase 5:テスト・セキュリティ(1-2 週間)

  • [ ] セキュリティテスト(JWT 改竄 / Token 盗聴)
  • [ ] MFA・復旧フロー テスト
  • [ ] Load テスト(API Rate Limiting)
  • [ ] 監査ログ確認(CloudTrail)

Phase 6:本番デプロイ(1 週間)

  • [ ] 本番環境 User Pool 作成
  • [ ] HTTPS / カスタムドメイン設定
  • [ ] バックアップ / 復旧計画
  • [ ] 監視・アラート設定(CloudWatch)

実装チェックリスト

セキュリティ

  • [ ] PKCE を Authorization Code Flow で必須化
  • [ ] Refresh Token を HttpOnly Cookie で保管
  • [ ] API Gateway で JWT 署名検証を有効化
  • [ ] HTTPS / TLS 1.2 以上
  • [ ] カスタムドメイン(Cognito ドメインでない)
  • [ ] VPC Endpoint で Private Link 通信(オプション)
  • [ ] AWS KMS で暗号化キー管理
  • [ ] CloudTrail 監査ログ有効化

機能

  • [ ] MFA 有効化(OPTIONAL / REQUIRED)
  • [ ] パスワードポリシー(最小 12 文字・複雑さ)
  • [ ] Account Lockout ポリシー
  • [ ] メール / SMS テンプレート カスタマイズ
  • [ ] Lambda トリガー(Pre Sign-up / Pre Token Generation / Post Auth)
  • [ ] User Pool Groups 作成(Admin / Editor / Viewer)

運用

  • [ ] バックアップ戦略(User データ定期エクスポート)
  • [ ] CloudWatch ダッシュボード(サインイン成功率 / エラー率)
  • [ ] アラート設定(API Throttle / Suspicious Activity)
  • [ ] ドキュメント作成(運用マニュアル)

まとめ

Amazon Cognito は AWS ネイティブのエンドユーザー認証・認可基盤。以下が本質:

User Pool:ユーザー認証(Who are you?)

  • JWT Token 発行
  • ソーシャル・SAML Federation
  • Lambda トリガーでカスタマイズ

Identity Pool:AWS リソースアクセス(What can you do?)

  • 一時 AWS 認証情報発行
  • S3 / DynamoDB 直接アクセス
  • モバイル・IoT 向け

主な利点

  • セキュリティ自前開発排除(PCI-DSS / HIPAA 準拠)
  • AWS 深い統合(API Gateway / AppSync / IAM)
  • 開発スピード(Hosted UI / Lambda トリガー)

2026 動向

  • Passkey / WebAuthn 標準化
  • Adaptive Authentication(リスクベース)
  • Zero Trust Security 多層化
  • CIAM 機能拡充(B2C SaaS)

選定判断:

  • AWS を主軸に開発 → Cognito
  • マルチクラウド / 複雑な要件 → Auth0 / Okta
  • Google Cloud 前提 → Firebase Auth

参考文献

公式 AWS ドキュメント

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

API リファレンス

SDK・ツール

コミュニティ

  • Stack Overflow : [amazon-cognito] タグ
  • AWS Re:Post : https://repost.aws/
  • GitHub : aws/amazon-cognito-* リポジトリ

2025-2026 最新参考文献

  1. WebAuthn and Passkeys Documentation - パスキー対応
  2. Passwordless Authentication with WebAuthn - ブログ
  3. Adaptive Authentication in Cognito - リスクベース認証
  4. FIDO Alliance Standards - FIDO2準拠認証
  5. W3C WebAuthn Specification - WebAuthn標準
  6. OAuth 2.1 Specification - OAuth最新仕様
  7. AWS Cognito Passwordless Auth Examples - サンプルコード
  8. Passkeys.dev - パスキー開発リソース

最終更新:2026-04-26