目次

  1. 結論(早見表)
  2. それぞれの役割
  3. 比較表
  4. 判断フロー
  5. ユースケース別の推奨
  6. よくあるアンチパターン
  7. 実装時のセキュリティベストプラクティス
  8. 組み合わせ方のパターン
  9. まとめ

1. 結論(早見表)

やりたいこと選ぶべきプロトコル
ユーザーをログインさせたい(新規開発のWeb・モバイル・SPA)OpenID Connect (OIDC)
API へのアクセス権を委譲したい(「このアプリにGoogleカレンダーの読み取りを許可」など)OAuth 2.0 / 2.1
既存のエンタープライズIdP(ADFS、古い社内SSO)と企業向けSSOを連携したいSAML 2.0(新規ならOIDCも検討)
サーバー間(M2M)でAPIを呼びたいOAuth 2.0 Client Credentials
ログイン + API アクセスの両方OIDC(=OAuth 2.0の上に乗っている)

一言で言うと:認証(誰か)=OIDC / SAML、認可(何をしてよいか)=OAuth。


2. それぞれの役割

OAuth 2.0

  • 認可(Authorization) のためのフレームワーク。
  • 「ユーザーのパスワードを渡さずに、第三者アプリにリソースへの限定的なアクセス権を与える」ためのもの。
  • 発行されるのは アクセストークン。これは「APIを呼ぶ権利」を表すもので、ユーザーが誰かを証明するものではない。
  • 主な用途:外部API連携、自社API保護、M2M通信。

OpenID Connect (OIDC)

  • OAuth 2.0 の上に構築された認証(Authentication)レイヤー。
  • OAuth のフローに ID トークン(JWT) と UserInfo エンドポイントを追加し、「ユーザーが誰か」を標準的に伝えられるようにしたもの。
  • JSON / REST ベースで、モバイル・SPA・マイクロサービスと相性が良い。
  • 主な用途:ソーシャルログイン、自社サービスのSSO、モダンなIdP(Entra ID、Okta、Auth0、Keycloak、Cognito 等)との連携。

SAML 2.0

  • XML ベースの認証・SSO 標準(2005年〜)。
  • IdP が署名付きの SAML アサーションを発行し、ブラウザのリダイレクト/POST 経由で SP に渡す。
  • エンタープライズ領域で長い実績があり、多くの SaaS・社内システムが対応。
  • 主な用途:企業向け SaaS の SSO、レガシーな社内IdPとの連携。
  • 弱点:ネイティブアプリ・SPA・API 保護には不向き、XML署名検証の実装が難しく脆弱性を生みやすい。

3. 比較表

観点OAuth 2.0OIDCSAML 2.0
目的認可認証(+認可)認証(SSO)
トークン形式アクセストークン(形式は規定なし、JWTか不透明トークン)IDトークン(JWT)+アクセストークンSAMLアサーション(XML)
データ形式JSONJSONXML
伝送HTTP / RESTHTTP / RESTブラウザリダイレクト / HTTP POST
モバイル・SPA◎◎△(不向き)
API 保護◎◎✕(想定外)
エンタープライズSSO—◎◎(実績が豊富)
実装難易度中中(ライブラリ充実)高(XML署名・正規化)
ディスカバリRFC 8414(メタデータ)/.well-known/openid-configurationメタデータXML

4. 判断フロー

ユーザーのログイン(本人確認)が必要?
├─ No → API アクセスの委譲/M2M?
│        └─ Yes → OAuth 2.0
│                 ├─ ユーザーが関与する → Authorization Code + PKCE
│                 └─ サーバー間のみ   → Client Credentials
│
└─ Yes → 相手(IdP / 顧客企業)が SAML しか対応していない?
         ├─ Yes → SAML 2.0(可能なら将来OIDCへ移行を計画)
         └─ No  → OIDC(Authorization Code + PKCE)

5. ユースケース別の推奨

5.1 一般消費者向け Web / モバイルアプリのログイン

  • OIDC を使う。Google / Apple / Microsoft 等のソーシャルログインもすべて OIDC。
  • フローは Authorization Code + PKCE。

5.2 B2B SaaS(顧客企業の社内IdPでSSOさせたい)

  • OIDC と SAML の両方をサポートするのが現実解。
  • 大企業・官公庁・レガシー環境では SAML が要求されることがまだ多い。
  • 自前で両対応を実装せず、IdP ブローカー(Auth0、Okta、Keycloak、Entra External ID、WorkOS 等)で吸収すると楽。
  • ユーザープロビジョニングには SCIM を組み合わせる(SAML/OIDC はプロビジョニングを担わない)。

5.3 社内システムの SSO(新規)

  • 社内IdP(Entra ID 等)が OIDC 対応なら OIDC を優先。
  • 既存資産が SAML 前提なら SAML を継続してよいが、新規システムは OIDC で作る。

