ユーザープール、アイデンティティプール、JWT

開発者のための AWS セキュリティ活用

Rahul Singh

Technical Product Manager

Cognitoは1つの名前に2つのサービス

Amazon Cognito

  • アプリケーションのユーザー向けのマネージドID
  • 1つの名前、2つの別々のサービス

Amazon Cognitoというラベルの点線の枠の上に2つの疑問が示されています。枠内には2つの青いパネルが並び、ユーザープールは「ユーザーディレクトリ」、アイデンティティプールは「クレデンシャルブローカー」として説明されています。両方のパネルからの線は下の点線のオレンジ色のボックスに集まり、多くのアプリケーションが両方を使用することを示しています。

開発者のための AWS セキュリティ活用

Cognitoは1つの名前に2つのサービス

Amazon Cognito

  • アプリケーションのユーザー向けのマネージドID
  • 1つの名前、2つの別々のサービス

どちらが必要ですか?

  • サインインとユーザープロファイル: ユーザープール
  • ブラウザやモバイルからAWSを直接呼び出す: アイデンティティプール

Amazon Cognitoというラベルの点線の枠の上に2つの疑問が示されています。枠内には2つの青いパネルが並び、ユーザープールは「ユーザーディレクトリ」、アイデンティティプールは「クレデンシャルブローカー」として説明されています。両方のパネルからの線は下の点線のオレンジ色のボックスに集まり、多くのアプリケーションが両方を使用することを示しています。

開発者のための AWS セキュリティ活用

ユーザープールがユーザーをサインインさせる

マネージドユーザーディレクトリ

  • サインアップとサインイン
  • パスワードリセット
  • 多要素認証

縦方向のフロー: アプリユーザーがパスワードを保持するユーザープールにサインインすると、プールはIDトークン、アクセストークン、リフレッシュトークンを含むボックスを返します

開発者のための AWS セキュリティ活用

ユーザープールがユーザーをサインインさせる

マネージドユーザーディレクトリ

  • サインアップとサインイン
  • パスワードリセット
  • 多要素認証

 

成功すると3つのトークン

縦方向のフロー: アプリユーザーがパスワードを保持するユーザープールにサインインすると、プールはIDトークン、アクセストークン、リフレッシュトークンを含むボックスを返します

開発者のための AWS セキュリティ活用

ユーザープールがユーザーをサインインさせる

マネージドユーザーディレクトリ

  • サインアップとサインイン
  • パスワードリセット
  • 多要素認証

 

成功すると3つのトークン

  • IDトークン: ユーザーが誰であるか
  • アクセストークン: 何を呼び出せるか
  • リフレッシュトークン: 後で新しいトークンを取得

縦方向のフロー: アプリユーザーがパスワードを保持するユーザープールにサインインすると、プールはIDトークン、アクセストークン、リフレッシュトークンを含むボックスを返します

開発者のための AWS セキュリティ活用

アイデンティティプールがAWS認証情報を発行する

トークンは認証情報ではない

  • アプリに対する本人確認の証明
  • AWSサービスへのアクセスに使う認証情報ではない

 

アイデンティティプール: 信頼済みトークンを入れて認証情報を得る

ユーザープール図と同じ構造の縦方向のフロー: 信頼済みトークンがアイデンティティプールに提示されると、発行者を確認し、1つのロールに限定された、有効期限付きのAWS認証情報を返します

開発者のための AWS セキュリティ活用

アイデンティティプールがAWS認証情報を発行する

トークンは認証情報ではない

  • アプリに対する本人確認の証明
  • AWSサービスへのアクセスに使う認証情報ではない

 

アイデンティティプール: 信頼済みトークンを入れて認証情報を得る

  • ビルドジョブがOIDCトークンを交換した例
  • 持っている証明を、鍵カードと交換するイメージ

ユーザープール図と同じ構造の縦方向のフロー: 信頼済みトークンがアイデンティティプールに提示されると、発行者を確認し、1つのロールに限定された、有効期限付きのAWS認証情報を返します

開発者のための AWS セキュリティ活用

1つのアプリ、両方の役割

両方を使うブラウザ

  1. サインインしてトークンを受け取る
  2. そのトークンをAPIに送信

ベアラートークン: 持つ者が使える

縦方向のフロー。ブラウザがユーザープールでサインインするとトークンが返されます。その1つのトークンは左のAPIと右のアイデンティティプールへと2方向に分岐します。アイデンティティプールは認証情報を返し、その認証情報がS3に到達します。

開発者のための AWS セキュリティ活用

1つのアプリ、両方の役割

両方を使うブラウザ

  1. サインインしてトークンを受け取る
  2. そのトークンをAPIに送信
  3. 同じトークンを認証情報と交換

