🐕

[AWS]Cognitoの概念を整理

2021/02/24に公開
  • CognitoはAWSが提供する、認証・認可の仕組みだよ
  • 認証は、その人が誰なのか、を確認するよ
  • 認可は、その人が権限を持っているか、を確認するよ
  • Cognitoを使うとこの認証・認可を簡単に導入することができるよ
  • Cognitoには2つの概念があるよ
  1. ユーザープール
  2. IDプール

ユーザープール

  • ユーザープールは認証を管理する仕組みだよ
  • ユーザープールは、Cognitoで認証した(SignUpした)ユーザーが溜まっていく場所だよ
  • ユーザープールには、認証の方法がたくさん用意されているよ
    • Username/Passwordによる認証
    • GoogleやTwitterなどのOIDC認証
    • SAML認証
    • etc.
  • Client側はユーザープールに対して、ユーザー登録APIを叩くよ
  • ユーザープールにユーザーが作成されると、Cognitoが一意のIDを割り振るよ
  • Cognitoからは、sub値にユーザーIDがセットされたIDトークンが返ってくるよ
  • そのJWTを取り回すことで、認証の仕組みを自前でつくることなく、自分のアプリに組み込むことができるよ

IDプール

  • IDプールは認可を管理する仕組みだよ
  • IDプールは、その名の通りIDを発行して、他のAWSへのサービスへのアクセスを許可できるようにするよ
  • IDプールで発行されるIDは、IAMのロールが紐付いているよ
  • IAMのロールが紐付いているので、そのロールで許可されている操作は、そのIDを使用することでできるようになるよ
  • 例えば、S3のオブジェクトへの読み込み権限がついていれば、IDプールのIDでアクセスが可能になるよ
// 例) IDプールのIDをAWS SDKの認証情報に設定する
var creds = new AWS.CognitoIdentityCredentials({
 IdentityPoolId: 'us-east-1:xxx'
});
AWS.config.credentials = creds;
  • IDプールに紐づくロールは、2種類作ることができるよ
  1. 未認証ユーザーのロール
  2. 認証済みユーザーのロール
  • そのユーザーがまだなんの認証もしていない時点(そのユーザーが誰なのかわからない状態)でも、IDプールにIDを発行することができるよ
  • 認証をしていないユーザーの場合は、未認証ユーザーのロールが割り当てられるよ
  • 反対に、なにかしらの認証方法でサインインしたユーザーの場合は、認証済みユーザーのロールが割り当てられるよ
  • この認証方法はいろいろな方法が提供されているよ
    • Cognito(ユーザープール)
    • GoogleやTwitterなどのOIDC認証
    • SAML認証
    • etc.
  • 未認証ユーザーのロールと、認証済みユーザーのロールで操作権限を変えることで、ログイン前のユーザーができること、ログイン後のユーザーができることを切り替えることが、簡単にできるよ

ユーザープールとIDプールを連動させる

  • ユーザープールとIDプールはそれぞれ独立した概念でもあるので、それぞれだけで使うこともできるよ
  • 認可の仕組みが必要なければ、ユーザープールだけを使えばよいし、その逆も然りだよ
  • さらに、IDプールの認証の仕組みとして、ユーザープールを選択することもできるよ
  • ユーザープールで認証したユーザーに、IDプールの認証済みユーザーのIDを発行することができるよ
  • 逆に、ユーザープールで認証していないユーザーに、IDプールの未認証ユーザーのIDを発行することができるよ
  • ユーザープールとIDプールを連動させることによって、認証・認可の仕組みを簡単に導入することができるよ

Discussion