キャッシュ制御:Cache-ControlヘッダとCDNどちらが適用される?

2023.02.09

J-Stream CDNext

CDN

CDNext紹介

Cache-Controlヘッダなどを利用してコンテンツのキャッシュ制御を行っているWebサイトで、更にCDNを利用してキャッシュ制御の設定を行った場合、結果としてどちらのキャッシュ制御ルールが適用されるでしょう? ヘッダの種類の解説とともに、J-Stream CDNextの仕様について紹介します。

1. Cache-Controlヘッダとは

Cache-Controlヘッダは、ブラウザや、CDNなどのプロキシによるコンテンツのキャッシュを制御するHTTPヘッダ情報の種類の一つです。このヘッダによる指定があることで、「特定のデータをブラウザがローカルにキャッシュする」「n秒間はする」「まったくしない」などのルールが付与されます。

Cache-Controlヘッダの例。
キャッシュに関するルールが指定されている。
この場合はキャッシュの有効期限が相対時間で指定されている。

Cache-Controlヘッダを利用することで、例えば毎回のアクセスの度にサーバーから画像を配信しなくても、以前配信したキャッシュがローカルに残っていれば、それを参照することでサーバーの稼働を抑えられるようになります。反対に更新頻度が高くキャッシュがすぐに古くなってしまうWebサイトなどでは、キャッシュを参照せず毎回のアクセスの度にサーバーへアクセスした方が良いでしょう。このように様々な状況に応じて、キャッシュをどのように制御すべきか指定するものがCache-Controlヘッダです。

2. Cache-Controlヘッダの種類

Cache-Controlヘッダには「Cache-Control:●●」という形式でいくつかの種類があります。主だったものをいくつか紹介します。

Cache-Control:no-cache

no-cacheは、コンテンツをキャッシュすることは出来るけれども、キャッシュを実際に利用する際には、オリジンサーバーへ問い合わせを行って、そのキャッシュが有効であることを確認しなければいけないという指定です。有効とは、具体的には更新された新しいファイルが存在するかどうかなどのことを指します。

Cache-Control:no-store

no-storeはno-cacheと異なり、ファイルをキャッシュして格納すること自体を否定しています。いかなる場合でもコンテンツをキャッシュさせたくない場合に指定するものです。

Cache-Control:private

privateはあるクライアントとオリジンサーバーが1対1の関係でのみコンテンツをキャッシュできるという指定です。CDNのような複数のクライアントでキャッシュを共有する仕組みではキャッシュをすることが出来ません。

Cache-Control:public

publicはprivateの反対で、CDNのようなキャッシュを複数のクライアントでシェアする場合も含めてキャッシュを容認する指定です。

Cache-Control:max-age=NN

max-ageは、クライアントの求めに応じてオリジンサーバーがコンテンツをレスポンスしてから何秒間そのコンテンツが有効であるかを指定するものです。指定の秒数を過ぎるまではキャッシュを利用します。

Cache-Control:s-maxage=NN

s-maxageもmax-ageと意味は同じですが、CDNのようなクライアントとオリジンサーバーの中間に位置する仕組みにおいて指定されるmax-ageです。

3. Expiresヘッダ

Cache-Controlヘッダ以外にもキャッシュの制御に用いられるHTTPヘッダとしてExpiresヘッダがあります。これはこのヘッダで指定された日時までは当該コンテンツは最新の状態であることを示すもので、Cache-Control:max-ageと異なり、何年何月何日何時という絶対的な日時が指定されます。「Expires:-1」のように、日時以外が指定されている場合は、常にキャッシュの有効期限が切れていると評価され、つまりキャッシュされなくなります。

Expiresヘッダの例。絶対時間が指定されている。

4. Cache-ControlヘッダとCDNの関係

サービスとして提供されるCDNには大半の場合Web管理画面が用意されています。CDNサービスによって仕様は様々ですが、Web管理画面内ではCDNがコンテンツをどのようにキャッシュするか、あるいはしないかという細かい制御を行うことが可能です。

Jストリームが提供するCDNサービス「J-Stream CDNext」の管理画面。
FQDN全体、ディレクトリごと、拡張子ごと、ファイルごとなど細かいキャッシュ設定が可能。

ではCache-Controlヘッダによってキャッシュの制御が行われているWebサイトにおいてCDNを利用するとどのような挙動になるでしょうか。例えばCache-Controlヘッダではキャッシュをしないという設定をしている状態で、CDNのWeb管理画面ではキャッシュを行うという設定がされた時、どのように配信されるのでしょう。これもCDNサービスによって仕様は様々ですが、概ね以下のパターンに分類されます。

  • オリジンサーバー側で設定されたCache-Controlヘッダの内容が優先される
  • CDNのWeb管理画面で設定された内容が優先される
  • どちらを優先するかCDNのWeb管理画面で指定することが出来る

Cache-Controlヘッダの指定は必須ではないので、当然存在しない場合もあり得ます。その時はCDNのWeb管理画面で設定されたルールでコンテンツが配信されることになります。ヘッダが存在する場合については上記のような種類で対応が分かれます。ヘッダの内容が優先される場合については、キャッシュの制御はヘッダによる指定を推奨するCDNサービスもあります。現状のWebサーバーの設定や設定の変更に関する仕様、また導入を検討するCDNサービスの仕様については、事前によく確認を行いましょう。

