AWSに戻る

Amazon Cognito

Amazon Cognitoとは

Amazon Cognitoは、ウェブおよびモバイルアプリケーションのユーザー認証、認可、ユーザー管理を提供するAWSのサービスです。Cognitoを使用することで、開発者はユーザーのサインアップ、サインイン、アクセス制御を簡単に追加でき、ユーザーIDを安全に管理できます。また、ソーシャルIDプロバイダー(Facebook、Google、Appleなど)やエンタープライズIDプロバイダー(SAML、OpenID Connectなど)との統合も可能です。

Amazon Cognitoの主な特徴

Amazon Cognitoのコンポーネント

Amazon Cognitoは、主に以下の2つのコンポーネントで構成されています:

ユーザープール

ユーザープールは、ウェブおよびモバイルアプリケーションのユーザーディレクトリです。ユーザープールを使用することで、ユーザーはユーザー名とパスワード、またはソーシャルIDプロバイダーを通じてアプリケーションにサインインできます。ユーザープールは、ユーザー登録、サインイン、アカウント回復、ユーザープロファイル管理などの機能を提供します。

ユーザープールの主な機能

IDプール

IDプール(フェデレーテッドアイデンティティ)は、ユーザーに一時的なAWS認証情報を提供し、AWSリソースへのアクセスを許可します。IDプールを使用することで、ユーザーはCognitoユーザープール、ソーシャルIDプロバイダー、またはカスタム認証プロセスを通じて認証し、AWSサービス(S3、DynamoDB、API Gatewayなど)に直接アクセスできます。

IDプールの主な機能

Amazon Cognitoの認証フロー

Amazon Cognitoは、以下のような認証フローをサポートしています:

ユーザープールの認証フロー

  1. ユーザー登録: ユーザーがアプリケーションに登録し、確認コードを受け取ります。
  2. 確認: ユーザーが確認コードを入力して、アカウントを確認します。
  3. サインイン: ユーザーが認証情報(ユーザー名/パスワード、ソーシャルIDなど)を使用してサインインします。
  4. トークン発行: 認証に成功すると、Cognitoはトークン(ID、アクセス、更新トークン)を発行します。
  5. トークン検証: アプリケーションはトークンを検証し、ユーザーにアクセスを許可します。
  6. トークン更新: アクセストークンの有効期限が切れると、更新トークンを使用して新しいトークンを取得します。

ユーザープールの認証フロー図

ユーザー                  アプリケーション                 Cognito
   |                           |                           |
   |--- 登録情報 ------------->|                           |
   |                           |--- ユーザー登録 --------->|
   |                           |                           |--- 確認コード送信 ---
   |<-- 確認コード要求 ---------|<-- 登録成功 -------------|
   |                           |                           |
   |--- 確認コード入力 -------->|                           |
   |                           |--- アカウント確認 -------->|
   |                           |<-- 確認成功 -------------|
   |<-- 確認完了 --------------|                           |
   |                           |                           |
   |--- サインイン情報 -------->|                           |
   |                           |--- 認証リクエスト -------->|
   |                           |<-- トークン発行 ----------|
   |<-- サインイン成功 ---------|                           |
   |                           |                           |
        

IDプールの認証フロー

  1. ユーザー認証: ユーザーがCognitoユーザープールまたは外部IDプロバイダーで認証します。
  2. トークン取得: 認証に成功すると、IDプロバイダーからトークンを取得します。
  3. トークン交換: アプリケーションはトークンをCognito IDプールに送信し、AWS認証情報と交換します。
  4. AWS認証情報の使用: アプリケーションは一時的なAWS認証情報を使用して、AWSリソースにアクセスします。

IDプールの認証フロー図

ユーザー                  アプリケーション                 Cognito                    AWS サービス
   |                           |                           |                           |
   |--- サインイン情報 -------->|                           |                           |
   |                           |--- 認証リクエスト -------->|                           |
   |                           |<-- IDトークン発行 ---------|                           |
   |<-- サインイン成功 ---------|                           |                           |
   |                           |                           |                           |
   |--- リソースアクセス要求 --->|                           |                           |
   |                           |--- IDトークン交換 -------->|                           |
   |                           |<-- AWS認証情報 ------------|                           |
   |                           |                           |                           |
   |                           |--- AWS認証情報でアクセス ----------------------->|
   |                           |<-- リソースレスポンス ---------------------------|
   |<-- リソースレスポンス ------|                           |                           |
        

Amazon Cognitoの使用方法

Amazon Cognitoは、AWS Management Console、AWS CLI、SDKs、またはAPIを使用して利用できます。

ユーザープールの作成と設定

AWS CLIを使用したユーザープールの作成

aws cognito-idp create-user-pool \
    --pool-name MyUserPool \
    --policies '{"PasswordPolicy":{"MinimumLength":8,"RequireUppercase":true,"RequireLowercase":true,"RequireNumbers":true,"RequireSymbols":true}}' \
    --auto-verified-attributes email \
    --schema '[{"Name":"email","Required":true},{"Name":"name","Required":true}]' \
    --mfa-configuration OFF

