プレフライトリクエストとは何ですか?CORS OPTIONSチェックの説明

プレフライトリクエストとは何ですか?CORS OPTIONSチェックの説明

Scrapeless Universal Scraping APIは許可された公開Webコンテンツを取得し、プレフライトリクエストが実際のレスポンスで観察される必要があるときにJavaScriptをレンダリングできます。

要約

  • プレフライトリクエストには1つの明確なプロトコルの役割があります。 プレフライトリクエストは、自動的なCORSチェックであり、ブラウザが特定のクロスオリジンリクエストの前にOPTIONSリクエストを送信します。
  • プレフライトリクエストは正しいレイヤーで読む必要があります。 トランスポート、表現、ブラウザポリシー、およびアプリケーション認証は別々の懸念事項です。
  • 仲介者はアプリケーションが観察する内容を変更できる。 ゲートウェイ、キャッシュ、ブラウザのデフォルト、およびクライアントライブラリは、ソースバイトと解析されたデータの間に処理を追加できます。
  • バリデーションにはコンテンツの証拠が必要です。 ステータスまたはフィールドだけでは、期待される公開表現が到着したことを証明できません。
  • セキュリティはスコープとバリデーションに依存します。 プロトコルの構文は、リソースにアクセスする許可や、呼び出し元提供の値を信頼することを決して付与しません。

プレフライトリクエストとは何ですか?

プレフライトリクエストは、自動的なCORSチェックであり、ブラウザが特定のクロスオリジンリクエストの前にOPTIONSリクエストを送信します。プレフライトは、呼び出し元のオリジン、意図されたメソッド、および非安全リストのリクエストフィールド名を特定します。サーバーのレスポンスは、ブラウザに実際のリクエストを送信できるかどうかを知らせます。プレフライトは意図されたアプリケーション操作を実行しません。

便利な定義には、メカニズムとその境界の両方が含まれます。プレフライトリクエストは交換の特定の部分に影響を与えますが、隣接する責任はHTTP、ブラウザ、選択されたトランスポート、アプリケーション、またはサーバーのデータモデルに残っています。これらのレイヤーを分離することで、エラーレポートを再現可能にし、構成変更がアクセス制御の決定と誤解されるのを防ぎます。

API開発者にとって、最初の質問は、誰が値や動作を作成するかです。次の質問は、誰がそれを解釈するかです。最後の質問は、解釈が機能したことを証明する観察可能な結果は何かです。その3つの答えが用語集の用語をテスト可能なインターフェイス契約に変えます。

実際のリクエストの前のOPTIONSチェック

ブラウザは、そのメソッド、作成者が制御するフィールド、およびコンテンツタイプに基づいてクロスオリジンのフェッチを分類します。リクエストがCORS安全リストの形から外れると、ブラウザはアプリケーションメソッドを直ちに送信するのではなく、ターゲットURLにOPTIONSリクエストを作成します。

オリジンは呼び出しページを識別します。Access-Control-Request-Methodは計画されたメソッドの名前を指定し、Access-Control-Request-Headersは関連する非安全リストフィールド名をリストします。プレフライトは実際のリクエストボディを運搬せず、通常のFetchルールではCORSプレフライトリクエストは資格情報を除外すると述べています。

サーバーまたはゲートウェイは、計画された交換をカバーするメソッドとフィールドの権限を持つAccess-Control-Allow-Originを返します。また、ブラウザが実装の制限内で成功したプレフライト結果をキャッシュできるようにAccess-Control-Max-Ageを返すこともできます。

ポリシーが一致した後にのみ、ブラウザは実際のリクエストを送信します。その2番目のレスポンスも適切なCORS権限を持っている必要があります。OPTIONSを通過させるが、実際のレスポンスのフィールドを省略すると、ブラウザに見える失敗が発生します。

プレフライトペアの読み取り

以下の用語は、しばしば1つのラベルにまとめられるコンポーネントを分離します。それらをネットワークトレースの装飾ではなく、参加者間のインターフェイスとして読む。

OPTIONS

ポリシーチェックに使用されるHTTPメソッドであり、ページが呼び出そうとするビジネスメソッドではありません。

オリジン

クロスオリジンアクセスを要求しているページのオリジン。

