HTTP/1.1 just got a major update という記事が Hacker News 一面に出ていた。さっと訳す。正確性は保証しない。


IETF は、 HTTP/1.1 を更新するいくつかの新しい RFC を発表した。

RFC 7230: Message Syntax and Routing
RFC 7231: Semantics and Content
RFC 7232: Conditional Requests
RFC 7233: Range Request
RFC 7234: Caching
RFC 7235: Authentication
RFC 7236: Authentication Scheme Registrations
RFC 7237: Method Registrations
RFC 7238: the 308 status code
RFC 7239: Forwarded HTTP extension

これらは、従来の HTTP/1.1 を置き換えるものである。HTTP オタクとしては大事件だ。

15 年前に書かれた RFC 2616 こそ、皆が実装してきた仕様であり、読者もよく参照として利用してきただろう。

HTTPBis グループはこの仕様を少なくともここ7年間この仕様をアップデートする作業に費やしてきた。HTTP ほど後半に使われているプロトコルには様々なステークホルダーがおり、充足しなければならない意見も多くあったことが想像される。

まだ開発中の HTTP/2.0 も、これらの RFC を参照し、すべての定義をスクラッチから始めるよりも、これらの書類に単にリンクするだろう。

ここ数年、私もこれらの新しい使用書類のドラフトを使ってきた。元のものよりも参照しやすくなるのに時間がかからなかったからだ。

何が変わったか

最大の差異は、古い仕様と比べて、単純に文章量が多いということだ。理解しやすく、読みやすくなり、曖昧さもなくなった。

それから、仕様の核が6つの異なった仕様書に分割された。昔は HTTP のために RFC 2616 が、Basic および Digest 認証のために RFC 2617 があるだけだった。

この2つだけでも、API の作成者が仕様書を最初から最後まで読む意味はある。学ぶことはたくさんあるだろうし、よりよい HTTP API デザインへのインスピレーションが得られるだろう。

それから、308 ステータスコードが新しいスタンダードになった。これは4つ目のリダイレクト ステータスで、永久的なリダイレクトを意味する。308 を受け取ったクライアントは、リダイレクトをたどり、全く同じリクエストを行うことが期待されている。これは、クライアントが通常メソッドを GET に変更する 301 リダイレクトとは少し異なる。

RFC 7239 は Forwarded ヘッダーを標準化する。これは、 X-Forwarded-For や X-Forwarded-Proto などのヘッダーを置き換えるものだ。

以下、変わったことの全く網羅的ではないリスト。

  • 不意のホワイトスペースへの対処の明確化。これは HTTP レスポンス分割の脆弱性を解決するはずである。
  • サーバーあたりの接続数限界が排除された。
  • HTTP/0.9 のサポートがなくなった。
  • ISO-8859-1 のデフォルト charset がなくなった。
  • サーバーは、すべての Content-* ヘッダーを取り扱う必要がなくなった。
  • PUT リクエストでの Content-Range が明確に禁止された。
  • リファラーが存在しない際、Referer ヘッダーには about:blank を利用することが推奨されている。これは、「リファラーがない」と「リファラーを送りたくない」を区別するためだ。
  • 204, 404, 405, 414, 501 ステータスコードがキャッシュ可能になった。
  • 301 と 302 ステータスコードは、POST から GET へユーザーエージェントがメソッドを変更することを許容するように変更された。これは、皆が(間違って)既に実装していたもので、仕様側で実際の運用に沿うように変更を行ったものだ。
  • Location ヘッダーは、フラグメント アイデンティファイアと相対的 URI を含むことができる。
  • Content-MD5 がなくなった。

他に何か面白い変更があれば教えてくれ。

参照