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"