Access-Control-Request-Method

後のリクエストのために計画された実際のメソッド。

Access-Control-Request-Headers

後のリクエストのために計画された非安全リストの著者リクエストフィールド名。

Access-Control-Allow-Methods

そのオリジンおよびリソースコンテキストのためにサーバーが承認したメソッド。

Access-Control-Max-Age

成功したプレフライト権限をキャッシュするための期間であり、ブラウザの制限およびキャッシュルールに従います。

Webデータ収集におけるプレフライトリクエストの重要性

プレフライトリクエストは、どのバイトが到着するか、そのバイトがどのように解釈されるか、またはブラウザコードが結果を観察できるかを変更できます。コレクションワークフローは、ツールを変更する前にその効果を特定する必要があります。要求されたURL、最終URL、レスポンスステータス、表現タイプ、関連するプロトコルフィールド、および1つの期待されるコンテンツマーカーを記録してください。そのコンパクトな記録は、正しいページをアクセスメッセージ、同意画面、リダイレクトターゲット、空のアプリケーションシェル、または互換性のないエンコーディングから区別します。

直接HTTPは、必要なデータがオープンサーバーレンダリングされたレスポンスに存在する場合の最もシンプルな取得パスです。承認されたコンテンツがJavaScript実行、ブラウザ管理の状態、ナビゲーション、またはブラウザセキュリティポリシーに依存する場合、ブラウザは重要です。2つのパスは同一に見えるように強制されるべきではありません:ブラウザはプラットフォームのルールに従ってクッキー、圧縮、リダイレクト、CORS、およびストレージを管理しますが、直接クライアントは異なるデフォルトのセットをさらけ出します。

セッションの連続性は、1つのレスポンスが次のリクエストの状態を確立するたびに重要です。1つの限定されたクライアントコンテキスト内に認可されたシーケンスを保持し、必要なロケールとネットワークオリジンを保持し、無関係なジョブからの状態を混合しないようにしてください。プロキシはネットワークオリジンを変更しますが、ヘッダーを再現したり、表現をデコードしたり、スクリプトを実行したり、制限されたコンテンツへのアクセスを許可することはありません。

表現のバリデーションの後のみ解析が始まります。フィールドを抽出する前に、最終ホスト、利用可能な場合の正準アイデンティティ、メディアタイプ、デコード状態、および必要なビジネスマーカーを確認します。この順序は、パーサーがエラードキュメントを技術的に成功したように見える空のレコードに変換するのを防ぎます。

仲介者は明示的な注目に値します。コンテンツ配信ネットワークはエンコードされたバリアントを選択し、ゲートウェイはOPTIONSに応答し、キャッシュは交渉された応答を再利用し、アプリケーションサーバーはクッキーや認証フィールドを設定できます。アプリケーションコードと最終ページ出力のみを比較することは、決定を行った可能性のあるレイヤーをスキップします。

Scrapeless Universal Scraping APIは、チームが許可された公開コンテンツを管理された取得する必要があるときに関連します。取得契約は、目標、許可されるフィールド、期待される表現、受け入れマーカー、停止条件を定義する必要があります。製品の機能は、ソース条件、プライバシーレビュー、またはアプリケーションレベルの検証を置き換えることはありません。

プレフライトを引き起こすリクエスト

プレフライトリクエストは、具体的な製品の動作、互換性要件、または診断の決定を変更するときにアーキテクチャの中で位置を占めます。これらのユースケースは、最初に仕事を説明し、次にプロトコル機能を説明します。

JSON書き込み

application/jsonを使用したクロスオリジンのPOSTは、通常はホワイトリストされたリクエスト形状の外にあります。

カスタム認証フィールド

ホワイトリストにない作者制御のフィールドは、最初にブラウザに許可を求めさせます。

PUTまたはDELETE

ホワイトリストにないセットのメソッドは、一般的にOPTIONSチェックを必要とします。

カスタムトレーシングフィールド

ページ追加のリクエストIDフィールドは、直接リクエストをプレフライト交換に変更できます。

アップロードAPI

選択したメソッドとメディアタイプは、別のポリシーチェックが発生するかどうかを決定します。

マルチオリジンコンソール

