CDNのキャッシュを制御する CDN-Cache-Control ヘッダ

CDNのキャッシュを制御する「CDN-Cache-Control」を新しく定義する提案仕様「The CDN-Cache-Control HTTP Response Header Field」が出ているので、簡単に紹介する。

2021/10/16 追記: 最新仕様では「Targeted HTTP Response Header Fields for Cache Control」と呼ばれる

はじめに

HTTPではキャッシュを制御するのにCache-Controlヘッダを使用しますが、クライアントとは別にCDNに対して個別にキャッシュの制御を行いたい場合もあります。

その用途のために使用する「CDN-Cache-Control」を新しく定義しようというのが「The CDN-Cache-Control HTTP Response Header Field」です。

この仕様は、Akamai, Fastly, Cludflareに所属する三人が共著で提出している点も興味深いところです。

CDN-Cache-Control

CDN-Cache-ControlヘッダのディレクティブはCache-Controlヘッダと同様です。

CDN-Cache-Controlがある場合は、Cache-control及びExpiresヘッダは無視されます。(CDN-Cache-Controlがなければ、Cache-controlが使用されます。)

例えば下記のようなレスポンスヘッダは

Cache-Control: max-age=60, s-maxage=120
CDN-Cache-Control: max-age=600
  • CDNでは600秒 レスポンスはfresh となる
  • CDN以外ではshared cacheは120秒、その他は60秒 fresh となる

例えばCDNではキャッシュを許可し、それ以外では保存させないという事もできます。

Cache-Control: no-store
CDN-Cache-Control: max-age=600

その他

提案仕様では、いくつかのFAQが書かれています。詳しくは原文を見てもらうとして、軽く紹介

なぜSurrogate-Controlを使わないのですか?

Surrogate-Controlヘッダーの実装はいくつかあるが、一貫性がないため、相互運用性の観点で新しいヘッダとして定義した

なぜCache-Controlヘッダに組み込まないのですか?

冗長性が減るが、相互運用上の観点で複雑性がますため

これはCDN専用ですか?

そうです。CDNゲートウェイキャッシュは区別すべきです。

複数CDNをつかってるんですが

複数CDN利用してる際にそれぞれ違うCASH制御したい場合があるかもしれません。

CDNは独自のヘッダ名を使うことが検討できます。

例えばFoo CDNでは「Foo-CDN-Cache-Control」を使うと言った風に。