はじめに
概要
AWSのassociate資格であるDVAを勉強する際に、ふんわり分った気になっていたCognitoについておさらいしてみました
この記事で得られること
- Cognitoの概要
- Cognitoの主な機能
- ユーザープール
- IDプール
- Cognito Sync
どんなサービス?
AWSの認証/認可のサービスの一つ。
AWSの認証/認可サービスというと、IAMやSSOなどがあります。
IAMやSSOはチーム内や社内など、組織内での認証を行うサービスです。
では、組織外のユーザーの認証を行うには?
それを実装するのがCognitoです!
組織外のユーザーの認証を行う場合って?
簡単な例でいうと、Qiitaにログインする際、私たちはQiitaという組織の外の人ですよね?
普段わたしたちが使用しているアプリケーションはほとんど組織外からのアクセスだと言えます。
そんな組織外の私たちを認証して認可を与える仕組みがCognitoです。
認証と認可
簡単に認証と認可の違いについてみてみましょう。
認証:その人が、その人であることを確認すること
認可:その人ができることを確認すること
ここでは認証と認可の違いについては深くは言及しませんが、なんとなくこんな感じです。
Cognitoの主な機能
Cognitoの主要な機能に
- ユーザープール(認証)
- IDプール(認可)
- Sync(同期)
という機能があります。
ユーザープール
プールとは小学校に必ずあるプールが最初に思いつくかもしれませんが、英語でpoolは「たまり場所」などと訳されます。
なので、ユーザープールとはユーザーの情報をためておく(一元管理する)場所ということになります。
ユーザープールはCognitoで最も使用されるユーザーの認証機能を提供しています。
下に認証の流れを図にしました。
JWTが使われているのは、複数のアプリケーションで認証情報を共有する必要があるからだと思います。
ユーザープールの認証方法
ユーザープールには2つの認証方法があります。
- Cognitoで管理するスタンドアロンのユーザーディレクトリを使った認証
- 外部サービスを使った認証
ユーザーディレクトリを使った認証
ユーザーが初回アクセス時に登録した情報を使って認証を行います。
これは一般的なアプリケーションでよくある構成なのでわかりやすいと思います。
Cognitoの設定では、認証にEmail,ユーザー名,SMSの他にMFA(2要素認証)を使った認証もサポートしています。
外部サービスを使った認証
こちらも最近では当たり前になった、google,Facebookなどの外部サービスの認証情報を使って認証を行う機能です。
そのほかに、ユーザープールの提供している機能として
サインイン、サインアウト、パスワード忘れ、パスワード変更など、ユーザー情報に関する操作もサポートしています。
IDプール
IDプールは上記のユーザープールで認証をされた後、受け取ったトークンを元にユーザーにクレデンシャルを渡す機能です。
横文字が多くてわかりづらいですね。
トークンは認証後にCognitoから発行されるアクセス許可証です。
クレデンシャルはユーザーの身元を確認するための情報です。
ややこしい...
流れとしては、
- ユーザープールから得たトークンを使ってIDプールへ問い合わせ
- IDプールの機能でクレデンシャルを発行
- クレデンシャルを元に、アシュームロールを使ってAWSリソースを操作
という流れでAWSのリソースを操作できます。
これはユーザーにAWSリソースを操作する一時的な権限(IAMロール)を与える機能なので、アプリケーションがEC2上で動作しているだけであれば必ずしもIDプールを使う必要はありません。
Cognito Sync
これは今までのユーザープール、IDプールとは少し毛色が違います。
Cognito Syncはデバイス間でユーザーデータを同期するための機能です。
例えば、PCとスマホに対応したゲームで、ユーザー情報を同期することでPCでもスマホでも同じユーザーで遊べるといった具合です。
ただし、現在はAppSyncというCognito Syncの機能を含んだサービスがあり、そちらの使用が推奨されているようです。
便利なユースケース
API GatewayやAppSyncの背後にLambdaやDynamoDBを使ったサーバレスアプリケーションでは、API Gateway,AppSyncにcognitoで発行されたトークンを検証する機能があります。
そのため、バックエンド側でトークンを検証するという開発の手間が削減できます。
まとめ
ユーザープールとIDプールはそれぞれ独立した機能ではなく、ユーザープールがあってのIDプールということです。
所感
勉強前はCognitoはユーザーの認証をマネージドで行ってくれる便利なやつくらいに思っていましたが、クレデンシャルを発行する認可機能もあるということを知りました。
AWSのBlack Beltではユーザープールの内部的な処理の解説もしてくれていたので、また勉強してまとめてみようと思います。
参照: https://pages.awscloud.com/rs/112-TZM-766/images/20200630_AWS_BlackBelt_Amazon_Cognito_ver2.pdf