Amazon Cognitoは、AWSが提供するフルマネージドのユーザー認証、認可、アカウント管理サービスで、OAuth 2.0を利用した認証連携やMFAもサポートしています。
https://aws.amazon.com/jp/cognito
Amazon Cognitoの主な機能
ユーザープール: ユーザーのサインアップ、サインイン、アカウント管理を行うディレクトリです。ローカルユーザーや外部IDプロバイダー(Google、Facebook、Amazonなど)との連携が可能です。
アイデンティティプール: 認証されたユーザーに対して、AWSのサービス(S3、DynamoDBなど)へのアクセス権を付与するための一時的な認証情報を提供します。
多要素認証(MFA): SMSメッセージやTOTP(Time-based One-Time Password)を使用した多要素認証をサポートし、セキュリティを強化します。
カスタム認証フロー: AWS Lambdaトリガーを使用して、独自の認証フローを構築できます。
コンプライアンス: SOC 1~3、ISO 27001、HIPAA-BAAなど、複数のセキュリティおよびコンプライアンス要件に適合しています。
費用
月間アクティブユーザー (MAU) は、最大 10,000 人まで無料で利用できます。
Amazon Cognito では、ユーザープールを設定する際に選択できる 3 つの料金帯があり、それぞれの使用状況に応じて料金が決まります。
超過分はプランにより異なりますので、詳細は公式ドキュメントをご参照ください。
https://aws.amazon.com/jp/cognito/pricing
実際に利用してみましょう
Cognitoのメニューはシンプルで、ユーザープールとIDプールから構成されています。

1.ユーザープールの作成
まず、AWSマネジメントコンソールにログインし、Cognitoサービスを選択します。「ユーザープール」をクリックし、「プールの作成」を選択します。プール名を設定し、アプリケーションタイプを選択、その他、必要な属性を設定してユーザープールを作成します。
2.アプリクライアントの設定
ユーザープールを作成したら、アプリケーションクライアントを設定します。
アプリケーションタイプを「従来のウェブアプリケーション」「SPA」「モバイルアプリ」「Machine to Machineアプリケーション」から選択肢、名前を設定して完了です。
任意でアプリケーションごとに認証後にリターンするURLも設定できます。
※Cognitoが用意するログインページを利用する場合に使用。

認証ユーザーの属性情報もアプリケーションクライアント単位で設定します。
3.外部IDプロバイダーの設定
Cognitoは、GoogleやFacebookなどの外部IDプロバイダーと連携できます。「ソーシャルプロバイダーと外部プロバイダー」を選択し、連携したいプロバイダーを選択します。例えば、Googleを選択した場合、GoogleのクライアントIDとクライアントシークレットを入力します。設定が完了したら、「保存」をクリックします。

4.MFAの利用
CognitoではMFAの利用も可能です。


RailsのDeviseとの比較
Amazon CognitoとRailsのDeviseは、どちらもユーザー認証とアカウント管理を提供するソリューションですが、アーキテクチャ、スケーラビリティ、外部IDプロバイダーとの連携、多要素認証(MFA)のサポート、コンプライアンス要件、コスト構造など、いくつかの重要な点で異なります。以下に、これらの違いを詳細に比較します。
1.アーキテクチャとホスティング
Amazon Cognito: フルマネージドサービスとして提供され、AWSがインフラの管理、スケーリング、パッチ適用などを担当します。これにより、開発者はインフラ管理の負担から解放され、アプリケーションの開発に集中できます。
Devise: Ruby on Railsアプリケーション向けの認証ソリューションで、自己ホスティングが必要です。アプリケーション内で認証機能を管理・実装するため、インフラの管理やスケーリングは開発者の責任となります。
2.スケーラビリティ
Amazon Cognito: 高いスケーラビリティを持ち、数百万のユーザーに対応可能です。AWSのインフラ上で自動的にスケールし、トラフィックの増加にも柔軟に対応します。
Devise: スケーラビリティはアプリケーションのインフラに依存します。大規模なユーザー基盤を持つ場合、スケーリングの計画と実装は開発者の責任となります。
3.外部IDプロバイダーとの連携
Amazon Cognito: Google、Facebook、Amazonなど、多数の外部IDプロバイダーとの連携が容易に設定できます。これにより、ユーザーは既存のアカウントを使用してアプリケーションにサインインできます。
Devise: OmniAuthを使用して外部IDプロバイダーと連携可能ですが、設定がやや複雑になることがあります。
4.多要素認証(MFA)のサポート
Amazon Cognito: SMSメッセージやTOTP(Time-based One-Time Password)を使用した多要素認証を標準でサポートし、セキュリティを強化します。
Devise: MFAを実装するには、追加のGem(例:devise-two-factor-authenticatable)を導入する必要があります。
5.コンプライアンス要件
Amazon Cognito: SOC 1~3、ISO 27001、HIPAA-BAAなど、複数のセキュリティおよびコンプライアンス要件に適合しています。
Devise: コンプライアンス要件はアプリケーションの実装に依存します。
6.コスト構造
Amazon Cognito: 使用量に応じた従量課金制で、ユーザー数やリクエスト数に基づいて料金が発生します。
Devise: 自己ホスティングのため、サーバーやメンテナンスのコストが発生します。
7.柔軟性とカスタマイズ
Amazon Cognito: 多くの機能が標準で提供されていますが、特定の要件に対してはカスタマイズが制限される場合があります。
Devise: 高度なカスタマイズが可能で、アプリケーションの特定のニーズに合わせて認証フローを調整できます。
8.開発者の負担とメンテナンス
Amazon Cognito: フルマネージドサービスであるため、インフラの管理やメンテナンスの負担が軽減されます。
Devise: 自己ホスティングのため、インフラの管理やメンテナンスは開発者の責任となります。
9.まとめ
Amazon CognitoとDeviseは、それぞれ異なる特徴と利点を持つ認証ソリューションです。
大規模なユーザー基盤を持ち、外部IDプロバイダーとの連携や多要素認証、コンプライアンス要件が重要な場合は、Amazon Cognitoが適しています。一方で、自己ホスティングを希望し、高度なカスタマイズや柔軟性を求める場合は、Deviseが適していると言えます。
選択の際は、アプリケーションの規模、セキュリティ要件、コンプライアンス要件、開発リソースなどを総合的に考慮し、最適なソリューションを選択することが重要です。