• 診断項目 No.127/127
  • 認証・アクセス制御
  • 重大度 重要(high)

OAuth/OIDCの非推奨フロー兆候とは?Implicit flow・ROPCのリスクと移行方法・診断基準

OAuth/OIDCの非推奨フロー兆候を解説。response_type=tokenのImplicit flowとgrant_type=passwordのROPCが非推奨の理由、RFC 9700の規定、Authorization Code+PKCEへの移行手順と診断基準を解説。

結論(OAuth/OIDCの非推奨フロー兆候)

OAuth/OIDCの非推奨フロー兆候とは、ページのHTMLやURLに、非推奨のフローを示すパラメータが含まれていることです。対象は、アクセストークンを認可応答で直接受け取るImplicit flow(response_type=token など)や、利用者のパスワードをクライアントが扱うResource Owner Password Credentials flow(grant_type=password)です。RFC 9700とOWASP ASVS 5.0.0 V10.4.4はこれらを使わないよう求めており、Authorization Code+PKCEへの移行が推奨されます。

この記事のポイント

  • Implicit flowはトークンがURLフラグメントに入り、履歴・Referer・オープンリダイレクト経由で漏れやすい方式です。
  • RFC 9700(2025年1月発行)は、ImplicitをSHOULD NOT、ROPCをMUST NOTとしています。
  • response_type=id_token単独はアクセストークンを返さないため、非推奨フローとして扱いません。
  • セキュリティAIチェッカーは文字列の兆候を検出し、文書・未使用コードの可能性もあるため×ではなく△と判定します。
  • 移行は認可サーバーで旧グラントを無効化し、Authorization Code+PKCE(S256)に切り替えます。
診断項目名OAuth/OIDCの非推奨フロー兆候
項目IDoauth.legacy-flow-signal
分類認証・アクセス制御
重大度・配点の重み重要(high) 重み 3
関連する標準・ガイドラインOWASP ASVS 5.0.0 V10.4.4(L1:クライアントに必要なグラントだけを許可し、token(Implicit flow)と password(Resource Owner Password Credentials flow)は使わない)、V10.6.1(L2:OpenID Providerが許可するレスポンス種別を code、ciba、id_token、id_token code に限り、token を含むImplicit flowは使わない)、V10.2.1(L2:コードフローではPKCEまたはstateでCSRFを防ぐ)、RFC 9700(OAuth 2.0 Security Best Current Practice)§2.1.2・§2.4、CWE-522

OAuth/OIDCの非推奨フロー兆候とは

OAuth/OIDCの非推奨フロー兆候とは、Webページのソースやリンク先URLの中に、OAuth 2.0/OpenID Connectで現在は使うべきでないとされたフローを示すパラメータが含まれていることです。具体的には次の2つです。

フロー兆候となるパラメータ内容
Implicit flowresponse_type の値に token を含む(token、id_token token、code token など)アクセストークンを認可応答(ブラウザのリダイレクトURL)で直接受け取る
Resource Owner Password Credentials(ROPC)grant_type=password利用者のIDとパスワードをクライアントが直接扱う

セキュリティAIチェッカーのこの項目は、巡回したページのHTMLとURLの中にこれらのパラメータがないかを確認します。HTMLやURLに文字列があることは、そのフローが実際に使われていることの「兆候」にすぎず、文書や使われていないコードの可能性もあります。そのため検出時は×(fail)ではなく△(warn)とし、実際の構成確認を促します。

Implicit flowとROPCはなぜ非推奨になったのか

Implicit flow(response_type=token)

