AWS Cognito IDプール（フェデレーティッドアイデンティティ）で詰まりがちな用語

# はじめに
AWSサービスの一つ「**Cognito**」

社内用のツールを作成する際に、クライアントJavascriptから直接S3にアクセスするため初めてCognitoを使用しました。
今回はCognitoについて調べていく中で引っかかった用語について書きます。

## Cognitoとは
大まかに言うと

- ユーザー登録（サインアップ）機能やログイン機能を提供してくれる「**ユーザープール**」
- 外部ユーザーなどがAWSサービスを使えるように一時的なAWS credentialsを発行してくれる「**IDプール（フェデレーティッドアイデンティティ）**」

の２つのコンポーネントをもつAWSサービスです。
めんどくさいログイン機能とか全部やってくれるすごいやつです。

今回は後者の「**IDプール（フェデレーティッドアイデンティティ）**」のお話です。

# 詰まりがちな用語
翻訳に癖があるのかすんなり入ってこない文章たち。
その中で一際分かりにくいCognito用語を解説します。

## "ID"
"ID"自体はそんなに特殊な用語ではありませんが、Cognitoのドキュメントには至る所に"ID"という単語が出てきまくるので「IDってなんだっけ？」というプリミティブな疑問に陥りがちです。
Cognitoにおいて"ID"とは何を指すのかまず明確にしましょう。

IT業界で"ID"と聞いて最初に連想するのは数字もしくは文字で構成されるユニークな識別子（Identifier）です。
Cognitoにおける"ID"はそういった識別子ではなく、ユーザーの情報を持った一つのオブジェクトです。
一つの"ID"は一つのユーザーと対応していて、リンクされた認証情報やユーザーのプロファイル（データセット）を持っています。
初めて見た時は笑ってしまいましたが、この"ID"にも識別のためのID（数字と文字で構成されているもの）が設定されていて、その名も「**アイデンティティ ID**」です。

**IDプール**というのは、この"ID"がいっぱい入るプール（pool）ということです。

～以下蛇足～
実は、AWSのコンソールを英語表記にすると分かりますが、日本語で"ID"と表記されているところは、原文（英語）では全て"Identity"となっています。
"IDプール"も原文は"Identity Pool"です。
**Identifier / Identification** が識別するために使用する物（識別子/身分証明書など）であるのに対し、**Identity** は識別される物（身分とか）のことです。
どちらも"ID"ですが微妙に違いがあり、これも分かりにくくなっている一つの原因です。


## "フェデレーティッドアイデンティティ"
"IDプール"とよく一緒に書かれている"フェデレーティッドアイデンティティ"とは何でしょうか？

実はFederated identityに関してはそのままの単語のwikipediaページがありますので、そちらを見ると分かりやすいと思います。
[Federated identity - Wikipedia（英語）](https://en.wikipedia.org/wiki/Federated_identity)
[連合アイデンティティ - Wikipedia（日本語）](https://ja.wikipedia.org/wiki/%E9%80%A3%E5%90%88%E3%82%A2%E3%82%A4%E3%83%87%E3%83%B3%E3%83%86%E3%82%A3%E3%83%86%E3%82%A3)

大まかに言うと、異なるシステム（組織）の権限も貰えるIdentity（身分）とかそんな感じです。
もちろん異なるシステムと言っても、認証する上で決まり事に沿って連携しているはずですので、この連携を取っているシステム（組織）群のことをFederation（連合・連邦）と呼んでいます。

Cognitoにおいては"フェデレーティッドアイデンティティ"は機能（コンポーネント）の名称になっていますので、"IDプール"＝"フェデレーティッドアイデンティティ"と考えて問題ありません。
というか「IDプール（フェデレーテッドアイデンティティ）」という形でしか出てきません。

## "認証されたID"、"認証されていないID"
IDプールの作成時に出てくるこの"認証されていないID"。
![unauch_id.jpg](https://qiita-image-store.s3.amazonaws.com/0/238976/a96adb68-e9e0-040e-3aa7-89883b41fc00.jpeg)

そもそも"認証されたID"というのは、**認証プロバイダー**によって認証されたユーザーのIDのことです。つまり**認証済みユーザー（ログインやシングルサインオンなどで認証されたユーザー）**のIDのことを"認証されたID"と呼びます。

"認証されていないID"はその逆で、認証プロバイダーによる認証を行っていないユーザーのIDのことです。つまり**ログインやシングルサインオンをしていないユーザー**のIDを"認証されていないID"と呼びます。
※AWSのドキュメントではこのユーザーのことを"**ゲストユーザー**"と表しています。

## "認証されたロール"、"認証されていないロール"
IDプール作成時に設定（作成）する"認証されたロール"と"認証されていないロール"はそれぞれ"認証されたID"と"認証されていないID"に対応するIAMロールです。
つまり、
　**認証されたロール = 認証されたID（ログインユーザー）に与えらえる権限**
　**認証されていないロール = 認証されていないID（ゲストユーザー）に与えられる権限**
です。

![id_pool_edit5.jpg](https://qiita-image-store.s3.amazonaws.com/0/238976/58474644-8097-f3f0-cc34-9effb21f5b3d.jpeg)

## "認証されていないIDに対してアクセスを有効にする"
詰まりがちというか、Cognitoのチュートリアルなどではここにチェックを付けましょうと書いてあるものが多いですが、なんでチェックを付けるのか理由まで書かれているものが少なかったので解説します。
![unauch_id.jpg](https://qiita-image-store.s3.amazonaws.com/0/238976/a96adb68-e9e0-040e-3aa7-89883b41fc00.jpeg)
"認証されていないIDに対してアクセスを有効にする"にチェックを入れるとゲストユーザーにもIDが振られるようになります。
（つまりIDプールにアクセスしてきたユーザー全てにIDを振ります）
有効にしていないと"認証されていないロール"を設定してもゲストユーザーにその権限を与えることはできません。

～注意～
ここを有効にすると、ログインやシングルサインオンなどの認証無しでIDプールのサービスが利用できるようになりますが、IDプールのID（Identity pool ID）さえ分かれば**誰でも"認証されていないロール"の権限でAWSサービスにアクセスできてしまう**状態になります。
（公開しているサイトでブラウザのJavascriptからIDプールを利用する際には基本的に誰でもIdentity pool IDが分かる状態になるはずです）
これを有効にする場合、"認証されていないロール"のポリシー設定には十分に注意しましょう。
ログインユーザーにのみAWSサービスのアクセスを許可する場合、認証されていないIDを有効にする必要はないので、チェックは外しておきましょう。