ポリシーをオリジン全体に適応する Origin Policy (sec-origin-policy)

2020126 追記
仕様も大きく変わっているので、記事を書き直しました
asnokaze.hatenablog.com


20190218 追記
sec-origin-policyヘッダを使うように変更になった模様


WICGで議論されている「Set origin-wide policies via a manifest」の仕様がGoogleのMike West氏から提案されています。この「Origin Policy」と言う仕様は、氏のGithubリポジトリから確認できます。


これは、Content-Security-PolicyやReferrer-Policyといったレスポンスヘッダでリソースごとに毎回指定していたものを、Origin Policy Manifestとしてオリジンに対して指定できるようにするものです。


クライアントは、このマニフェストに書かれているヘッダがレスポンスヘッダに付いていると仮定して処理を行います。

サーバはまず、レスポンスヘッダのOrigin-Policyヘッダでマニフェストファイルの場所を指示します。

HTTP/1.1 200 OK
Content-Encoding: gzip
Accept-Ranges: bytes
Cache-Control: max-age=604800
Content-Type: text/html
...
Origin-Policy: "policy-1"


Origin-Policyを受信したクライアントは、そのマニフェストファイルを取りに行きます。Origin Policyのマニフェストファイルは.well-known/origin-policy/に置くことになっており、今回は「https://example.com/.well-known/origin-policy/policy-1」から取得します。
このマニフェストファイルもHTTP/2のPushを使用することで遅延を抑えられる旨仕様に書かれています。マニフェストファイルは以下の様になっています

{
  "headers": {
    "fallback": [
      {
        "name": "Content-Security-Policy",
        "value": "script-src 'self' https://cdn.example.com"
      },
      {
        "name": "Referrer-Policy",
        "value": "origin-when-cross-origin"
      }
    ],
    "baseline": [
      {
        "name": "Content-Security-Policy",
        "value": "object-src 'none'; frame-ancestors 'none'"
      },
      {
        "name": "Strict-Transport-Security",
        "value": "max-age=10886400; includeSubDomains; preload"
      },
      {
        "name": "X-Content-Type-Options",
        "value": "nosniff"
      }
    ]
  },
  "cors-preflight": { /* TODO(mkwst): Syntax? */ },
}

baselineは今後の全てのレスポンスヘッダに追加して解釈されるもので、fallbackは今後のレスポンスヘッダに該当のヘッダがなかった場合に追加して解釈されるヘッダが指定されます。

cors-preflightは、サーバがCORSの通信を解釈できることを示しています。クライアントは幾つかのCORS-preflightリクエストが成功することを前提に出来るようです。


クライアントは以降より、リクエストヘッダに適応しているマニフェストファイル名をOrigin-Policyヘッダに付加します。(適応しているOrigin Policyが無ければ、「Origin-Policy: 0」)

Origin-Policy: "policy-1"
|<<