シングルページアプリ向けに、認可サーバーがアクセストークンをリダイレクトURLのフラグメント(#access_token=...)に入れて直接返す方式です。トークンがブラウザ履歴、Referer、ブラウザ拡張、オープンリダイレクトなどを経由して漏れやすく、送信者制約(トークンを特定のクライアントに結び付ける仕組み)も掛けられません。

RFC 9700(2025年1月発行のOAuth 2.0セキュリティBCP)§2.1.2は、クライアントはImplicit grant(response type token)や、認可応答でアクセストークンを発行する他のレスポンス種別を使うべきではなく(SHOULD NOT)、代わりに code などを使うべきだとしています。token id_token や code token のように token を含む組み合わせも同じ扱いです。

Resource Owner Password Credentials(grant_type=password)

クライアントアプリが利用者のIDとパスワードを受け取り、そのままトークンエンドポイントへ送る方式です。パスワードをクライアントに渡すことになり、多要素認証や複数段階の認証は想定されておらず、WebAuthnなどの暗号学的な認証は実装できない場合があります。RFC 9700 §2.4は「使ってはならない(MUST NOT)」と明記しています。

標準・仕様の位置付け

出典内容
RFC 9700 §2.1.2Implicit grantや認可応答でアクセストークンを発行するレスポンス種別は使うべきではない(SHOULD NOT)
RFC 9700 §2.4ROPCは使ってはならない(MUST NOT)
OWASP ASVS 5.0.0 V10.4.4(L1)クライアントに必要なグラントだけを許可し、token(Implicit flow)と password(ROPC)は使わない
OWASP ASVS 5.0.0 V10.6.1(L2)OpenID Providerが許可するレスポンス種別を code、ciba、id_token、id_token code に限り、token を含むImplicit flowは使わない
OWASP ASVS 5.0.0 V10.2.1(L2)コードフローではPKCEまたはstateでCSRFを防ぐ
OAuth 2.1(draft-ietf-oauth-v2-1)RFC 6749の後継として策定中。この2つを仕様から削除し、Authorization CodeでのPKCEを必須としている(2026年10月時点ではInternet-DraftでRFC未発行)
CWE-522不十分に保護された資格情報

推奨されるフロー

  • Authorization Code + PKCE:認可コードをリダイレクトで受け取り、トークンはバックチャネル(トークンエンドポイント)で取得します。PKCE(code_challenge/code_verifier)で認可コードの横取りを防ぎます。SPAやスマートフォンアプリでも使えます。
  • BFF(Backend for Frontend):トークンをサーバー側で保持し、ブラウザにはHttpOnly Cookieのセッションだけを渡す構成は、SPAでトークン漏えいを避ける有力な方法です。

response_type=id_token 単独は非推奨フローではない

OpenID Connectの response_type=id_token は、本人確認用のIDトークンだけを返し、アクセストークンは発行しません。ASVS V10.6.1は、OpenID Providerが許可してよい値として id_token を明示的に含めており、RFC 9700 §2.1.2の対象も「アクセストークンを認可応答で発行する」レスポンス種別です。このため本診断は id_token 単独を非推奨フローとして扱いません(ただしnonce検証などOIDCの要件を満たすことは前提です)。

OAuthのフローについてよくある誤解

  • 「SPAだからImplicitしか使えない」:現在はブラウザのCORS対応によりSPAでもAuthorization Code + PKCEが使えます。主要なIDaaSのSDKも既定でPKCEを使います。
  • 「自社アプリだからROPCで問題ない」:パスワードを扱う経路が増えるだけでなく、多要素認証の導入時に作り直しが必要になります。

OAuth/OIDCの非推奨フロー兆候の診断基準(セキュリティAIチェッカー)

取得方法

  1. トップページのHTML全文(最大2MB)と、追加取得した下層ページ(最大2件、1ページあたり最大180KB)の本文。
  2. 抽出した同一オリジンのURL一覧(リンク、フォーム送信先、JavaScript内のURL、巡回候補)。
  3. これらを連結したテキストに対して文字列パターンを照合します。追加のネットワーク取得は行いません。

非推奨フローの検出条件

兆候検出条件
Implicit系response_type(URLエンコードされた response%5Ftype を含む)の後に =・%3D・: が続き、その値(+、%20、%2B、空白で区切られた最大3語)に token という語が含まれる。例:response_type=token、response_type=id_token+token、"response_type": "code token"
ROPCgrant_type(grant%5Ftype を含む)の後に =・%3D・: が続き、値が password(直後が &・%26・空白・引用符・<・,・}・文末のいずれか。password_reset のような別の値は対象外)

