まず、同時に変わった二つを切り分ける。ネットワーク経路とブラウザによる適用だ。VPNは出口アドレスを変えるが、ページのオリジンは変えない。オリジンはスキーム、ホスト、ポートから成る。要求が今成功するなら、応答のどこかが変わったか、要求自体が変わった。どちらなのかを突き止めることが調査のすべてだ。

CORSはブラウザが適用するヘッダーのプロトコルであり、ネットワーク経路上の何ものもそれを無効化できない。

オリジンはIPアドレスではない

オリジンはスキーム、ホスト、ポートである。パケットが出ていくアドレスでも、サーバーが見るIPでもない。だからVPNは観測できるあらゆるアドレスを変えても、オリジンは同一のままだ。ブラウザは応答のAccess-Control-Allow-Originをページのオリジンと比較し、出口アドレスはその比較に決して入らない。

したがって、CORSエラーを直しているように見える拡張機能やプロキシは別のことをしている。ヘッダーを書き換えるか、要求をクロスオリジンでなくなるよう経路を変えている。どちらもVPNの性質ではない。

ブラウザが実際に送るもの

単純でないクロスオリジン要求では、ブラウザはまずプリフライトOPTIONSを送り、意図するメソッドとヘッダーを運ぶ。サーバーは許可する権限で応答しなければならず、その応答が規則を満たす場合にだけ本要求が続く。VPNは両方のやり取りを運ぶ経路を変え、中間サービスの応答を変えうる。しかしオリジン文字列やプリフライトの要件は変えない。

コマンドラインのクライアントは通常それを何も表示しない。Originヘッダーを送らないこともあり、プリフライトをしばしば省略し、異なる資格情報を運ぶこともある。curlに返された本文は、サーバーがcurlに答えたことの証明にすぎない。

変わった応答を見つける

ステータスコードだけでなく、各経路を通した実際の応答を比較する。CORSの許可を運ぶヘッダー、コンテンツタイプ、あらゆるリダイレクト、そしてWAFやCDNの変種が別のページを生成したかを見る。地域的な拒否、認証リダイレクト、許可ヘッダーのないエラーページは、どれもブラウザでは失敗するがCORSの不具合に見える。それは配信経路の違いであり、文書化すべきものだ。

両方の経路の応答ヘッダーを取得し、行ごとに比較する。唯一の違いが、あるエラーページでAccess-Control-Allow-Originが欠けていることなら、原因を見つけたことになる。

適用ではなくサービスを直す

サービスが自分のものなら、許可するオリジンと要求の機能を明示し、そのフロントエンドと中間業者が生むエラーを読む。そうしないなら、サービスの所有者に無害化した比較を送る。その報告にCookie、認証ヘッダー、セッションのエクスポートを含めてはならない。ポリシーはそれらの資格情報を守るために存在する。

CORSを無効化するブラウザ拡張機能は避ける。それはセキュリティ境界を変えながら、説明すべき応答の違いを隠し、他のすべての利用者に同じ失敗を残す。

両方の応答、使ったオリジン、たどった経路を記録する。その記録がVPNのうわさをサービスの不具合に変える。

関連記事