縦方向のフロー。ブラウザがユーザープールでサインインするとトークンが返されます。その1つのトークンは左のAPIと右のアイデンティティプールへと2方向に分岐します。アイデンティティプールは認証情報を返し、その認証情報がS3に到達します。

開発者のための AWS セキュリティ活用

1つのアプリ、両方の役割

両方を使うブラウザ

  1. サインインしてトークンを受け取る
  2. そのトークンをAPIに送信
  3. 同じトークンを認証情報と交換
  4. その認証情報でS3にアクセス

コードにはトークン、AWSには認証情報

縦方向のフロー。ブラウザがユーザープールでサインインするとトークンが返されます。その1つのトークンは左のAPIと右のアイデンティティプールへと2方向に分岐します。アイデンティティプールは認証情報を返し、その認証情報がS3に到達します。

開発者のための AWS セキュリティ活用

トークンは署名付きのテキスト

ドットで結ばれた3つのセグメントで、Header、Payload、Signatureというラベルが付いています。Payloadの上には開いた南京錠があり、最初の2つのセグメントの下の括弧は署名が及ぶ範囲を示しています。

JWT: JSON Web Token

  • クレーム: ユーザーに関するラベル付きの記述
開発者のための AWS セキュリティ活用

トークンは署名付きのテキスト

ドットで結ばれた3つのセグメントで、Header、Payload、Signatureというラベルが付いています。Payloadの上には開いた南京錠があり、最初の2つのセグメントの下の括弧は署名が及ぶ範囲を示しています。

JWT: JSON Web Token

  • クレーム: ユーザーに関するラベル付きの記述
  • エンコードされているが、暗号化はされていない
  • 誰でも読めて、誰でも変更できる
開発者のための AWS セキュリティ活用

読み取る前に検証する

検証が最初に行われる

  • JWKS: JSON Web Key Set、発行者の公開署名鍵
  • 署名はこれらの鍵と照合される

縦方向のゲート図。トークンが届き、署名、発行者、対象者、有効期限の4つのチェックを順に通過します。発行者の公開鍵は横から署名チェックに供給され、4番目のチェックを通過して初めて、クレームを読み取る緑色のボックスに到達します。

開発者のための AWS セキュリティ活用

読み取る前に検証する

検証が最初に行われる

  • JWKS: JSON Web Key Set、発行者の公開署名鍵
  • 署名はこれらの鍵と照合される

 

次に3つのクレームを確認

  • iss: ユーザープール
  • IDトークンではaud、アクセストークンではclient_id
  • exp: 有効期限内か

縦方向のゲート図。トークンが届き、署名、発行者、対象者、有効期限の4つのチェックを順に通過します。発行者の公開鍵は横から署名チェックに供給され、4番目のチェックを通過して初めて、クレームを読み取る緑色のボックスに到達します。

開発者のための AWS セキュリティ活用

検証済みのトークンでも間違っている場合がある

2枚のカードが並んでいます。IDトークンのカードは「アイデンティティトークン」とマークされ、クライアントIDがaudienceクレームに保持され、スコープを持たないことが示され、上部にはユーザーが誰であるかを示す灰色のボックスがあります。アクセストークンのカードは「アクセストークン」とマークされ、クライアントIDが独自のクライアント識別子クレームに保持され、スコープを持つことが示され、上部には何を呼び出せるかを示すオレンジ色のボックスがあります。両方のカードの下にある点線の帯には、Cognitoのgroupsクレームが両方のトークンに含まれることが記されています。

検証済みでも、間違ったトークンの場合がある

開発者のための AWS セキュリティ活用

検証済みのトークンでも間違っている場合がある

2枚のカードが並んでいます。IDトークンのカードは「アイデンティティトークン」とマークされ、クライアントIDがaudienceクレームに保持され、スコープを持たないことが示され、上部にはユーザーが誰であるかを示す灰色のボックスがあります。アクセストークンのカードは「アクセストークン」とマークされ、クライアントIDが独自のクライアント識別子クレームに保持され、スコープを持つことが示され、上部には何を呼び出せるかを示すオレンジ色のボックスがあります。両方のカードの下にある点線の帯には、Cognitoのgroupsクレームが両方のトークンに含まれることが記されています。

検証済みでも、間違ったトークンの場合がある

token_useがトークンの種類を示す

  • cognito:groupsは両方の種類に含まれ、スコープではない

  • scope: トークンが何を呼び出せるか

  • sub: どのユーザーか、変化しない
  • アイデンティティは権限ではない
開発者のための AWS セキュリティ活用

練習しましょう!

開発者のための AWS セキュリティ活用

Preparing Video For Download...