判定条件

判定条件得点への影響
○ 問題なし(pass)どちらの兆候もない重み3 × 1.00
△ 要確認(warn)いずれかの兆候がある重み3 × 0.45
対象外(na)なし(HTMLは常に取得済みのため判定可能)—
  • response_type=code、code id_token(OIDC Hybrid)、id_token 単独はpassです。
  • access_token や id_token_hint のような別名のパラメータは、response_type の値ではないため対象になりません。
  • failにしない理由:文字列の存在だけでは、実際にそのフローで認可サーバーが応答するか、OAuthの解説文書か、使われていないSDKのコードかを区別できないためです。warnの場合は、どのページ・どのスクリプトに含まれていたかを確認してください。
  • 外部ドメインにある認可サーバー側の設定(許可グラントの制限)は確認できません。
  • redirect_uri を悪用したオープンリダイレクトは「外部URLパラメータへのオープンリダイレクト」で確認します。

自治体サイトでの判定例

状況判定
大多数の自治体CMSサイトはOAuthを使わない○
電子申請システムのログインボタンが https://idp.example/authorize?response_type=token&client_id=... へのリンク△
職員向けポータルのJavaScriptに grant_type: "password" を含むログイン処理がある△
外部IDaaSによる「マイナンバーカードでログイン」が response_type=code と code_challenge を使用○

非推奨フローを使い続けるとどんなリスクがあるか

  • アクセストークンの漏えい:Implicit flowでは、URLフラグメントに入ったトークンがブラウザ履歴や、リダイレクト先ページのスクリプト、オープンリダイレクトを経由して攻撃者に渡ることがあります。漏れたトークンは、利用者になりすましてAPIを呼ぶのに使われます。
  • トークン差し替え:Implicit flowではクライアントがトークンの発行先を確実に検証しにくく、別クライアント向けのトークンを受け入れてしまう問題が知られています。
  • パスワードの集中と流出:ROPCではクライアントが利用者のパスワードを直接扱うため、クライアントの脆弱性やログからパスワードが流出し、パスワード使い回しによる他サービスへの被害にもつながります。
  • 多要素認証の不在:ROPCはパスワードだけで完結する前提のため、多要素認証やフィッシング耐性のある認証を組み込みにくく、パスワードリスト攻撃に弱くなります。

Authorization Code+PKCEへの移行方法(Keycloak・JavaScript・サーバー側)

移行の方針

手順内容
1認可サーバー(IDaaS、Keycloak、Azure AD/Entra ID等)のクライアント設定で、Implicitグラントと Password グラントを無効化します
2クライアントを Authorization Code + PKCE に変更します(code_challenge_method=S256)
3SPAでは、可能ならBFF構成にして、トークンをブラウザに置かない設計を検討します
4移行後、旧フローのコード・設定・文書を削除します

認可リクエストの例(Authorization Code + PKCE)

GET /authorize?response_type=code
  &client_id=example-client
  &redirect_uri=https%3A%2F%2Fwww.example.lg.jp%2Fcallback
  &scope=openid%20profile
  &state=ランダム値
  &nonce=ランダム値
  &code_challenge=BASE64URL(SHA256(code_verifier))
  &code_challenge_method=S256

Keycloakの設定例

クライアント設定で「Implicit flow」と「Direct access grants」(ROPCに相当)を無効にし、「Standard flow」のみを有効にします。PKCEは「Proof Key for Code Exchange Code Challenge Method」を S256 にします。

JavaScript(oidc-client-ts の例)

import { UserManager } from "oidc-client-ts";