AWS CLIを使用したユーザープールクライアントの作成

aws cognito-idp create-user-pool-client \
    --user-pool-id us-west-2_abcdefghi \
    --client-name MyAppClient \
    --no-generate-secret \
    --explicit-auth-flows ALLOW_USER_PASSWORD_AUTH ALLOW_REFRESH_TOKEN_AUTH \
    --supported-identity-providers COGNITO \
    --callback-urls '["https://example.com/callback"]' \
    --logout-urls '["https://example.com/logout"]' \
    --allowed-o-auth-flows code implicit \
    --allowed-o-auth-scopes openid email profile \
    --allowed-o-auth-flows-user-pool-client

IDプールの作成と設定

AWS CLIを使用したIDプールの作成

aws cognito-identity create-identity-pool \
    --identity-pool-name MyIdentityPool \
    --allow-unauthenticated-identities \
    --cognito-identity-providers ProviderName=cognito-idp.us-west-2.amazonaws.com/us-west-2_abcdefghi,ClientId=1example23456789,ServerSideTokenCheck=false

AWS CLIを使用したIDプールのロール設定

aws cognito-identity set-identity-pool-roles \
    --identity-pool-id us-west-2:12345678-1234-1234-1234-123456789012 \
    --roles authenticated=arn:aws:iam::123456789012:role/Cognito_MyIdentityPoolAuth_Role,unauthenticated=arn:aws:iam::123456789012:role/Cognito_MyIdentityPoolUnauth_Role

ユーザー管理

AWS CLIを使用したユーザーの作成

aws cognito-idp admin-create-user \
    --user-pool-id us-west-2_abcdefghi \
    --username johndoe \
    --user-attributes Name=email,Value=johndoe@example.com Name=name,Value="John Doe" \
    --message-action SUPPRESS

AWS CLIを使用したユーザーの確認

aws cognito-idp admin-confirm-sign-up \
    --user-pool-id us-west-2_abcdefghi \
    --username johndoe

AWS CLIを使用したユーザーの一覧表示

aws cognito-idp list-users \
    --user-pool-id us-west-2_abcdefghi

認証と認可

AWS CLIを使用したユーザーの認証

aws cognito-idp admin-initiate-auth \
    --user-pool-id us-west-2_abcdefghi \
    --client-id 1example23456789 \
    --auth-flow ADMIN_USER_PASSWORD_AUTH \
    --auth-parameters USERNAME=johndoe,PASSWORD=P@ssw0rd

AWS CLIを使用したトークンの更新

aws cognito-idp admin-initiate-auth \
    --user-pool-id us-west-2_abcdefghi \
    --client-id 1example23456789 \
    --auth-flow REFRESH_TOKEN_AUTH \
    --auth-parameters REFRESH_TOKEN=your-refresh-token

AWS Amplifyを使用したCognitoの統合

Amplify CLIを使用した認証の追加

amplify add auth

? Do you want to use the default authentication and security configuration? 
  Default configuration
? How do you want users to be able to sign in? 
  Username
? Do you want to configure advanced settings? 
  No, I am done.

React アプリケーションでの Amplify Auth の使用

import { Amplify, Auth } from 'aws-amplify';
import awsconfig from './aws-exports';

Amplify.configure(awsconfig);

// サインアップ
async function signUp() {
  try {
    const { user } = await Auth.signUp({
      username: 'johndoe',
      password: 'P@ssw0rd',
      attributes: {
        email: 'johndoe@example.com',
        name: 'John Doe'
      }
    });
    console.log('サインアップ成功:', user);
  } catch (error) {
    console.log('サインアップエラー:', error);
  }
}

// 確認
async function confirmSignUp() {
  try {
    await Auth.confirmSignUp('johndoe', '123456');
    console.log('確認成功');
  } catch (error) {
    console.log('確認エラー:', error);
  }
}

// サインイン
async function signIn() {
  try {
    const user = await Auth.signIn('johndoe', 'P@ssw0rd');
    console.log('サインイン成功:', user);
  } catch (error) {
    console.log('サインインエラー:', error);
  }
}

// 現在のユーザーの取得
async function getCurrentUser() {
  try {
    const user = await Auth.currentAuthenticatedUser();
    console.log('現在のユーザー:', user);
  } catch (error) {
    console.log('ユーザー取得エラー:', error);
  }
}

// サインアウト
async function signOut() {
  try {
    await Auth.signOut();
    console.log('サインアウト成功');
  } catch (error) {
    console.log('サインアウトエラー:', error);
  }
}

Amazon Cognitoのセキュリティ

Amazon Cognitoは、アプリケーションのユーザー認証と認可を安全に管理するための多くのセキュリティ機能を提供しています:

多要素認証(MFA)

