Cognito のカスタム認証・認可を実装した Web アプリケーション

2025/11/11

池 文光 | Mankwong Chi

概要


多くのアプリケーションは、バックエンド API のセキュリティを確保するためにトークンベースの認証に依存しています。静的な認証情報を埋め込んだり、セッション状態を手動で管理したりする代わりに、Amazon Cognito は拡張性に優れたフェデレーション対応の認証・認可基盤を提供します。これにより、ユーザープールだけでなく、Google、Facebook、Apple などのアイデンティティプロバイダー(IdP)もサポートします。

カスタム認可モデルを導入することで、Cognito の柔軟性をさらに拡張し、API がアクセストークンを直接検証できるようになります。これにより、有効で署名付き、かつ有効期限内のトークンのみが受け入れられることを保証します。

アーキテクチャ概要


この構成では、S3 上の静的コンテンツ、EC2 上の API サーバー、そして Cognito による認証を統合することで、サーバーレスまたはハイブリッド型 Web アプリケーション向けの安全でモダンなアーキテクチャを実現します。

ステップごとの詳細説明


1. Cognito SDK を使用したユーザー認証

S3 にホストされ、CloudFront を通じて配信されるフロントエンドアプリケーションは、Cognito SDK を使用してユーザー認証を開始します。ユーザーは Cognito または Google、Facebook、Apple などのアイデンティティプロバイダー(IdP)を通じてサインインします。

2. フェデレーション認証

Cognito はユーザーを選択した IdP にリダイレクトします。サインインが成功すると、Cognito は IdP から受け取ったトークンを自らのトークンに交換し、ユーザーに代わって ID トークンアクセス トークンリフレッシュ トークン を生成します。

3. トークン受信

Cognito はこれらのトークンをアプリケーションで定義されたコールバック URL に送信します。アプリケーションはトークンをローカルストレージまたはクッキーに安全に保存し、以後の API リクエストで使用します。

4. アクセストークン付き API リクエスト

保護された EC2 上の API にアクセスする際、フロントエンドは Authorization ヘッダーに Bearer トークン として アクセス トークン を付与します。

5. カスタム認可の検証

EC2 上の API サーバーはアクセストークンを次の手順で検証します。

  • 公開エンドポイントから Cognito JSON Web Key Set (JWKS) を取得
  • AWS 公開鍵を使用してトークン署名を検証
  • 有効期限およびオーディエンス(aud)クレームを確認

有効なトークンを持つリクエストのみがビジネスロジック処理へ進みます。

6. レスポンス処理

  • 成功: 有効なトークンの場合、要求された機能へのアクセスが許可されます。
  • 失敗: 無効・期限切れ・改ざんされたトークンの場合、401 Unauthorized が返されます。

まとめ


このアーキテクチャにより、手動での認証情報管理が不要となり、認証を一元化できます。また、既存の IdP とシームレスに統合されたトークンベースの細かなアクセス制御を実現します。監査性が高く、安全性に優れたこの構成は、AWS 上にデプロイされたサーバーレス Web アプリケーションに最適です。