const userManager = new UserManager({
  authority: "https://idp.example.lg.jp/realms/city",
  client_id: "city-portal",
  redirect_uri: "https://www.example.lg.jp/callback",
  response_type: "code",      // token / id_token token は使わない
  scope: "openid profile",
});

サーバー側のROPC廃止

// 悪い例:利用者のパスワードを受け取りトークンを取得
// body: new URLSearchParams({ grant_type: "password", username, password })

// 良い例:認可コードとcode_verifierでトークンを取得
const body = new URLSearchParams({
  grant_type: "authorization_code",
  code,
  redirect_uri: "https://www.example.lg.jp/callback",
  client_id: "city-portal",
  code_verifier,
});

移行後の確認方法

# 公開ページに非推奨フローの兆候が残っていないか
curl -s https://www.example.lg.jp/ | grep -ioE 'response_type["'"'"']?\s*[:=]\s*["'"'"']?[a-z_+ ]+|grant_type["'"'"']?\s*[:=]\s*["'"'"']?password'

# 認可サーバーがImplicitを拒否するか(unsupported_response_type等のエラーが期待値)
curl -s -o /dev/null -D - 'https://idp.example.lg.jp/authorize?response_type=token&client_id=city-portal&redirect_uri=https%3A%2F%2Fwww.example.lg.jp%2Fcallback' | grep -i '^location'

ログインを壊さないための注意点

  • 認可サーバー側でImplicitを止める前に、そのクライアントを使う全アプリが移行済みであることを確認してください。先に止めるとログインできなくなります。
  • redirect_uri は認可サーバーで完全一致登録にします(ASVS V10.4.1)。部分一致を許すと、オープンリダイレクトと組み合わせた認可コード窃取の原因になります。
  • warnの原因が解説記事やサンプルコードの場合は、公開ページから削除するか、実運用で使っていないことを記録しておくと、次回診断時の説明が容易になります。

よくある質問(FAQ)

SPA(シングルページアプリ)ではImplicit flowしか使えないのでは?

現在はブラウザのCORS対応により、SPAでもAuthorization Code+PKCEが使えます。主要なIDaaSのSDKも既定でPKCEを使います。トークンをブラウザに置かないBFF構成も有力な方法です。

自社アプリならROPC(grant_type=password)を使っても問題ありませんか?

問題があります。パスワードを扱う経路が増えるだけでなく、ROPCは多要素認証を想定しておらずWebAuthnなどは実装できない場合があるため、それらの導入時に作り直しが必要になります。RFC 9700 §2.4はROPCを「使ってはならない(MUST NOT)」と明記しています。

response_type=id_token も非推奨フローとして△になりますか?

なりません。id_token単独はアクセストークンを発行せず、ASVS V10.6.1もOpenID Providerが許可してよい値として明示しています。code、code id_token(OIDC Hybrid)も○です。ただしnonce検証などOIDCの要件を満たすことは前提です。

OAuth/OIDCの非推奨フロー兆候は、なぜ×ではなく△なのですか?

文字列の存在だけでは、実際にそのフローで認可サーバーが応答するのか、OAuthの解説文書か、使われていないSDKのコードかを区別できないためです。△の場合は、どのページ・どのスクリプトに含まれていたかを確認してください。

OAuth 2.1ではImplicit flowとROPCはどうなっていますか?

RFC 6749の後継として策定中のOAuth 2.1(draft-ietf-oauth-v2-1)は、この2つを仕様から削除し、Authorization CodeでのPKCEを必須としています。2026年10月時点ではInternet-DraftでRFCは未発行です。

認可サーバーでImplicitを無効にする順番に注意はありますか?

あります。認可サーバー側で止める前に、そのクライアントを使う全アプリがAuthorization Code+PKCEへ移行済みであることを確認してください。先に止めるとログインできなくなります。

セキュリティAIチェッカーを利用する

この項目を含む127項目を、URLを入れるだけで無料診断します。

参考資料