要約

  • 103 Early Hintsは情報レスポンスであり、サーバーが最終レスポンスを生成中でもクライアントに準備を許す。
  • ヒントのフィールドは最終レスポンスと異なる場合があり、最終結果は成功、リダイレクト、クライアントエラー、サーバーエラーのいずれにもなり得る。
  • preloadのLinkは対象との関係を示すだけで、取得成功や利用認可を証明しない。
  • 可用性を判断する前に、監視はレスポンス列全体と投機的取得の結果を保存する必要がある。

最初に見えたステータスだけを記録する配信ダッシュボードを考える。エッジが二つのpreloadリンクを含む103 Early Hintsを返すと、表示は緑になる。しかし同じリクエストは少し後に503 Service Unavailableで終わり、先読みしたアセットの一つも失敗する。103自体は正しく、待ち時間短縮に役立つ可能性がある。それを「準備完了」とした判断が誤りだ。

RFC 8297は、サーバーが最終レスポンスを用意する時間をクライアントの準備に使うためEarly Hintsを定義した。接続を先に開く、必要になりそうなスタイルシートを取りに行く、といった処理ができる。結果が確定する前に動けることこそ、最適化の価値である。

仕様が示すのは、ヒントされたフィールドが最終レスポンスにも含まれる「可能性が高い」ということだ。通常は繰り返されるが、後の処理で誤りや不適切さが判明すれば、最終レスポンスから省いたり変更したりできる。103だけを保存する計測は、プロトコルが意図的に残した不確実性を消してしまう。

103のフィールドは最終レスポンスのフィールドを置き換えない。性能最適化を除き、先行評価によって最終レスポンスの処理方法を変えてはならない。preloadは準備であり、アクセス権を与えず、表現を決定せず、未完了の処理を成功に変えない。

RFC 9110は、より大きな順序を定める。一つのリクエストには、ゼロ個以上の1xx暫定レスポンスがあり、その後に1個の非1xx最終レスポンスが続く。1xxは進行情報、2xxは成功、3xxはリダイレクト、4xxはクライアント側のエラー条件、5xxはサーバー側の失敗を表す。103を成功として扱うと、この順序ある状態を早すぎる一つのフラグに潰してしまう。

最終レスポンスも、利用者の結果を十分に表さないことがある。200の文書が、後から失敗するアセット、完全性検査に通らないアセット、ポリシーで遮断されるアセットを参照しているかもしれない。匿名の合成監視と認証済みセッションで内容が違う場合もある。したがってレスポンス列は、運用上保証したい実際の結果まで結び付けなければならない。

RFC 8288はWeb Linkingを、コンテキストリソースとターゲットリソースの型付き関係として定義する。preload関係のLinkは候補と処理方法を伝えられるが、DNS解決、接続、TLS、認可、キャッシュ可能性、オブジェクト完全性、取得成功を保証しない。

観測点も証拠の一部だ。ブラウザー、CDN、リバースプロキシ、合成監視が103を受け取った事実は、この交換でその観測者まで情報レスポンスが届いたことを示す。それだけでは各フィールドを生成したホップを特定できず、別地域、別プロトコル、別キャッシュ状態、別の認証主体にも同じ列が届くとはいえない。

投機にはコストがある。不要な先読みは接続、帯域、端末電力、キャッシュ容量を使う。RFC 8297が先行処理できるフィールドを制約するのは、性能最適化がセキュリティーやプライバシーにも作用し得るからだ。Early Hintsを止めるのではなく、範囲、費用、結果を見える形にする必要がある。

HTTPレスポンス列の記録には、メソッドと対象、プロトコル、接続、観測点、順序付きの全情報レスポンス、最終ステータスとフィールド、可能なら最終表現のハッシュを含める。先行取得の対象ごとに関係種別、起点となった103、認証情報の送信モード、キャッシュ結果、最終状態、完全性、所要時間を結び付ける。中継・キャッシュの識別、認可コンテキスト、観測時刻も秘密を保存せずに残す。

すると表示は「103を観測」「preload開始」「最終200を受信」「表現を検証」「アプリケーション取引を完了」を区別できる。同じ画面に集約しても、最初のイベントから残りを捏造してはならない。

切り分けにも効く。103が速くなったのに最終レスポンスが遅くなれば、後段のアプリケーション処理を疑える。特定エッジだけでアセットが失敗すれば、経路、キャッシュ、デプロイの問題かもしれない。最終Link集合が変われば、遅い段階のルーティング、内容、認可判断を調べるべきだ。それぞれ担当が違う。

境界を守ればEarly Hintsは有力な証拠になる。観測したHTTP列が、暫定的な関係を通知できる段階まで進んだことを示し、無駄な投機やエッジ差異を可視化できる。ただし、まだ到着していない最終レスポンスを約束することはできない。

出典

RFC 8297 — An HTTP Status Code for Indicating Hints; RFC 9110 — HTTP Semantics; RFC 8288 — Web Linking.