前書き
研修の中で Cognito について調べました。その内容をアウトプットしたいと思います。
本文
Cognito とは
Amazon Cognitoは、アプリケーションやウェブサイトにおけるユーザー認証をサポートするためのAWSのサービスの1つです。ユーザごとの ID 管理や AWS リソースへのアクセスコントロールができます。
Cognito を構成する要素は大きく2つに分けることができます。
-
Cognito ユーザプール
ユーザの作成・管理・認証を行うユーザディレクトリ。認証された JWT ( JSON Web Token )をアプリケーション・ Web サーバ・ API に直接発行します。 -
Cognito ID プール
AWS リソースへのアクセスを許可します。アプリケーション用の AWS 認証情報である STS トークンを発行します。
ユーザプールが認証、ID プールが認可の役割を担っています。
今回はユーザプール認証で使用するトークンについてまとめます。
認証で使用されているトークン
トークンは認証されたユーザに関するクレーム(情報)を持っているものです。
BASE64 という変換方法でエンコードされた文字列としてトークンを発行します。
BASE64 について
BASE64 とは 64 進数を意味する言葉で、変換方法の一種です。バイナリ全体を bit の配列として捉え、 6 bit ずつ区切り文字列に置き換える処理をします。文字テーブルは 64 文字種 + パディング用の ”=” の 65 文字種です。
受信側と送信側が BASE64 を用いた変換をすることで、メールを通して画像や音声などの送受信が可能になりました。
現在では、JSON などで特殊文字を含まないように画像データを base64 でエンコードしたり、Web ページの表示の際にリクエスト数を減らすために base64 でエンコードした画像を html にそのまま埋め込むなどの用途で用いられています。
また URL に使用できる BASE64 エンコードである BASE64 URL エンコードもあります。
BASE64 エンコード 後、「 + 」 を「 - 」に「 / 」 を「 _ 」に置換します。また、「 = 」によるパディングは行いません。
URL として使う URI の仕様で予約されている特別な文字で「 + 」や「 / 」などが使用されており、別の意味を持ってしまうため置換を行っています。そのためURL セーフ( URL にとって安全である)な変換方法になります。
Amazon Cognito のユーザプールでは、ユーザーがアプリケーションにサインインする際に生成されるさまざまなタイプのトークンがあります。その中で最も重要なトークンは、アクセストークン、ID トークン、そしてリフレッシュトークンの3つです。
ID トークン(ID Token)
ユーザーを識別し、認証されたユーザーの属性情報を提供するトークンです。このトークンには、ユーザーの一意の識別子や属性(例: ユーザーのメールアドレスやグループへの所属情報など)が含まれています。アプリケーションは ID トークンを使用して、ユーザーの個別のサービスを提供するための情報を取得します。
アクセストークン(Access Token)
ユーザーがアプリケーションやAPIに対して認可されたリソースにアクセスする際に使用されます。アクセストークンは、 AWS のサービスやアプリケーションのバックエンドでの認証や権限の付与に利用され、特定の操作やリソースへのアクセスを制御します。
リフレッシュトークン(Refresh Token)
ID トークン・アクセストークンの有効期限が切れた場合、ユーザーは新しい ID トークン・アクセストークンを取得するためにリフレッシュトークンを使用します。リフレッシュトークンを利用することで、ユーザーはサインインセッションを継続し、再認証を行わずに新しいID トークン・アクセストークンを取得することができます。
このように、Amazon Cognitoのユーザプールで使用される3つのトークンは、認証やアクセス制御において重要な役割を果たしています。
JWT について
JWT は JSON データを URL セーフでコンパクトな形式にしたものです。スペースに制約がある環境( HTTP ヘッダやクエリパラメータ)で使用することを想定しています。BASE64 URL エンコードで変換されており、よく使われるデータ項目の名称を省略形にすることで送信するデータ量を軽減しています。
まとめ
Cognito による認証で使用されているトークンについてまとめました。
Amazon Cognito のユーザプールでは、これらのトークンがユーザー認証と権限管理において重要な役割を果たしています。これらのトークンを正しく管理することで、セキュリティを強化し、アプリケーションの安全性を確保することができます。