J-Stream CDNextでのCache-Controlヘッダの扱い

J-Stream CDNextを利用するWebサイトにCache-Controlヘッダなどが存在する場合、標準状態ではCache-Controlヘッダの設定内容に従います。上記の各種ヘッダには優先度があり、同時に設定されている場合はどれが優先されるかなどが異なります。CDNextの管理画面における設定も含め、優先度は以下のようになります。

no-cache = no-store = private = Expires:-1 > s-maxage > max-age > Expires > Web管理画面

5. CDNの設定を優先させたい時

前述したように、標準ではヘッダで指定された条件が優先的に適用されてキャッシュが制御されるので、キャッシュのルールを変更したい場合はヘッダを編集する必要があります。ただしヘッダの編集がオリジンサーバーの仕様上容易でなかったり、CDNのWeb管理画面のUIによって管理した方が簡便であったりするなどの理由から、CDNのWeb管理画面における設定内容を優先適用させたいというケースがあります。

J-Stream CDNextでは「Cache-Controlヘッダを無視してキャッシュ」するという機能があります。これはその名の通り、上記で紹介したようなExpiresも含むヘッダ情報が付与されていたとしても、それを無視してCDNextのWeb管理画面で設定されたキャッシュルールを優先適用させてしまうという機能です。これによりオリジンサーバーの設定を変更することなく、キャッシュのルールを指定することが出来るようになります。

「Cache-Controlヘッダを無視」にチェックを入れることで適用。

従ってJ-Stream CDNextは、ヘッダ情報を優先させることも、CDNのWeb管理画面における設定を優先させることも可能ということになります。CDNを利用するWebサイトの条件に応じて相応しい設定方法を選択しましょう。

6. Last-Modified/Etagヘッダ

この他にもキャッシュの制御に関わるHTTPヘッダがいくつかあります。その代表的なものがLast-ModifiedヘッダとEtagヘッダです。

Last-Modified

Last-Modifiedは、オリジンサーバー側でそのコンテンツが最後に更新された時刻を知らせるHTTPヘッダです。

Last-Modifiedの例。
この時間に該当のファイルが最後に更新されたことを示している。

これによりクライアントは、いつの時点でそのコンテンツが最新であったか知ることが出来ます。同じコンテンツに対して再びリクエストをする時は、Last-Modifiedとして受け取った時刻をオリジンサーバーへ送信し、この時刻のコンテンツをキャッシュしているが最新であるかどうか、という確認を行います。この時オリジンサーバーでは、クライアントから送信された時刻と、現在のLast-Modifiedの時刻とを比較し、変更が無ければクライアントがキャッシュしているコンテンツが最新であるとして、引き続きキャッシュコンテンツを利用するよう指示します。もしオリジンサーバー側の時刻の方が新しければ、新しいコンテンツを改めて送信します。

オリジンサーバーにLast-Modifiedが設定されている状態でJ-Stream CDNextを利用する場合も、Last-Modifiedの時刻を元にキャッシュを更新すべき最新のファイルがあるかどうかを確認します。

Etag

EtagもLast-Modifiedと同じく、クライアントがキャッシュしたファイルとオリジンサーバー側のファイルが一致するかどうか確認するために、オリジンサーバーがクライアントへ通知するHTTPヘッダです。Etagの場合は時刻ではなく、文字列が付与されます。クライアントが同じファイルへ再びリクエストを行う時にはEtagの値をオリジンサーバーへ通知することで、オリジンサーバー側に最新のファイルが存在するかどうかの確認を行います。これ以降の流れはLast-Modifiedの場合と同じです。J-Stream CDNextを利用する場合の動きも同じになります。

Last-ModifiedやEtagを利用することで、ファイルに更新が無い場合は引き続き現在キャッシュしているファイルを利用するので、オリジンサーバーにかかるファイル送信の負荷を削減することが出来ます。ヘッダの設定が適切でないと、キャッシュが更新されるべきなのにされなかったり、反対にファイルは更新されていないのにオリジンサーバーからの送信が発生してしまったりする場合もあるので、CDNの利用を検討する時には注意しましょう。

以上、キャッシュ制御ではCache-ControlヘッダとCDNどちらが適用されるのかについて、ヘッダの種類の解説とともに、J-Stream CDNextの仕様について紹介しました。
Jストリームではサービス専任のエンジニアとサポートチームを用意しており、CDNの利用を検討するWebサイトにおいて利用されているヘッダ情報などの細かい条件の確認も行いながら、最適なサービスご利用方法をご提案します。是非お気軽にお問合せ下さい。

J-Stream CDNext「料金と機能の一覧資料」をダウンロードする

サービス詳細

関連する記事一覧

Jストリームの
ソリューションに
興味をお持ちの方は
お気軽に
お問い合わせください。

電話でのお問い合わせ

0120-658140

【受付時間】9:30~18:30(土日祝日を除く)

登録無料!

Jストリームのサービスを活用した成功事例や、お客さまの課題解決につながるお役立ち情報などをメールでお届けしています。

メールマガジン登録

電話でのお問い合わせ

0120-658140

【受付時間】9:30~18:30(土日祝日を除く)