Brotliとは?ウェブ上でのbr圧縮の仕組み
Scrapeless Universal Scraping APIは、許可された公開ウェブコンテンツを取得し、Brotliが実際のレスポンスにおいて観察されるべきときにJavaScriptをレンダリングできます。
TL;DR
- Brotliは一つの正確なプロトコルの役割を持っています。 BrotliはLZ77スタイルのバックリファレンス、ハフマンコーディング、そして一般的なデータパターンを効率的に表現するために設計された事前定義された辞書を組み合わせたロスレス圧縮データ形式です。
- Brotliは正しいレイヤーで読み取られなければなりません。 トランスポート、表現、ブラウザポリシー、アプリケーションの認可はそれぞれ別の懸念事項です。
- 仲介者はアプリケーションが観察する内容を変更することがあります。 ゲートウェイ、キャッシュ、ブラウザのデフォルト、およびクライアントライブラリは、ソースバイトと解析されたデータの間で処理を追加することができます。
- 検証にはコンテンツの証拠が必要です。 ステータスやフィールド単体では、期待される公開表現が到着したことを証明することはできません。
- セキュリティはスコープと検証に依存します。 プロトコルの構文は、リソースへのアクセスを許可したり、呼び出し元が提供した値を信頼したりする権限を与えることはありません。
Brotliとは?
BrotliはLZ77スタイルのバックリファレンス、ハフマンコーディング、および一般的なデータパターンを効率的に表現するために設計された事前定義された辞書を組み合わせたロスレス圧縮データ形式です。HTTPでは、brコンテンツコーディングトークンによって識別されます。クライアントはAccept-Encodingでbrを広告し、それを選択したサーバーはContent-Encoding: brを返します。
有用な定義にはメカニズムとその境界の両方が含まれます。Brotliは交換の特定の部分に影響を与え、隣接する責任はHTTP、ブラウザ、選択されたトランスポート、アプリケーション、またはサーバーのデータモデルに残ります。それらのレイヤーを分けておくことで、エラーレポートの再現性が高まり、構成変更がアクセス制御の決定と誤認されることを防ぎます。
API開発者にとって、最初の質問は誰が値または動作を生成するのかということです。次の質問は誰がそれを解釈するのかです。最後の質問は、観察可能な結果がその解釈が機能したことをどう証明するのかです。それらの三つの答えは、用語集の項目をテスト可能なインターフェース契約に変えます。
Brotliがどのようにしてbrコンテンツを生成し配信するか
エンコーダは入力をメタブロックに分割し、リテラルバイトと繰り返されるシーケンスへの参照を表します。コンテキストモデリングと接頭辞コードは一般的なパターンのコストを削減し、静的辞書は親しみのある単語やフラグメントをコンパクトに表現できます。デコーディングは元のバイトを再現するためにそれらのコマンドを逆にします。
HTTP交渉は圧縮アルゴリズムとは別です。クライアントはサポートされたコーディングの中にbrを列挙し、サーバーまたはエッジが事前圧縮または動的にエンコードされた変種を選択します。レスポンスは元のContent-Typeを保持し、Content-Encoding: brを追加します。
静的アセットはビルド中に圧縮できるため、リクエスト時の作業は少なくて済みます。動的レスポンスは生成されるときにエンコードできますが、圧縮レベル、レスポンスサイズ、サーバーの能力は測定が必要です。エンコードの遅延がリクエストの予算を支配する場合、小さい表現は役に立ちません。
ブラウザや現代のHTTPライブラリは、しばしば自動的にbrをデコードします。ネットワークパネルはエンコードされた転送サイズを示すことができ、アプリケーションコードはデコードされたテキストを確認できます。生のコレクションツールは、パース前にアイデンティティをリクエストするか、Brotliデコードをサポートする必要があります。
HTTPにおいて重要なBrotliの概念
以下の用語は、しばしば一つのラベルにまとめられるコンポーネントを区別します。ネットワークトレース内の装飾としてではなく、参加者間のインターフェースとして読み取ってください。
br
Brotliエンコードされた表現のために登録されたHTTPコンテンツコーディングトークン。
メタブロック
圧縮、未圧縮、またはメタデータ情報を運ぶBrotliストリーム内の単位。
バックリファレンス
スライディングウィンドウ内で既に表現されたバイトを指す長さと距離のペア。
静的辞書
形式に利用可能な一般的なデータフラグメントと変換の事前定義されたコレクション。
品質設定
圧縮作業と出力サイズの間のエンコーダのトレードオフ;ロスレス性は変わりません。
バリエーション
Accept-Encodingを通じて選択されたbr、gzip、アイデンティティ変種を区別するHTTPキャッシュ信号。
ウェブデータ収集におけるBrotliの重要性
Brotliは、到着するバイト、バイトがどのように解釈されるか、またはブラウザコードが結果を観察できるかどうかを変更することができます。コレクションワークフローは、ツールを変更する前にその効果を特定する必要があります。要求されたURL、最終URL、レスポンスステータス、表現タイプ、関連プロトコルフィールド、および1つの期待されるコンテンツマーカーを記録してください。そのコンパクトな記録が、正しいページをアクセスメッセージ、同意画面、リダイレクト先、空のアプリケーションシェル、または不適合なエンコードから区別します。
直接HTTPは、必要なデータがオープンサーバーでレンダリングされたレスポンスに存在する場合、最も簡単な取得パスです。承認されたコンテンツがJavaScriptの実行、ブラウザ管理の状態、ナビゲーション、またはブラウザのセキュリティポリシーに依存している場合、ブラウザが関係してきます。この2つのパスは自動的に同じように見せるべきではありません:ブラウザはプラットフォームのルールに従ってクッキー、圧縮、リダイレクト、CORS、およびストレージを管理し、直接クライアントは異なるデフォルトセットを公開します。
セッションの継続性は、1つのレスポンスが次のリクエストの状態を確立する際に重要です。1つの境界付きクライアントコンテキスト内に許可されたシーケンスを保持し、必要なロケールとネットワーク起源を保存し、無関係なジョブからの状態を混在させないでください。プロキシはネットワーク起源を変更します;ヘッダーを再現したり、表現をデコードしたり、スクリプトを実行したり、制限されたコンテンツへのアクセスを許可することはありません。
パースは表現の検証後にのみ始まります。フィールドを抽出する前に、最終ホスト、利用可能な場合は正準アイデンティティ、メディアタイプ、デコーディング状態、および必要なビジネスマーカーを確認してください。この順序は、パーサーがエラードキュメントを技術的に成功したように見える空のレコードに変えるのを防ぎます。
仲介者は明示的な注意を受けるに値します。コンテンツ配信ネットワークはエンコードされたバリアントを選択でき、ゲートウェイはOPTIONSに応答でき、キャッシュは交渉された応答を再利用でき、アプリケーションサーバーはクッキーや認証フィールドを設定できます。最終ページ出力とアプリケーションコードのみを比較することは、決定を下したレイヤーをスキップします。
Scrapeless Universal Scraping APIは、チームが許可された公的コンテンツ(JavaScriptでレンダリングされたページを含む)の管理された取得が必要なときに関連します。取得契約は、ターゲット、許可されたフィールド、期待される表現、受領マーカー、および停止条件を定義する必要があります。製品の能力はソースの条件、プライバシーレビュー、またはアプリケーションレベルの検証を置き換えるものではありません。
Brotliが一般的に適用される場所
Brotliは具体的な製品の挙動、互換性要件、または診断決定を変更するときにアーキテクチャに位置を占めます。これらのユースケースは、最初に仕事を説明し、次にプロトコル機能を説明します。
静的JavaScriptバンドル
ビルド時エンコーディングにより、リクエスト時の圧縮作業なしに転送を削減できます。
スタイルシート
繰り返しのセレクタや宣言は、エンコーダに有用なパターンを提供します。
HTML
マークアップや一般的なテキストの断片は、フォーマットの辞書や繰り返しコーディングによって利益を得ることがあります。
JSON
繰り返しのキーや構造化されたテキストは、遅延とCPU予算が許せば適切な入力となります。
SVG
テキストベースのベクトルマークアップは、多くの既に圧縮されたラスター形式とは異なり、よく圧縮されます。
CDNバリアント
エッジはAccept-Encodingからbr、gzip、またはアイデンティティを選択し、各表現を別々にキャッシュできます。
Web配信におけるBrotliとgzip
BrotliはHTTPの一つのレイヤーに属し、隣接するレイヤーと混同すべきではありません。健全な実装は、どのコンポーネントが値を選択するか、どのコンポーネントがそれを変更できるか、及び最終的な表現が正しいことを証明する証拠を特定します。
| 次元 | Brotli | 関連概念または代替 |
|---|---|---|
| HTTPトークン | br | gzip |
| フォーマット基盤 | LZ77、ハフマンコーディング、コンテキストモデリング、静的辞書 | gzipラッパー内のDEFLATE |
| 互換性 | 現代のウェブクライアントで一般的 | 古いおよび現在のクライアント全体で広範囲にわたる |
| プリコモプレッション | 静的テキストアセットに役立つ | 静的テキストアセットに役立つ |
| フォールバック | brが不在の場合、gzipまたはアイデンティティを交渉します | gzipが不在の場合はアイデンティティを使用します |
比較はレイヤーの境界を保持する場合にのみ有用です。2つのメカニズムは1つのリクエスト内で共存することができ、一方を置き換えることは自動的に他方を置き換えるわけではありません。選択された動作を入力、観察可能な出力、失敗状態、所有権の観点から文書化します。
Brotliデプロイメントの誤り
- Content-Encodingなしでbrを提供する。 受信者は圧縮されたバイトを元のメディアタイプとして扱い、解析が失敗します。
- サポートされていないクライアントにbrを送信する。 選択はAccept-Encodingを尊重し、互換性のあるフォールバックを提供する必要があります。
- すべての動的ボディに最大作業を使用する。 より高いエンコーダの労力は、実際のサイズの増加がほとんどない状態で遅延やCPUコストを追加する可能性があります。
- キャッシュの変動を無視する。 クライアントがgzipまたはidentityのみを広告した場合、br応答は再利用されてはいけません。
- 密なバイナリ形式を圧縮する。 すでに圧縮された画像、アーカイブ、およびビデオは、別のコーディングからほとんど得られません。
- すでにデコードされたライブラリ応答をデコードする。 クライアントのデフォルトは、アプリケーションコードからコンテンツコーディングを隠す可能性があるため、生のレイヤーと露出したレイヤーを別々に確認してください。
ほとんどの失敗は、ライブラリまたはブラウザが自動的に行ったことに関する仮定を取り除いた後に診断が容易になります。最小限のトレースをキャプチャし、秘密情報を修正し、一度に1つの制御可能な変数を変更します。目標は、返された表現の安定した説明であり、関連のないヘッダーの調整のコレクションではありません。
Brotliの展開と検証プラン
このシーケンスは、ローンチ前の設計レビューとして、また動作変更後の生産診断として機能します。それは、プロトコルの証拠をアプリケーションの結果に接続されたままにします。
- エンコーダー設定を選択する前に、代表的なHTML、CSS、JavaScript、JSON、およびSVGアセットを測定します。
- 安定したアセットを事前圧縮し、サーバーのレイテンシーとCPUの予算内で動的圧縮設定を維持します。
- Accept-Encodingを通じて交渉し、gzipまたはidentityのフォールバックを保持します。
- Content-Encoding: brを返し、元のContent-Typeを保持します。
- Varyを設定し、CDNキャッシュキーがbr、gzip、およびidentityのバリアントを区別することを確認します。
- 自動デコードの違いを明らかにするために、ブラウザ、最新のHTTPライブラリ、および1つの生クライアントをテストします。
- デコードされたコンテンツを検証し、圧縮されたバイト数だけでなく、エンドツーエンドのレイテンシーを比較します。
レビューを終了するには、小さな受け入れられたサンプルと同じ修正ルールを持つ拒否されたサンプルを保存します。将来の変更は、メモリやスクリーンショットだけではなく、既知のページのID、予期されるフィールド、およびデコードされたコンテンツに対して比較できます。
Brotliのセキュリティと可観測性
Brotliは、ブラウザ、ゲートウェイ、キャッシュ、およびオリジンサーバーを越える可能性のあるリクエストパスに参加します。各ホップは、理解できる値のみを受け入れ、サバイバルすべきフィールドを保持し、認証情報や個人データをログにコピーするのを避けるべきです。プロトコルの構文は認可ではありません。
運用記録は、要求されたURL、最終URL、ステータス、表現タイプ、関連するフィールド名、および境界のあるコンテンツマーカーをキャプチャする必要があります。全体のボディと資格情報の値は、ルーチン診断にはめったに必要なく、不必要な保持リスクを生む可能性があります。
ブラウザの動作と直接のHTTP動作は異なるテストサーフェスです。CORS、クッキーストレージ、自動デコンプレッション、およびリダイレクト処理は、アプリケーションコードが結果を確認する前に、ブラウザまたはライブラリによって実行される場合があります。キャプチャを比較する際にはクライアントそのものとそのデフォルトを記録してください。
Brotliを定義する標準
Brotli圧縮データ仕様 ロスレス形式とデコーダーを定義します。この一次資料は、この記事で使用される語彙と境界を修正しますが、実装の動作は選択されたクライアントと展開で観察する必要があります。
HTTPコンテンツコーディングの意味論 表現コーディングと交渉を定義します。この一次資料は、この記事で使用される語彙と境界を修正しますが、実装の動作は選択されたクライアントと展開で観察する必要があります。
MDNのContent-Encodingのリファレンス HTTP応答におけるbrトークンを文書化しています。この一次資料は、この記事で使用される語彙と境界を修正しますが、実装の動作は選択されたクライアントと展開で観察する必要があります。
公式のBrotli実装 エンコーダーとデコーダーのソースコードを提供します。この一次資料は、この記事で使用される語彙と境界を修正しますが、実装の動作は選択されたクライアントと展開で観察する必要があります。
Brotli導入ルール
Brotliを交渉された表現コーディングとして使用し、gzipまたはidentityのフォールバックを保持し、測定されたエンドツーエンドの結果からエンコーダーの作業を選択します。
そのルールを受け入れテストに組み入れてください。どの参加者が信号を送信し、どの参加者がそれを解釈し、どの中間者がパスを変更でき、どのコンテンツマーカーが成功を証明するかを述べます。これにより、Brotliは失敗後に付けられるラベルではなく、可観測システムの一部になります。
公開Web応答を検証する準備はできましたか?
承認された公共コンテンツを取得し、このガイドで説明された表現契約を確認するには、Scrapeless Universal Scraping APIを使用します。
今日サインアップして $5の無料クレジットを獲得 — クレジットカードは不要です.
$5のクレジットを獲得 →FAQ
Brotli圧縮はロスレスですか?
はい。Brotliデコーディングは、ストリームが有効な場合に元の入力バイトを正確に再構成します。
Content-Encoding: brとは何ですか?
HTTP表現バイトがBrotliでエンコードされていることを意味します。受信者はまずbrをデコードし、その後Content-Typeで名付けられたオリジナルのメディアタイプを解釈します。
Brotliは常にgzipよりも優れていますか?
いいえ。Brotliは小さいWebテキスト表現を生成できますが、互換性、エンコーダーの労力、レイテンシー、サーバーの容量、およびコンテンツの形状が優れたデプロイメントの選択を決定します。
Brotliはビルド時に生成されるべきですか?
ビルド時の事前圧縮は、安定した静的アセットに適しているため、要求からエンコーダーの作業を取り除きます。動的コンテンツは依然として、測定された設定でランタイム中にエンコードされる可能性があります。
なぜBrotli応答はスクレイパーで失敗する可能性がありますか?
クライアントがbrを広告しないまたはデコードしないか、圧縮バイトをテキストとして解析しようとする可能性があります。Accept-Encoding、Content-Encoding、自動デコード動作、およびデコード済みコンテンツマーカーを確認してください。