HTTPセマンティクス仕様の改訂版(RFC9110) まとめ

HTTPのGETといったメソッドやヘッダの意味を定義したHTTPセマンティクス仕様の改訂版である「HTTP Semantics」が標準化の大詰めを迎えている。(RFC9110となる予定)

既存の仕様から幾つか大事な変更が含まれているので簡単に紹介する。

目次

セマンティクス仕様の改訂作業

HTTPセマンティクス及び、HTTP/1.1の仕様の改定作業がIETFのHTTP WGで行われている。その背景について簡単に紹介する。

現在、HTTPセマンティクスはHTTP/1.1の仕様の中で定義されている。HTTP/1.1 は、RFC 7230 〜 7235で定義されているが、セマンティクスは主に「RFC 7231 Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content」に記述される。

この、RFC 7230 〜 7235の仕様を改訂し、HTTPセマンティクスと、HTTPメッセージの送信方法の定義を下記の通り分離するという事が行われている。

こうすることで、HTTP/2(http2bis)やHTTP/3からはHTTP Semanticsの仕様を参照できるようになる。つまり、HTTP/2やHTTP/3はHTTPメッセージの送り方が異なるだけで、HTTPのセマンティクスとは変わらないというのが、仕様の参照関係的にもすっきりする。


ざっくり変更点

セマンティクスとフォーマットの分離以外にも、HTTP/2やHTTP/3に合わせた記述変更など、幾つか重要な変更点あるので紹介したい。

なお、HTTP/3は改訂される「HTTP Semantics」に準拠しているため、用語などを押さえておく必要がある

用語整理 (Field)

新しいセマンティクス仕様では、使い慣れたHTTPの用語の整理がされている。

普段、「HTTPヘッダ」と呼んでいる、キーとバリューからなるHTTPメッセージのメタデータは、「フィールド」と呼ぶことになった。コンテンツ(ボディ)を送った後に送信するフィールド(トレーラ)と区別し、「ヘッダフィールド」「トレーラフィールド」と呼び分けることになる。なお、ヘッダセクションに現れるフィールドのみを簡易的に"ヘッダ"と呼ぶことはできる。

ヘッダやトレーラを区別しない場合は、フィールドと呼ぶ必要がある。例えば、次の例は、ヘッダとトレーラ区別しないので、フィールドという用語を用いている。

以下などを参照
qiita.com
github.com

用語整理 (body)

HTTPボディ、HTTPペイロードと呼ばれていたものは、セマンティクス上はコンテンツ(content)と呼ぶ。このコンテンツは各HTTPバージョンの定義に従って格納される。

このコンテンツは、HTTP/1.1ではHTTP/1.1ボディという形で送られる。

github.com

用語整理 (interim/final レスポンス)

ステータスコード1xx系をinterim responses (non-final response)と呼び、それ以外をfinal responseと呼ぶ

github.com

ステータスコードのレンジを明確化

ステータスコードとして取りうる範囲を、100~599と明示

github.com

ステータスコード418 unused

「418 I'm a teapot」はHyper Text Coffee Pot Control Protocol のステータスコードである。HTTPの仕様上は、418をunusedという形で予約した。

asnokaze.hatenablog.com

Rangeを指定したPUTリクエス

すでに、再開可能なアップロードのために使用されているが、仕様上もPUTリクエストにRangeを許可した。
asnokaze.hatenablog.com

GET, HEAD, DELETEでコンテンツを含めるのを非推奨 (SHOULD NOT)

GET, HEAD, DELETEリクエストにコンテンツ(ボディ)を含めるのを非推奨とした (SHOULD NOT)。仕様上はそれらのコンテンツのセマンティクスを定義してないため、相互運用上問題になる可能性がある。

プロトコルのマイナーバージョンについて

HTTP/2やHTTP/3は、バージョンにマイナー番号を持たない。あえて記述する場合は、マイナーバージョンは0とすることになった。

更に詳しく知りたい場合

「Appendix B. Changes from previous RFCs」に各RFCからの変更点が記載されている。細かく知りたい場合はそちらを参照
www.ietf.org

おわりに

HTTP Cachingは、どなたかキャッシュ詳しい人が解説して貰いたいところ