一つのオリジンの管理フロントエンドが異なるAPIオリジンへのプレフライトコールを行える可能性があります。

プレフライト済みおよびCORSホワイトリストに登録されたリクエスト

プレフライトリクエストはHTTPの一つのレイヤーに属し、隣接するレイヤーと混同すべきではありません。健全な実装は、どのコンポーネントが値を選択するか、どのコンポーネントがそれを変更できるか、そして最終的な表現が正しいことを証明する証拠を特定します。

次元プレフライトリクエスト関連概念または代替
メソッドPUT、DELETE、または他のメソッドを含む可能性がありますホワイトリスト規則内のGET、HEAD、またはPOST
作者フィールドホワイトリストにないフィールドを含むホワイトリストにある作者フィールドのみ
コンテンツタイプ通常はapplication/jsonまたは他のホワイトリスト外のタイプパラメータ制限付きのホワイトリストメディアタイプ
ブラウザステップOPTIONSチェックは実際のリクエストに先立って行われます実際のリクエストは直接送信できます
サーバーセキュリティ認証と認可はまだ必要です認証と認可はまだ必要です

比較はレイヤー境界を保持する限りのみ有用です。二つのメカニズムは一つのリクエストに共存する可能性があり、一方を置き換えることは自動的に他方を置き換えるわけではありません。入力、観測可能な出力、故障状態、所有権に関して選択された動作を文書化します。

なぜプレフライト処理が壊れるのか

  • OPTIONSを処理しない場所にルーティングすること。 ゲートウェイとフレームワークは、アプリケーションのCORSロジックが実行される前に一般的なエラーを返すことができます。
  • メソッドは許可するがフィールドは許可しない。 計画されたメソッドと要求されたすべての非ホワイトリストフィールドはカバーされなければなりません。
  • OPTIONSで通常の資格情報を必要とする。 プレフライト動作には通常のリクエスト資格情報が含まれません。
  • 実際の応答を忘れる。 両方の許可チェックと後の応答には、適用可能なオリジンポリシーが必要です。
  • サーバーアプリケーションのログのみをデバッグします。 CDN、プロキシ、またはWebサーバーは、アプリケーションがそれを見る前にOPTIONSに応答するかもしれません。
  • 必要なリクエストフィールドを無効にすること。 プレフライトを避けるためにセキュリティまたはコンテンツフィールドを削除すると、API契約が損なわれる可能性があります。

ほとんどの失敗は、ライブラリやブラウザが自動的に行ったことに関する仮定を取り除いた後の方が診断しやすくなります。最小限のトレースをキャプチャし、秘密を削除し、制御された変数を一度に1つ変更します。目標は、返された表現の安定した説明であり、無関係なヘッダーの調整のコレクションではありません。

プレフライト失敗チェックリスト

このシーケンスは、ローンチ前の設計レビューとして、また、動作変更後の製品診断として機能します。それは、プロトコルの証拠をアプリケーションの結果に接続されたままに保ちます。

  1. ページのオリジン、ターゲットオリジン、計画されたメソッド、コンテンツタイプ、および著者制御フィールドを特定します。
  2. OPTIONSエクスチェンジを開き、アプリケーションがそれを処理したと仮定することなく、そのステータスと応答フィールドを読みます。
  3. Access-Control-Allow-Originを資格情報ルールの下でリクエストのオリジンに一致させます。
  4. Access-Control-Allow-Methodsに計画されたメソッドが含まれていることを確認します。
  5. Access-Control-Allow-Headersが要求されたすべての非安全リストフィールド名をカバーしていることを確認します。
  6. CORSフィールドを省略する応答について、リダイレクト、プロキシ、およびエラーハンドラをチェックします。
  7. OPTIONSが通過した後、実際のリクエストと応答を別のエクスチェンジとして検査します。

レビューを終えるために、少し受け入れられたサンプルと、同じ削除ルールで拒否されたサンプルを保存します。今後の変更は、記憶やスクリーンショットだけでなく、既知のページアイデンティティ、期待されるフィールド、およびデコードされたコンテンツに対して比較することができます。

プレフライトリクエストのセキュリティと可観測性

