CTS-KB
セキュリティ 📚 シリーズ 2/4

AWS Cognito + パスキー採用の理由 — GCIP に PKCE が無い問題

⏱ 約 8 分で読めます
#セキュリティ #認証 #AWS Cognito #パスキー #WebAuthn #PKCE #OIDC #OAuth #Google Cloud Identity Platform #Firebase Authentication #BtoB SaaS

🎯 はじめに:認証基盤の選定は「機能の有無」だけでは決まらない

本記事はシリーズ 「BtoB SaaS セキュリティ設計」の第 2 回 です。第 1 回 BtoB マルチテナント SaaS のセキュリティ設計総覧 で総論を扱いましたが、本記事では認証層の中核である 「なぜ AWS Cognito を選んだのか」 に焦点を当てます。

認証基盤の比較記事は世に多くありますが、本記事の特徴は次の 2 点です。

  1. 「採用しなかった選択肢」の理由を公式ドキュメントで裏付ける:Google Cloud Identity Platform(GCIP)/ Firebase Authentication について、公式ドキュメントを直接確認して何が無いのかを確かめる
  2. コストと脅威モデルのトレードオフを開示する:Cognito Plus tier を採用しなかった判断基準を、抽象論ではなく当社の運用条件に基づいて説明する

🔐 結論:何を選んで、何を避けたか

採用した避けた
AWS Cognito User Pool(Essentials tier)Google Cloud Identity Platform / Firebase Authentication
パスキー(WebAuthn / FIDO2)ネイティブ機能第三者拡張に依存するパスキー実装
OIDC Authorization Code Flow + PKCEclient_secret 依存のフロー
パスワード認証との 併用フォールバックパスキー強制移行(デバイス紛失リスク)
Cognito Essentials tierPlus tier(Adaptive Authentication / IP リスク評価)

選定理由は 「OIDC with PKCE と WebAuthn の両方をネイティブに備える」「BtoB 管理者ログインに見合う料金体系」 に集約されます。

🛡️ なぜ「重ねる」のか — state / nonce / PKCE / WebAuthn の独立した役割

認証層の議論で混同されがちな 4 つの仕組みを整理します。これらは 互いに置き換え可能ではなく、それぞれ別の攻撃ベクトルに対応する独立した防御 です。

仕組み防ぐ攻撃必要なクライアント
stateCSRF(リクエスト改ざん・横取り)すべて
nonceID トークンのリプレイ(再送信攻撃)OIDC を使うすべて
PKCE認可コードの横取り(Authorization Code Interception Attack)client_secret を秘密にできない SPA・モバイル必須
WebAuthn / パスキーフィッシング全般(パスワード詐取・MITM)パスワードレスを目指すすべて

state は「行きの守り」、nonce は「帰りの守り」、PKCE は「中間者の守り」、WebAuthn は「人間そのものの守り」。

現代の OIDC 実装ベストプラクティスは 4 つすべてを併用 することです。1 つでも欠けると、その層に対する攻撃が成立してしまいます。

🆚 論点 A:GCIP / Firebase Authentication に「OIDC with PKCE」が無い

第 1 回で軽く触れましたが、ここで公式ドキュメントを直接確認した結果を提示します。

PKCE が SPA・モバイルで必須な理由

OAuth 2.0 の標準的な認可コードフローは、認可コード → アクセストークンの交換時に client_secret を提示してクライアントを認証します。しかし SPA・モバイルアプリではコードがクライアント側に展開されるため、 secret を秘密にできません

ここに 認可コード横取り攻撃(Authorization Code Interception Attack) が成立する隙が生まれます。攻撃者が何らかの方法でリダイレクト経由の認可コードを横取りできれば、client_secret は不要なのでトークンに交換できてしまう。

PKCE はこれを 「リクエストごとに動的に生成する code_verifier / code_challenge ペア」 で防ぎます。code_verifier を知らない攻撃者は、認可コードを盗んでもトークンに交換できません。 OAuth 2.1 ドラフトでは全クライアントで PKCE 必須 とされており、現代の事実上の必須要件です。