Cognitoは、SMS、TOTPベースのアプリケーション(Google Authenticator、Microsoft Authenticatorなど)を使用した多要素認証をサポートしています。MFAを有効にすると、ユーザーはサインイン時にパスワードに加えて2つ目の認証要素を提供する必要があります。

AWS CLIを使用したMFAの有効化

aws cognito-idp set-user-pool-mfa-config \
    --user-pool-id us-west-2_abcdefghi \
    --software-token-mfa-configuration Enabled=true \
    --mfa-configuration ON

適応型認証

適応型認証は、リスクベースの認証メカニズムで、ユーザーのサインインパターン、デバイス、場所などの要素に基づいて追加の認証チャレンジを要求します。これにより、不審なサインイン試行を検出し、アカウントの乗っ取りを防止できます。

AWS CLIを使用した適応型認証の有効化

aws cognito-idp update-user-pool-client \
    --user-pool-id us-west-2_abcdefghi \
    --client-id 1example23456789 \
    --prevent-user-existence-errors ENABLED \
    --enable-token-revocation \
    --auth-session-validity 3 \
    --user-pool-add-ons AdvancedSecurityMode=ENFORCED

コンプロマイズされた認証情報の検出

Cognitoは、データ侵害で漏洩した認証情報のデータベースと照合して、ユーザーのパスワードをチェックできます。コンプロマイズされた認証情報が検出された場合、ユーザーにパスワードの変更を要求できます。

セキュアなパスワードポリシー

Cognitoでは、パスワードの最小長、大文字・小文字・数字・特殊文字の要件、パスワードの有効期限などのパスワードポリシーを設定できます。

AWS CLIを使用したパスワードポリシーの設定

aws cognito-idp update-user-pool \
    --user-pool-id us-west-2_abcdefghi \
    --policies '{"PasswordPolicy":{"MinimumLength":12,"RequireUppercase":true,"RequireLowercase":true,"RequireNumbers":true,"RequireSymbols":true,"TemporaryPasswordValidityDays":7}}'

アカウントロックアウト

Cognitoは、連続した認証失敗に対してアカウントロックアウトポリシーを設定できます。これにより、ブルートフォース攻撃からアカウントを保護できます。

セキュアなトークン管理

Cognitoは、JWT(JSON Web Token)を使用してユーザーの認証と認可を管理します。トークンは署名され、有効期限が設定されており、改ざんを検出できます。

Amazon Cognitoのユースケース

Amazon Cognitoは以下のようなユースケースに適しています:

具体的なユースケース例

モバイルアプリケーション

モバイルアプリケーションでは、Cognitoを使用してユーザーのサインアップ、サインイン、ソーシャルIDプロバイダーとの統合を実装できます。また、IDプールを使用して、認証されたユーザーにAWSリソース(S3バケット、DynamoDBテーブルなど)への直接アクセスを許可できます。

シングルページアプリケーション

SPAでは、Cognitoを使用してユーザー認証を実装し、JWTを使用してAPIへのアクセスを制御できます。Cognitoのホスト型UIを使用して、カスタマイズ可能なサインインおよびサインアップページを提供することもできます。

マイクロサービスアーキテクチャ

マイクロサービスアーキテクチャでは、Cognitoを使用して一元的なユーザー認証を提供し、JWTを使用してサービス間の認証と認可を実装できます。これにより、各マイクロサービスが独自の認証メカニズムを実装する必要がなくなります。

Amazon Cognitoとの統合サービス

Amazon Cognitoは他のAWSサービスと統合して、より強力な認証と認可のソリューションを構築できます:

サービス 統合の利点
Amazon API Gateway Cognitoユーザープールを使用してAPIへのアクセスを制御
AWS AppSync GraphQL APIへのアクセスをCognitoで認証
AWS Lambda 認証フローのカスタマイズ、ユーザー管理の自動化
Amazon S3 IDプールを使用してS3バケットへの直接アクセスを許可
Amazon DynamoDB IDプールを使用してDynamoDBテーブルへの直接アクセスを許可
AWS Amplify フロントエンドアプリケーションとの簡単な統合
Amazon Pinpoint ユーザーエンゲージメントとアナリティクス
AWS WAF ウェブアプリケーションファイアウォールによる保護
Amazon CloudWatch 認証イベントのモニタリングとアラート

Amazon Cognitoのベストプラクティス

まとめ

Amazon Cognitoは、ウェブおよびモバイルアプリケーションのユーザー認証、認可、ユーザー管理を提供するAWSのサービスです。ユーザープールとIDプールの2つの主要なコンポーネントを通じて、安全で拡張性の高いユーザー認証と認可のソリューションを構築できます。

Amazon Cognitoの主な利点は以下の通りです:

Amazon Cognitoを効果的に活用するには、多要素認証の有効化、適応型認証の使用、強力なパスワードポリシーの設定、最小権限の原則の適用などのベストプラクティスを実践することが重要です。また、AWS Amplify、API Gateway、AppSyncなどの他のAWSサービスと統合することで、より強力な認証と認可のソリューションを構築できます。