Cognito 学んだことメモリアル📝

## はじめに

ウェブやモバイルアプリケーションに認証、認可、ユーザー管理の機能を追加できるAWSサービスであるCognito！

スケーラブルで安全なユーザーディレクトリを提供し、開発者は認証機能を自前で実装する手間を省くことができる。


## 目次

1. [AWS Cognitoの概要](#-aws-cognitoの概要)
2. [ユーザープール (User Pools) の詳細](#-ユーザープール-user-pools-の詳細)
3. [IDプール (Identity Pools) の詳細](#-idプール-identity-pools-の詳細)
4. [Cognitoの具体的な利用シーン](#-cognitoの具体的な利用シーン)
5. [Cognitoのセキュリティ](#-cognitoのセキュリティ)
6. [Cognitoの料金](#-cognitoの料金)
7. [まとめ](#-まとめ)
8. [参考文献](#-参考文献)

## 🧷 AWS Cognitoの概要
### Cognitoがどのようなサービスで、何ができるのか...
* フルマネージド
CognitoはAWSによって完全に管理されているため、サーバーの構築やメンテナンスは不要
* スケーラブル
数百万のユーザーにも対応できる高いスケーラビリティを持つ
* セキュア
最新のセキュリティ標準に準拠しており、安全な認証・認可機能を提供
* 柔軟性
さまざまな認証方法やユーザー管理の要件に対応できる柔軟性がある

### Cognitoの主な機能
Cognitoは主に以下の2つの機能を提供します。
* ユーザープール (User Pools)
ユーザーの登録、サインイン、パスワードリセットなどの認証機能を提供します。
独自のユーザーディレクトリを作成・管理したり、SAMLやOAuth 2.0などの外部IDプロバイダーと連携したりできます。
* IDプール (Identity Pools)
AWSリソースへのアクセス許可（認可）を管理します。
ユーザープールで認証されたユーザーや、Facebook、Google、AmazonなどのソーシャルIDプロバイダーで認証されたユーザーに対して、AWSのサービス（S3、DynamoDBなど）へのアクセス権限を付与できます。

## 🧷 ユーザープール (User Pools) の詳細
ユーザープールは、アプリケーションのユーザーディレクトリとして機能します。

### ユーザープールの機能
#### ユーザー登録とサインイン
メールアドレスや電話番号、ユーザー名などを利用した登録・サインイン機能を提供
#### パスワード管理
強力なパスワードポリシーの設定や、パスワードリセット機能などを提供
#### 多要素認証 (MFA)
ワンタイムパスワード (TOTP) やSMSによる多要素認証を設定することで、セキュリティを向上させることができる。
#### カスタム認証
独自の認証フローを実装することも可能
#### 属性
ユーザー名、メールアドレス、電話番号などの標準属性に加えて、カスタム属性を定義してユーザー情報を管理可能
#### グループ
ユーザーをグループに分けて管理し、グループごとに異なる権限を付与できる。
#### トリガー
ユーザープールのライフサイクルにおける特定のイベント（ユーザー登録時、サインイン時など）にカスタムコード（AWS Lambda関数）を実行できます。
これにより、ユーザーの検証、ウェルカムメールの送信、カスタム属性の更新など、さまざまな処理を自動化できます。
#### 外部IDプロバイダー連携
* ソーシャルIDプロバイダー
Facebook、Google、Amazon、Appleなどのソーシャルアカウントでのサインインを可能にする。
* SAMLプロバイダー
既存のSAMLベースのIDプロバイダー（Active Directory Federation Services (AD FS) など）との連携が可能
* OIDCプロバイダー
OpenID Connect (OIDC) に準拠したIDプロバイダーとの連携が可能

### ユーザープールの認証フローの例
1. ユーザーがアプリケーションでサインイン
2. アプリケーションはユーザーの認証情報をユーザープールに送信
3. ユーザープールは認証情報を検証
認証に成功した場合、ユーザープールはアプリケーションにJSON Web Token (JWT) を返します。
4. アプリケーションはこのJWTを使用して、ユーザーを認証済みとして扱う。

## 🧷 IDプール (Identity Pools) の詳細
IDプールは、AWSリソースへのアクセス許可を管理するための仕組みです。

### IDプールの機能
#### 認証プロバイダー
ユーザープール、ソーシャルIDプロバイダー (Facebook, Google, Amazon)、匿名ユーザーなど、さまざまな認証プロバイダーからの認証情報をサポート
#### IAMロール
IDプールは、認証されたユーザーに一時的なAWS認証情報を提供するために、AWS Identity and Access Management (IAM) ロールを利用
#### アクセスコントロール
IAMロールに付与されたポリシーに基づいて、ユーザーがアクセスできるAWSリソースと実行できるアクションを制御

### IDプールの認証フローの例 (ユーザープール連携時)
1. ユーザーがユーザープールで正常に認証されると、JWTを取得
2. アプリケーションはこのJWTをIDプールに送信
3. IDプールはJWTを検証し、認証されたユーザーに対応するIAMロールを選択
4. IDプールは、そのIAMロールの一時的なAWS認証情報をアプリケーションに返す。
アプリケーションはこの一時的な認証情報を使用して、許可されたAWSリソースへアクセス

## 🧷 Cognitoの具体的な利用シーン
Cognitoは、以下のようなさまざまなシナリオで活用できます。

#### ウェブアプリケーションの認証
ユーザー登録、ログイン、パスワードリセットなどの基本的な認証機能を実装可能
#### モバイルアプリケーションの認証
スマートフォンアプリのユーザー認証を簡単に追加可能
#### シングルサインオン (SSO)
複数のアプリケーション間で一度のログインでアクセス可能
#### APIの保護
認証されたユーザーのみがAPIにアクセスできるように制御可能
#### IoTデバイスの認証
IoTデバイスからのセキュアな接続とデータアクセスを実現可能
#### B2Cアプリケーション
大規模なコンシューマー向けアプリケーションのユーザー管理に適している。
#### B2Bアプリケーション
企業間の連携におけるユーザー認証・認可を安全に行える。

## 🧷 Cognitoのセキュリティ
Cognitoは、アプリケーションとユーザーのセキュリティを確保するための多くの機能を提供しています。

#### 暗号化
保存時および転送中のユーザーデータを暗号化します。
#### 多要素認証 (MFA)
不正アクセスを防ぐための強力なセキュリティ対策
#### パスワードポリシー
強力なパスワード要件を強制可能
#### アカウント乗っ取り対策
ブルートフォース攻撃などのアカウント乗っ取りを検知し、緩和する機能
#### 監査ログ
ユーザーアクティビティや管理操作のログを記録し、セキュリティ監査に役立てることができる。
#### GDPRおよびその他のプライバシー規制への準拠
ユーザーデータの取り扱いにおいて、さまざまなプライバシー規制に対応するための機能を提供

## 🧷 Cognitoの料金
Cognitoの料金は、主に以下の要素に基づいて課金されます。

#### ユーザープールの月間アクティブユーザー (MAU)
ユーザープールで月に一度以上サインインしたユーザー数に基づいて課金されます。無料枠も用意されています。
#### IDプールの認証
IDプールを使用してAWS認証情報を取得した回数に基づいて課金されます。こちらも無料枠があります。
#### 高度なセキュリティ機能
リスクベースの適応型認証などの高度なセキュリティ機能を利用する場合は、追加料金が発生する場合があります。

:::note warn
詳細な料金体系については、[AWSの公式ドキュメント](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/what-is-amazon-cognito.html)をご確認ください。
:::

## 🎉 まとめ
AWS Cognitoは、アプリケーションの認証、認可、ユーザー管理を効率的かつ安全に行うための強力なサービスです。ユーザープールとIDプールという2つの主要な機能を理解することで、さまざまな認証・認可の要件に対応できます。



## 💫 参考文献
* [Amazon Cognito とは](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/what-is-amazon-cognito.html)
* [Amazon Cognito のドキュメント](https://docs.aws.amazon.com/ja_jp/cognito/?icmpid=docs_homepage_security)
* [Amazon Cognito user pools](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-pools.html)
* [AWS ハンズオン資料](https://aws.amazon.com/jp/events/aws-event-resource/hands-on/)
* [Amazon Cognito を使用する](https://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/modernization-net-applications-security/cognito.html)