読者です 読者をやめる 読者になる 読者になる

Site-Wide HTTP Headers とは

Mark Nottingham氏から、HTTPレスポンスヘッダをサイト全体で使いまわせるようにする 「Site-Wide HTTP Headers」 という仕様が提案されています。

https://tools.ietf.org/html/draft-nottingham-site-wide-headers-00


例えば、Public-Key-PinsやStrict-Transport-Securityというものはオリジン全体に適応されるヘッダですし、Content-Security-Policyも殆どの同じように使用されます。HTTP/2になりHPACKでヘッダは圧縮されるものの、デフォルトで4KでありContent-Security-Policyがそのうちの殆どを使用してしまってるケースも観測されています(3KのCSPヘッダなどもあるようです)。


そこで、HPACKのサイズも抑えるために、より少ないヘッダでサイト全体に適応されるヘッダを表現できるようにするのが、Site-Wide HTTP Headersです。

  • 1. ユーザエージェントはまず、site-headersを取得します
  • 2. 次回からユーザエージェントはHTTPリクエストを送信する際、site-headersを持ってることを通知します
  • 3. サーバはsite-headersを指し示して、site-headersのヘッダが付加されていることを示します
1. site-headersリソースの取得

サーバはRFC5785で定義される、URIでsite-headersリソースを提供します。このリソースはユーザエージェントによってGETで取得するか、サーバからServerPushで送信されます。
このHTTPレスポンスでは、Content-Typeに"text/site-headers"がセットされます。さらに、ETagが付加されて無ければなりません。
# a以下がサイト全体で使用するヘッダセットです。

HTTP/1.1 200 OK
Content-Type: text/site-headers
Cache-Control: max-age=3600
ETag: "abc123"
Content-Length: 1234

# a
Strict-Transport-Security: max-age=15768000 ; includeSubDomains
Server: Apache/2.4.7 (Ubuntu)
Public-Key-Pins: max-age=604800; 
  pin-sha256="ZitlqPmA9wodcxkwOW/c7ehlNFk8qJ9FsocodG6GzdjNM=";
  pin-sha256="XRXP987nz4rd1/gS2fJSNVfyrZbqa00T7PeRXUPd15w="; 
  report-uri="/lib/key-pin.cgi"
2. HTTPリクエスト

ユーザエージェントが改めてfoo.jpg等の別のリソースを取得するためにHTTPリクエストを送信する場合、最新のsite-headersリソースを持ってる事を示すために、SMヘッダに取得した時のETatの値を付加します。

GET /images/foo.jpg HTTP/1.1
Host: www.example.com
SM: "abc123"
3. HTTPレスポンス

サーバはHSヘッダで、site-headersの#aがこのレスポンスヘッダには付け加えて解釈するようにユーザエージェントに指示します。

HTTP/1.1 200 OK
Content-Type: image/jpeg
Vary: SM, Accept-Encoding
Cache-Control: max-age=3600
HS: "a"
Transfer-Encoding: chunked


つまり、上記のHTTPレスポンスヘッダは下記のように解釈されます

HTTP/1.1 200 OK
Content-Type: image/jpeg
Vary: SM, Accept-Encoding
Cache-Control: max-age=3600
Connection: close
Strict-Transport-Security: max-age=15768000 ; includeSubDomains
Server: Apache/2.4.7 (Ubuntu)
Public-Key-Pins: max-age=604800; 
  pin-sha256="ZitlqPmA9wodcxkwOW/c7ehlNFk8qJ9FsocodG6GzdjNM=";
  pin-sha256="XRXP987nz4rd1/gS2fJSNVfyrZbqa00T7PeRXUPd15w="; 
  report-uri="/lib/key-pin.cgi"