目次
- 初心者から実務者向けの包括的解説
- 概要
- Cognito が解決する課題
- 主な特徴
- アーキテクチャ
- User Pool(認証 IdP)
- Identity Pool(AWS リソースアクセスの一時認証情報発行)
- User Pool vs Identity Pool
- 認証フロー
- 主要ユースケース
- ソーシャル ID プロバイダ統合
- SAML / OIDC IdP 統合
- MFA(Multi-Factor Authentication)
- Passkeys(passwordless 認証)
- カスタム認証フロー(Lambda Trigger)
- Lambda トリガーの詳細
- Hosted UI とカスタム UI
- アダプティブ認証(リスクベース)
- トークン(ID, Access, Refresh)
- グループ・ロール
- クォータと制限
- セキュリティ コンプライアンス
- Cognito Sync(廃止予定 → AppSync 推奨)
- 他の類似ツールとの比較
- クライアントライブラリとエコシステム
- ベストプラクティス
- トラブルシューティング
- 2025-2026 最新動向
- 学習リソース
- 実装例・活用シーン
- 導入ロードマップ
- 実装チェックリスト
- まとめ
Amazon Cognito 完全ガイド 2026
初心者から実務者向けの包括的解説
Amazon Cognito は、Web・モバイル・IoT アプリ向けのエンドユーザー認証・認可・ユーザー管理をフルマネージドで提供する AWS サービスです。2 つのコンポーネント(User Pools と Identity 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 無料トライアル拡大
目次
- 概要
- Cognito が解決する課題
- 主な特徴
- アーキテクチャ
- User Pool(認証 IdP)
- Identity Pool(AWS リソースアクセスの一時認証情報発行)
- 認証フロー
- 主要ユースケース
- ソーシャル ID プロバイダ統合
- SAML / OIDC IdP 統合
- MFA(Multi-Factor Authentication)
- Passkeys(passwordless 認証)
- カスタム認証フロー(Lambda Trigger)
- Lambda トリガーの詳細
- Hosted UI とカスタム UI
- アダプティブ認証(リスクベース)
- トークン(ID, Access, Refresh)
- グループ・ロール
- クォータと制限
- セキュリティ コンプライアンス
- Cognito Sync(廃止予定 → AppSync 推奨)
- 他の類似ツールとの比較
- クライアントライブラリとエコシステム
- ベストプラクティス
- トラブルシューティング
- 2025-2026 最新動向
- 学習リソース
- 実装例・活用シーン
- 導入ロードマップ
- 実装チェックリスト
- まとめ
- 参考文献
概要
初心者向けメモ: 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 はネイティブサポート:
| プロバイダ | 設定項目 | 取得属性 |
|---|---|---|
| Client ID / Client Secret | email, name, picture, locale | |
| 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 チャレンジフロー
- ユーザーがパスワード入力
- Cognito が MFA チャレンジを返す(ChallengeName: SOFTWARE_TOKEN_MFA)
- ユーザーが TOTP コードを入力
- 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 ドキュメント
- https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html
- https://docs.aws.amazon.com/cognito/latest/developerguide/user-pools.html
- https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identity-pools.html
- https://aws.amazon.com/cognito/features/
- https://aws.amazon.com/cognito/pricing/
セキュリティ・ベストプラクティス
- https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-security.html
- https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-architectures.html
- https://aws.amazon.com/blogs/mobile/amazon-cognito-user-pool-security/
API リファレンス
- https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/
- https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/
SDK・ツール
- AWS Amplify : https://docs.amplify.aws/
- AWS SDK for Python (Boto3) : https://boto3.amazonaws.com/
- AWS SDK for JavaScript : https://docs.aws.amazon.com/sdk-for-javascript/
コミュニティ
- Stack Overflow : [amazon-cognito] タグ
- AWS Re:Post : https://repost.aws/
- GitHub : aws/amazon-cognito-* リポジトリ
2025-2026 最新参考文献
- WebAuthn and Passkeys Documentation - パスキー対応
- Passwordless Authentication with WebAuthn - ブログ
- Adaptive Authentication in Cognito - リスクベース認証
- FIDO Alliance Standards - FIDO2準拠認証
- W3C WebAuthn Specification - WebAuthn標準
- OAuth 2.1 Specification - OAuth最新仕様
- AWS Cognito Passwordless Auth Examples - サンプルコード
- Passkeys.dev - パスキー開発リソース
最終更新:2026-04-26