AWSユーザ認証の方法
概要
まず、Webアプリを作成する方法として、大きくは下記2種類ありますが、今回はS3にホスティングする方法でのユーザ認証の方法について、まとめます。
- EC2を使用する方法
- S3にホスティングする方法
S3にWebアプリをホスティングし、AWSに対してリクエストする構成としては、下図の通り。
ユーザ認証の方法
下記の3種類があるが、Cognitoを使用した認証が一般的に思う。
下記個別のメリット・デメリット
1. AWS Cognitoを使用する方法
AWSのサービスでユーザ名、パスワードを用いたユーザ管理をすることができる。
Googleアカウント、Facebookアカウントなどでの認証もできる。
[メリット]
- 独自のユーザ認証の仕組みを作成する必要がない。
- ユーザ名、メールアドレスなどで認証する仕組みを作れる
- 一時的なセキュリティ情報として認証できる(有効期限を設けることができる)ため、安全
[デメリット]
-
有料
→ただし、50,000ユーザ(月間アクティブユーザ)まで無料
2. AWS IAMを使用する方法
IAMと対応するアクセスキーとシークレットキーを発行してアクセスする方法。
[メリット]
- 独自のユーザ認証の仕組みを作成する必要がない。
[デメリット]
-
AWSがランダムで発行するアクセスキーとシークレットキーを使用する必要がある。
-
基本的に一般ユーザに配布して使用するものではなく、サーバサイドでの制御に使用するもの。
-
一時的なセキュリティ情報とならないため、危険。
3. Lambdaを使用する方法
独自のユーザ管理、認証の方法を構築する必要がある。
[メリット]
- 自由に作ることができる。
[デメリット]
- 認証の仕組みをすべて作成する必要がある。
Amazon Cognitoについて
概要
Amazon Cognito は、ウェブアプリケーションやモバイルアプリケーションの認証、許可、ユーザー管理をサポートするサービス。
Amazon Cognito の主な 2 つのコンポーネントは、ユーザープールと ID プールです。
1. ユーザプール
ログインを提供する機能。
- ユーザパスワード、メールアドレス、電話番号、カスタム属性などを格納可能 ユーザにまつわるデータベースのようなもの。
- 上記を利用して認証し、API Gatewayにアクセス可能なトークンを取得することができる。
2. IDプール
ユーザープールからユーザ認証成功時に発行されるトークンを使って、AWSのサービスに対するアクセス権を得ることができる機能のこと。
AWSのS3やDynamoDBなどのサービスに直接アクセスするときに使用する機能。
今のところ私の用途ではAPI Gateway経由でのアクセスを想定しており、今回は説明しない。
3. アクセスの流れ
- S3からWebページを取得する。
- Cognitoを使用してユーザ認証を行う。
- 認証成功時に取得したトークンを使用してAPI GatewayへRequestし、情報を取得する。
4. 認証したユーザをAWS内で特定する方法について
Cognitoで認証時に取得できるトークンをBase64でデコードすると、ユーザ名などの情報を取得する事ができる。
API GatewayのREST APIコール時、上記トークンを使用するため、Lambdaでユーザ名を取得することができ、ユーザ名などのユーザ管理情報をDBなどに保持しておけば、ユーザ情報を特定することができると考える。
[参考URL]
・Cognitoについての概要
https://qiita.com/fjisdahgaiuerua/items/d420a2137e8d67e0a190
・CognitoとIAMでの認証の違い
https://qiita.com/katekichi/items/dbf279077db6a7b597fc
https://www.skyarch.net/blog/?p=16856
https://dev.classmethod.jp/articles/lex_access_by_unauth_user_using_cognito/
・Cognito QA
https://aws.amazon.com/jp/cognito/faqs/