Amazon Cognito サービスを使うと、アプリケーションにユーザー認証(サインイン)の仕組みを提供し、認証されたユーザーだけが呼び出し可能な Web API などを実現できます。 その際に内部的に使用される ID トークンやアクセストークンなどの関係が若干複雑なのでメモしておきます。
Cognito で認証が必要な API を実現する仕組み
Web アプリなどで Amazon Cognito の ユーザープール を使って認証(サインイン)すると、Cognito は ID トークン を返します(JWT: JSON Web Token)。 この ID トークンは、サービスの正式なユーザーであるということを証明するものです。 この ID トークンを API 呼び出し時に検証することで、認証が必要な API を実現することができます。
AWS で何らかの Web API を作成する場合は、API Gateway (REST API) や AppSync (GraphQL API) などを使うことになりますが、これらのリソースには Cognito ユーザープールをオーソライザーとして設定することができます。
これにより、Web ブラウザからの API Gateway アクセスを、Cognito でのサインインが終わったユーザーに限定することができます(認証付き API)。
デフォルトでは、Authorization
ヘッダーで ID トークンを送ってもらう設定になっています。
ID トークンはセッション情報として保存されます。
上記の例では、Cognito が返した ID トークンを API Gateway で使う構成になっていますが、ID トークン (JWT: JSON Web Token) は標準化されており、独自の API サーバーで認証付き API を実現したい場合にも使用できます。 その場合は、API サーバーはクライアントから ID トークンを受け取り、それが正しいものかどうかを Cognito サービスに問い合わせて検証します。
Cognito の ID プールは関係ない?
Cognito には、ユーザープールの他に、ID プール(フェデレーティッド ID)というものがあって、ちょっとややこしいです。
ID プールの方は、Cognito によって認証されたユーザーに対して、AWS 内のサービス(S3 や DynamoDB など)へのアクセス権限を直接付加(認可)するために使用します。 Cognito で ID プールを設定しておくと、認可された AWS サービスにアクセスするための アクセストークン を返してくれるようになります(ID トークンと一緒に返されます)。 ID トークンを使った API Gateway 経由での API アクセスとは異なり、アクセストークンには AWS リソースを参照する権限が付いているので、Web アプリなどのフロントエンドから直接 AWS リソースにアクセスする形になります。
React アプリなどを作成する場合は、Amplify SDK を使用することで、ID トークンやアクセストークンなどの複雑な処理を隠蔽できます。 ちなみに、API Gateway 経由で実行される Lambda 関数の実行権限は、あくまで AWS 内のリソースに割り当てられた IAM ロールなどで決まるため、Cognito の ID プール(フェデレーティッド ID)によって割り当てられた権限(アクセストークン)は使われません。
関連記事
- AWS CDK で API Gateway に Cognito 認証によるアクセス制御を追加する
- Go 言語と AWS SDK V2 で Amazon Cognito を操作する
- Amazon Cognito をコマンドライン (CLI) から操作する
- Amazon Cognito: Amplify SDK による認証まわりの UI 表示あれこれ
- Amazon Cognito (2) サインイン後に AWS リソースへのアクセス権限を与える (Cognito Identity Pool)
- Amazon Cognito (1) サインイン可能な Web サイトを作る (Cognito User Pool)
- AWS CDK で API Gateway の REST API を作成する