公式ドキュメント上で確認できる事実

観点公式ドキュメントの記載
GCIP / Firebase Auth は OIDC OP(IdP)として機能するかRP(Relying Party)としてのみ。自身を OP として SPA に提供する仕様は文書化されていない
.well-known/openid-configuration discovery エンドポイントの公開記載なし
PKCE / code_verifier / code_challenge の言及自身を OP として使う文脈で 一切記載なし

つまり GCIP / Firebase Auth は 「外部 OIDC IdP を消費する RP」 として設計されており、 「SPA・モバイルから OIDC + PKCE で直接認証する OP」としては機能しません 。Firebase Authentication の認証は独自 SDK + REST API 経由で完結しており、ブラウザリダイレクトを伴う標準 OIDC フローを前提にしていない設計です。

これは Google サポートへの問い合わせでも同様の回答を得ています。

Cognito との対比

AWS Cognito User Pool は Hosted UI / Managed Login を介して OIDC OP として PKCE 認可コードフローをネイティブ提供 します。SPA・モバイルから標準 OIDC で認証でき、/.well-known/openid-configuration discovery エンドポイントも公開されます。これが BtoB SaaS で「標準プロトコルに乗る」ための基礎条件を満たします。

🆚 論点 B:GCIP / Firebase Authentication にパスキーがネイティブで無い

論点 A とは独立した第 2 の弱点として、 WebAuthn / パスキーのネイティブ対応の欠如 があります。

観点AWS CognitoFirebase Auth / GCIP
パスキー / WebAuthn2025 年から Lite tier 以外で ネイティブ対応第三者拡張(firebase-web-authn)依存
GitHub feature request#2123(2019 年〜)が未解決のまま放置
公式 SDK の WebAuthn 対応aws-amplify/authsignIn({ preferredChallenge: 'WEB_AUTHN' })公式対応なし

第三者拡張に依存することのリスクは次の 3 点です。

  1. メンテナンスの不確実性 : 拡張のメンテナーが活動停止すれば自社で引き取らざるを得ない
  2. 公式サポートの欠如 : Firebase の有償サポート対象外
  3. 将来の互換性 : Firebase 本体の更新で拡張が動作しなくなるリスク

BtoB SaaS で 管理者ログインの最強防御をパスキーで構築する戦略 を取る以上、第三者拡張依存は受け入れ難い選択肢でした。

🤔 なぜ Google は OIDC with PKCE とパスキーを提供しないのか(推測)

公式に Google が表明した文書はありませんが、状況証拠から導ける合理的な仮説は次の 5 つです。

① Firebase Auth はもともと「OIDC OP」として設計されていない

Firebase Auth の中核は 2016 年に Firebase に統合された Identity Toolkit API で、これは独自 SDK 専用の REST API + Firebase ID Token で完結する設計です。 PKCE を導入する「土俵」が無い

② Google 内での役割分担:OIDC OP は accounts.google.com の責務

Google には Google Identity Services(accounts.google.com) が既に OIDC OP として PKCE 含めて存在します。Firebase Auth / GCIP は 「アプリ独自のユーザー DB を持つための B2C CIAM」 であり、両者を統合する戦略が取られなかった。

③ ビジネス戦略:「OIDC OP が必要なら Auth0 / Okta を使え」

GCP のドキュメントとパートナー戦略は、 本格的な IdP 機能はサードパーティ連携に委ねる 形に寄っています。Auth0(Okta)等で十分という想定です。

④ Firebase 独自の認証フローと OIDC OP は両立しづらい

カスタムトークン認証・匿名認証・電話番号認証など、 OIDC 標準にない独自フロー が主要機能として存在します。これらと OIDC OP を同居させるとプロトコル適合の検証コストが膨大です。

⑤ GCIP への投資が長らく停滞している