プレフライトリクエストは、ブラウザ、ゲートウェイ、キャッシュ、およびオリジンサーバーを横断する可能性のあるリクエストパスに参加します。各ホップは理解できる値のみを受け入れ、生存すべきフィールドを保持し、ログに資格情報や個人データをコピーするのを避けるべきです。プロトコル構文は認可ではありません。

運用記録は、要求されたURL、最終URL、ステータス、表現タイプ、関連するフィールド名、および制約されたコンテンツマーカーをキャプチャする必要があります。フルボディおよび資格情報の値は、ルーチン診断にはほとんど必要なく、無駄な保持リスクを生む可能性があります。

ブラウザの動作と直接HTTPの動作は異なるテストサーフェスです。CORS、クッキーのストレージ、自動解凍、およびリダイレクト処理は、アプリケーションコードが結果を見る前にブラウザまたはライブラリによって実行される可能性があります。キャプチャを比較する際には、クライアントとそのデフォルトを記録します。

プレフライトリクエストを定義する標準

フェッチ標準のプレフライトアルゴリズム ブラウザのポリシーチェックを定義します。この一次情報源は、この文書で使用される語彙と境界を修正しますが、実装の動作は選択されたクライアントおよび展開で観察される必要があります。

MDNのプレフライトリクエスト用語集 OPTIONSリクエストフィールドを示します。この一次情報源は、この文書で使用される語彙と境界を修正しますが、実装の動作は選択されたクライアントおよび展開で観察される必要があります。

MDNのCORSガイド プレフライトと資格情報の制約を説明します。この一次情報源は、この文書で使用される語彙と境界を修正しますが、実装の動作は選択されたクライアントおよび展開で観察される必要があります。

HTTP OPTIONSセマンティクス 基盤となるHTTPメソッドを定義します。この一次情報源は、この文書で使用される語彙と境界を修正しますが、実装の動作は選択されたクライアントおよび展開で観察される必要があります。

プレフライトデバッグルール

プレフライトと実際のリクエストを二つの別々のHTTPエクスチェンジとして扱い、それぞれの応答を生成したレイヤーでオリジン、メソッド、フィールド、資格情報、ゲートウェイ、および最終応答の動作を検証します。

そのルールを受け入れテストに組み込みます。どの参加者が信号を送信するか、どの参加者がそれを解釈するか、どの仲介者がパスを変更できるか、そしてどのコンテンツマーカーが成功を証明するかを明示します。これにより、プレフライトリクエストが失敗後に付けられたラベルではなく、観測可能なシステムの一部となります。

パブリックWeb応答を検証する準備はできましたか?

Scrapeless Universal Scraping APIを使用して承認された公開コンテンツを取得し、このガイドで説明されている表現契約をチェックします。

今日サインアップして、 $5の無料クレジットを取得クレジットカード不要.

$5のクレジットを請求する →

FAQ

開発者はプレフライトリクエストを手動で送信しますか?

通常はいいえ。ブラウザは計画されたクロスオリジンリクエストが必要とする場合に自動的にCORSプレフライトを作成して送信します。手動OPTIONS呼び出しは診断にのみ役立ち、すべてのブラウザの決定を再現するわけではありません。

プレフライトリクエストは実際のAPIリクエストと同じですか?

いいえ。プレフライトはOPTIONSの許可チェックです。実際のメソッドとボディは、ブラウザがポリシー応答を受け入れた後にのみ送信されます。

なぜapplication/jsonがプレフライトをトリガーするのですか?

ページ作成のクロスオリジンリクエストがapplication/jsonを使用する場合、CORS安全リストに載っているコンテンツタイプの形状に合わないため、ブラウザは送信する前に許可を確認することが一般的です。

プレフライト結果はキャッシュできますか?

はい。成功した応答にはAccess-Control-Max-Ageを含むことができ、ブラウザはその許可を自身の制限内でキャッシュすることができます。キャッシュは通常のHTTPレスポンスキャッシュとは別です。

OPTIONSエンドポイントにログインが必要ですか?

CORSプレフライトはフェッチルールの下で通常のリクエスト資格情報を含みません。エンドポイントはポリシーチェックに応答する必要がありますが、実際の操作は認証と認可を維持します。

参考文献