5.4 自社 API の保護

  • OAuth 2.0 のアクセストークンで保護する。
  • API 側は aud(オーディエンス)、iss、exp、scope を必ず検証。
  • ID トークンを API の認可に使わない(ID トークンはクライアント向け)。

5.5 外部サービスの API 連携(GitHub、Google Drive など)

  • OAuth 2.0。必要最小限のスコープを要求する。

5.6 マイクロサービス間・バッチ・M2M

  • OAuth 2.0 Client Credentials。
  • より強固にするなら mTLS(RFC 8705)や private_key_jwt によるクライアント認証。

5.7 CLI / IoT / TV など入力が難しいデバイス

  • OAuth 2.0 Device Authorization Grant(RFC 8628)。

6. よくあるアンチパターン

アンチパターン問題点正しい方法
OAuth のアクセストークンだけで「ログイン」扱いにするトークンは誰向けか保証されず、なりすまし(トークン差し替え)の余地があるOIDC の ID トークンで認証する
ID トークンを API の Bearer トークンとして使うID トークンの aud はクライアントで、API 向けではないAPI にはアクセストークンを使う
Implicit Flow を使うトークンがURLフラグメントに露出、リフレッシュ不可Authorization Code + PKCE
Resource Owner Password Credentials(ROPC)アプリがパスワードを扱う、MFA・フェデレーション不可Authorization Code + PKCE
SAML の署名検証を自前実装XML Signature Wrapping 等の脆弱性を生みやすい実績あるライブラリ/IdPブローカーを使う
新規のモバイルアプリで SAMLネイティブアプリ向けに設計されていないOIDC
「OAuth で認証」と言ってしまう設計時に認証と認可が混同される用語を分けて設計する

7. 実装時のセキュリティベストプラクティス

OAuth 2.0 / OIDC 共通

  • Authorization Code + PKCE を全クライアントで使う(機密クライアントも含む)。OAuth 2.0 Security BCP(RFC 9700)および OAuth 2.1 の方針。
  • リダイレクト URI は完全一致で登録・検証する(ワイルドカード禁止)。
  • state パラメータで CSRF 対策、OIDC では nonce でリプレイ対策。
  • アクセストークンは短命にし、リフレッシュトークンはローテーション+失効管理。
  • SPA ではトークンをブラウザに保持しない BFF(Backend for Frontend)パターンを検討。
  • スコープは最小権限。
  • トークンの盗用対策が必要なら DPoP(RFC 9449) や mTLS による送信者制約トークン。
  • JWT 検証では alg を固定し、none を拒否、JWKS から鍵を取得してキャッシュ/ローテーションに対応。

OIDC 固有

  • ID トークンの iss、aud、exp、iat、nonce を必ず検証。
  • ユーザーの一意識別には iss + sub の組み合わせを使う(メールアドレスをキーにしない)。
  • ディスカバリ(/.well-known/openid-configuration)を利用して設定ミスを減らす。

SAML 固有

  • アサーションの署名を必須にし、可能ならアサーションの暗号化も行う。
  • Audience、Recipient、NotBefore / NotOnOrAfter、InResponseTo を検証。
  • アサーション ID を記録してリプレイを防止。
  • XML パーサーで XXE(外部エンティティ)を無効化。
  • 署名検証済みの要素だけを参照する(Signature Wrapping 対策)。
  • IdP 証明書の期限切れ・ローテーション運用を事前に設計する。

8. 組み合わせ方のパターン

  • SAML で社内ログイン → OAuth でAPI保護 IdP ブローカーが SAML アサーションを受け取り、アプリ/API向けに OIDC・OAuth トークンを発行する構成。レガシーIdPを残しつつ、アプリ側はモダンに作れる。
  • OIDC でログイン → 同じ認可サーバーが API 用アクセストークンを発行 最も一般的でシンプルな構成。
  • フェデレーション(IdP ブローカー)を中心に置く アプリは常に OIDC だけを話し、顧客ごとの SAML / OIDC の差分はブローカーで吸収する。B2B SaaS で特に有効。

9. まとめ

  1. 新規開発のログインは OIDC(Authorization Code + PKCE)。
  2. API の保護・委譲は OAuth 2.0。アクセストークンと ID トークンの役割を混同しない。
  3. SAML は「相手が要求するから使う」もの。エンタープライズ連携では依然として必要だが、新規設計の第一候補にはしない。
  4. Implicit / ROPC は使わない。
  5. プロトコル実装は自作せず、実績あるライブラリや IdP を使う。

参考仕様

  • RFC 6749 — The OAuth 2.0 Authorization Framework
  • RFC 7636 — PKCE
  • RFC 9700 — OAuth 2.0 Security Best Current Practice
  • RFC 8628 — OAuth 2.0 Device Authorization Grant
  • RFC 9449 — DPoP
  • RFC 8705 — OAuth 2.0 Mutual-TLS
  • OAuth 2.1(IETF ドラフト)
  • OpenID Connect Core 1.0
  • OASIS SAML 2.0 Core / Bindings / Profiles

0件のページ