WebAuthn / パスキーの GitHub feature request が 2019 年から未解決のまま放置されている事実は、 Google 社内での優先度の低さ を示唆します。Cognito が 2025 年にネイティブパスキー対応を入れたのとは対照的な動きです。

「できないのではなく、やる動機が組織的に無い」 という構造的な問題と捉えるのが、状況に最も整合する説明です。

💡 「Essentials tier + パスキー」が成立する当社の条件

最後に、Cognito Plus tier(Adaptive Authentication / IP リスク評価)を採用しなかった判断について、コストと脅威モデルの観点から開示します。

Plus tier の特徴:

  • 侵害クレデンシャル検知 : 既知の漏洩パスワード DB と照合
  • Adaptive Authentication : サインインのリスク(IP・デバイス・行動)を評価して MFA を動的要求
  • 追加課金 : 月間アクティブユーザー単位($0.05/MAU 程度)

当社の運用条件:

  • セルフサインアップ無効 : 全アカウントが管理者経由でのプロビジョニング
  • 管理者ログインに限定 : エンドユーザー向けのログインは別系統(脅威モデルが大きく異なる)
  • アカウント数が限定的 : 大量ブルートフォース攻撃の対象になりにくい

脅威ベクトルが「セルフサインアップで増えるアカウントの侵害」ではなく、「特権アカウントへのフィッシング」に集中している ため、Adaptive Authentication よりも パスキー(フィッシング耐性) がコスト対効果で優位という判断です。

ビジネスが拡大して脅威モデルが変化したら、Plus tier への切り替えは構成変更で対応できます。 「今の脅威モデルに合った最小構成」 を選ぶことが、過剰投資を避ける現実的なアプローチでした。

🧭 まとめ

  • AWS Cognito User Pool(Essentials tier)+ パスキー が、 OIDC with PKCE / WebAuthn の両方をネイティブに備える 唯一の現実的な選択肢
  • GCIP / Firebase Auth は構造的に OIDC OP ではなく、PKCE もパスキーもネイティブ対応していない(公式ドキュメントで裏付け済)
  • 4 つの防御(state / nonce / PKCE / WebAuthn)は 独立した攻撃ベクトル に対応するので併用が必須
  • Plus tier は 脅威モデルとコスト のトレードオフで現時点では不要と判断

認証基盤は 「機能の網羅性」よりも「自社の脅威モデルにフィットする最小構成」 で選ぶべきで、本記事の判断軸が読者の選定の参考になれば幸いです。

📚 シリーズ記事

#タイトル内容
1総覧認証・認可・通信・インフラ・監査の多層防御の全体像
2AWS Cognito + パスキーを選んだ理由 (本記事)GCIP に OIDC with PKCE とパスキーが無い問題と採用判断
3OAuth / OIDC / SAML / WebAuthn の歴史認証プロトコルの系譜と各仕様の役割
43 層認可防御の実装パターン (公開予定)Defense in Depth の実装と DB SSOT 方式
5WIF でキーレス認証 (公開予定)静的鍵を使わない CI / クラウド連携の実践
6Web レピュテーション / IP レピュテーション (公開予定)Cognito Plus tier 等の脅威保護機能
7ログインセキュリティのベストプラクティス (公開予定)パスワードポリシー、MFA、セッション管理
8開発環境のセキュリティ対策 (公開予定)DevContainer / SAST / Secret Scanning
9ゼロトラストアーキテクチャ境界はネットワークから ID へ、IPv6 と SaaS が変えた前提
10IPA セキュリティアクションへの対応 (公開予定)中小企業向け実装ガイド

📖 関連用語

  • パスキー — フィッシング耐性が極めて高いパスワードレス認証
  • WebAuthn — W3C 標準の Web 認証 API、パスキーの基盤
  • PKCE — OAuth 2.0 で認可コードの横取りを防ぐ拡張仕様
  • AWS Cognito — マネージド認証・認可サービス
  • 多層防御 — 独立した複数の層で重ねて防御する設計思想