📚 図書館のたとえで超わかりやすく!
Cognito IDプール = 図書館のアクセス管理システム
図書館には「ビジター」と「会員」がいますよね?
それぞれに
違う利用カード
を渡して、
利用できるサービス
を制限します。
ビジター
:一時的な利用者カード(未認証ロール)
会員
:正式な会員カード(認証済みロール)
Cognito IDプールは、AWSリソースへのアクセスを
誰が・どのように・何にアクセスできるか
を管理する仕組みです!✨
📚 図書館の例え:
飛び込みで来たビジター。身分証明なしで入館できますが、利用できるのは 公開エリアのみ 。
🔑 できること:
- 雑誌コーナーの閲覧(限定的なデータ取得)
- パンフレットの受け取り(公開コンテンツ)
- 館内地図の閲覧(基本情報)
- 本の貸出不可(書き込み操作不可)
- 会員専用エリア立入禁止
S3の公開バケットの読み取りのみ
CloudWatchログへの書き込み不可
DynamoDBへのアクセス不可
📚 図書館の例え:
正式な会員登録を済ませた利用者。 身分証明済み なので、全サービスを利用できます!
🔑 できること:
- 本の貸出・返却(データの読み書き)
- 学習室の予約(リソース予約)
- パソコン利用(高度な機能)
- 会員専用データベース検索
- 個人のページ(マイライブラリ)
S3の特定バケットへの読み書き
DynamoDBへのCRUD操作
Lambda関数の実行
CloudWatchへのログ記録
📖 図書館での1日:ロールの切り替え
👤 佐藤さん(ビジター)
初めて図書館に来ました。
受付で「
ビジターパス
」をもらいます。
未認証ロール(制限付きアクセス)
👨💼 佐藤さん(会員登録後)
気に入ったので会員登録!
身分証明書を見せて「
会員カード
」を取得。
認証済みロール(フルアクセス)
1️⃣ 最初は全員がビジターパス(未認証ロール)
→ アプリを開いた瞬間、誰でも使える最低限の機能
2️⃣ ログインすると会員カード(認証済みロール)にアップグレード
→ Google/Facebook/メールでログイン = 身分証明
→ より多くの機能とデータにアクセス可能に!
3️⃣ ログアウトするとビジターパスに戻る
→ セキュリティのため、認証が切れると権限も制限される
🔄 ロール取得の流れ
この時点では誰だか分からない状態。Cognito IDプールに「一時的なアクセス権をください」とリクエスト。
🎫 受け取るもの:
未認証ロール + 一時的なAWSクレデンシャル
• S3の公開バケットから画像取得
• API Gatewayの公開エンドポイント呼び出し
• AppSyncの公開クエリ実行
❌ できないこと:
個人データへのアクセス、データの書き込み、プライベートリソースへのアクセス
• Cognito User Poolsでログイン
• Google/Facebook/Appleでソーシャルログイン
• SAMLフェデレーション(企業のSSO)
✅ 認証成功:
IDトークン(JWTトークン)を取得 → 「この人は本人確認済みです」という証明書
Cognito IDプールにIDトークンを提示すると、認証済みロールの一時クレデンシャルを発行。
🎉 できるようになること:
• ユーザー専用のS3フォルダへのアクセス
• DynamoDBへの個人データ読み書き
• Lambda関数の実行
• プライベートAPIへのアクセス
⏱️ クレデンシャルの有効期限: 通常15分〜1時間(自動更新)
🎯 高度な機能:ルールベースマッピング
会員にも
「一般会員」「プレミアム会員」「VIP会員」
がいるように、
認証済みユーザーでも
異なるIAMロール
を割り当てられます!
一般会員
無料プランのユーザー
権限:
• 基本機能のみ
• ストレージ5GBまで
• 広告表示あり
プレミアム会員
月額500円のユーザー
権限:
• 全機能利用可能
• ストレージ100GBまで
• 広告なし
管理者
管理者グループに所属
権限:
• 全ユーザーデータ閲覧
• システム設定変更
• レポート出力
🎨 ルールの設定例
📊 詳細比較表
| 項目 | 未認証ロール 🎫 | 認証済みロール 💳 |
|---|---|---|
| 取得タイミング | アプリ起動時(即座) | ログイン成功後 |
| 必要なもの | なし(誰でもOK) | IDトークン(認証証明) |
| 典型的な権限 | S3公開バケット読み取りのみ | 個人データの読み書き |
| アクセス範囲 | 公開リソースのみ | ユーザー専用リソース |
| セキュリティレベル | 低(最小限の権限) | 高(本人確認済み) |
| クレデンシャル有効期限 | 通常1時間 | 通常1時間(自動更新) |
| 使用例 | トップページ閲覧、公開コンテンツ | マイページ、個人データ保存 |
| カスタマイズ | 1つのロールのみ | ルールベースで複数ロール可能 |
💼 実際のユースケース
SNSアプリ
未認証:
• タイムラインの閲覧のみ
• プロフィール閲覧不可
認証済み:
• 投稿・いいね・コメント
• プロフィール編集
• S3に画像アップロード
• DynamoDBに投稿データ保存
未認証でも基本的な閲覧ができるので、ユーザー登録を促しやすい
ゲームアプリ
未認証:
• チュートリアルプレイ
• ローカル保存のみ
認証済み:
• クラウドセーブ(S3)
• ランキング参加(DynamoDB)
• アイテム購入履歴
• マルチプレイ参加
ゲストプレイから会員登録への導線がスムーズ
ECサイト
未認証:
• 商品一覧閲覧
• 検索機能利用
認証済み(一般):
• カートに追加
• 購入履歴閲覧
• レビュー投稿
認証済み(プレミアム):
• 先行販売アクセス
• 特別割引
会員ランクに応じて異なるロールを適用
社内ダッシュボード
未認証:
• 使用不可(ログイン必須)
認証済み(一般社員):
• 自部門のレポート閲覧
• 個人データの編集
認証済み(管理者):
• 全部門のデータ閲覧
• ユーザー管理
• システム設定変更
グループベースで細かい権限制御
未認証ロールは必要最小限の権限のみ。「とりあえず全部許可」は絶対NG!
2. 明確な境界線を設ける:
• 未認証:公開データの読み取りのみ
• 認証済み:個人データへのアクセス
明確に線引きすることでセキュリティが向上します。
3. S3のパスベースアクセス制御:
認証済みロールでは
s3:GetObject on arn:aws:s3:::bucket/${cognito-identity.amazonaws.com:sub}/*
のように、ユーザーIDでフォルダを分けることで個人データを保護。
4. 定期的な権限レビュー:
アプリの機能追加時には、IAMロールの権限も見直しを。不要な権限は即削除!
5. ルールベースマッピングの活用:
ユーザー属性やグループに応じて異なるロールを割り当てることで、きめ細かいアクセス制御が可能に。
6. クレデンシャルのキャッシュ:
AWS SDK(Amplify等)は自動でクレデンシャルをキャッシュして更新してくれます。開発者は認証状態の管理に集中できます!
7. エラーハンドリング:
権限不足エラー(403)が出た場合は、ユーザーにログインを促すなど、適切なUXを提供しましょう。
🎓 まとめ
📚 図書館 = Cognito IDプール
ビジターパス(未認証)と会員カード(認証済み)の
2種類の利用カードで、
誰が何にアクセスできるか
を管理!
誰でも使える
最小限の権限
公開データのみ
本人確認済み
個人データアクセス
フル機能利用可能
🎯 重要ポイント:
✅ ログイン状態に応じて
自動的にロールが切り替わる
✅ 各ロールには
IAMポリシーで細かく権限を設定
✅ ルールベースマッピングで
ユーザーごとに異なる権限
も可能
✅ セキュリティの基本は
「最小権限の原則」
Cognito IDプールを使えば、
ユーザーの認証状態に応じた柔軟なアクセス制御
が実現できます!
セキュアで使いやすいアプリを作りましょう!🎉