AWS Cognitoは、Webやモバイルアプリケーション向けのユーザー認証、認可、ユーザー管理を提供するマネージドサービスです。本記事では、Cognitoの基本概念から構成、設定方法、トークンの仕組み、セキュリティ対策に至るまで詳しく解説します。
1. AWS Cognitoとは?
AWS Cognitoは、開発者がユーザー管理機能を簡単に実装できるサービスであり、以下の特徴があります。
- ユーザーサインアップ/サインイン、パスワードリセットなどの基本機能
- Google、Facebook、Apple、SAML、OIDCなど外部IDプロバイダとの連携
- JWTベースのトークン認証(ID・アクセス・リフレッシュ)
- 多要素認証(MFA)やIAMとの統合による高度なセキュリティ
2. Cognitoの構成要素
ユーザープール
ユーザーの認証情報を保持し、トークンを発行する領域です。アプリケーションユーザーの管理が主目的です。
IDプール
認証済みユーザーや匿名ユーザーに対して、IAMロールを割り当ててAWSリソースへのアクセスを提供します。User Poolと連携させて使用することが一般的です。
3. 設定手順
ユーザープール作成手順(マネジメントコンソール)
- Cognitoコンソールで「ユーザープールの作成」を選択
- ユーザー名やEメールなど認証方法を設定
- パスワードポリシーとMFAオプションを指定
- 自己登録を有効にするか選択
- アプリクライアントを作成
- 確認し、作成ボタンを押下
IDプール作成手順
- 「IDプールを作成」を選択
- 「認証プロバイダー」にユーザープールを設定
- IAMロールを自動作成または既存ロールを指定
CLIでユーザープール作成
aws cognito-idp create-user-pool --pool-name MyUserPool
4. 認証フローとトークンの役割
CognitoではOAuth 2.0に基づいた以下のトークンを使用します。
トークン | 用途 |
---|---|
IDトークン | ユーザー情報(名前・Eメールなど)を格納 |
アクセストークン | APIへのアクセス制御に利用 |
リフレッシュトークン | トークン更新に使用 |
Pythonによるトークン取得例
import requests
domain = "https://myapp.auth.us-east-1.amazoncognito.com"
client_id = "xxxxxxxxx"
username = "user@example.com"
password = "mypassword"
data = {
"grant_type": "password",
"client_id": client_id,
"username": username,
"password": password
}
response = requests.post(f"{domain}/oauth2/token", data=data)
print(response.json())
5. セキュリティ対策
MFAの有効化
aws cognito-idp set-user-pool-mfa-config \
--user-pool-id us-east-1_XXXXXXX \
--mfa-configuration ON \
--sms-mfa-configuration "SmsAuthenticationMessage='Your verification code is {####}'"
カスタムオーソライザー例(Lambda)
import jwt
def lambda_handler(event, context):
token = event["authorizationToken"]
decoded = jwt.decode(token, options={"verify_signature": False})
return {
"principalId": decoded["sub"],
"policyDocument": {
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": "execute-api:Invoke",
"Resource": event["methodArn"]
}]
}
}
その他の推奨設定
- トークンの有効期限を短く設定
- 不正アクセス対策としてログイン試行回数制限を導入
- IAMポリシーの権限を最小化
6. まとめ
AWS Cognitoは、スケーラブルかつセキュアなユーザー認証機構を迅速に構築できる非常に強力なサービスです。
- ユーザープールでアプリケーションログインを実現
- IDプールとIAMを活用してAWSリソースへのアクセス制御を構成
- 多要素認証、短命トークン、オーソライザーを使った防御力の高い設計を行う
本記事を通じて、Cognitoを活用した認証基盤構築への第一歩を踏み出せるようになっていれば幸いです。