CDNは基本的に2つのシンプルな動作を制御して負荷分散を行いますが、今回はCDNでキャッシュさせる方法・キャッシュさせない方法について代表的な手段と、手段の違いによるメリット・デメリットを掲載します。
CDNの本質は2つ
CDNの動作は大きく分けて「キャッシュする」「キャッシュしない」という2つの動作があります。
キャッシュする
CDN(エッジサーバー)は、ユーザーからのリクエストがあったコンテンツをオリジンサーバーから取得し、CDN内にコンテンツのコピーを保持します。初回以降のアクセスからCDNとユーザーの間でキャッシュ配信します。
キャッシュしない
CDN(エッジサーバー)は、ユーザーからのリクエストをそのままオリジンサーバーに渡し、レスポンスをそのままユーザーに返します。通信の最適化や様々なことをする場合がありますが、コンテンツ自体のキャッシュはおこないません。
CDNを使う多くの方は、この2つの基本的な動作をうまくコントロールして、様々な目的を果たすために設定を行うことがほとんどだと思いますが、技術的に複雑で難しい仕組みやCDNのメリットなどをお話するまえに、まず基本動作となる2つを適切にコントロールする手段からおさえておきましょう。
CDNのキャッシュコントロール方法
キャッシュする・キャッシュしないという動作をコントロールする手段は、「CDNで制御」する方法と、「CDNを制御」する方法の2つがあります。おそらくCDNを利用している大半の方はこのどちらかの方法を使ってキャッシュコントロールをしているとおもいます。
CDNで制御する方法
CDN側を制御する方法とは、所謂CDNベンダーが用意している管理画面からキャッシュの設定を行う手段です。CloudFrontに代表されるCDNサービスは、ユーザー自身が設定変更できる管理画面が予め用意されており、このPATHではじまるリクエストはキャッシュしない、またはキャッシュするといった設定が可能です。
CDNを制御する方法
こちらは、適切なHTTPヘッダをコンテンツ側に付与・またはオリジンサーバーで設定しCDNをHTTPヘッダで制御する方法です。HTTPヘッダの詳しい内容はこちらにまとめていますのせ合わせてご確認ください。
キャッシュ制御の違いによるメリット・デメリット
さて、CDNで制御する場合もCDNを制御する場合も、どちらもメリット・デメリットがありどのようなコンテンツをどのような目的で配信するかによって適切な方法がわかれます。CDNを利用する上で制御する手法について知識を持っておくことは非常に重要です。
CDNで制御するメリット
CDN管理画面で設定できる最大のメリットは、WEBサーバーの設定を変更することなくキャッシュポリシーが適用できる点です。たとえばWEBサーバーの修正やコンテンツの修正が難しい環境、目的が決まっておりシンプルなキャッシュを素早くおこないたい場合は適していると言えます。次に、オリジンサーバーやコンテンツ側を把握していない場合でも、大凡の設定が可能です。CDNベンダによっては管理画面で制御するポリシーの優先度のほうが高い場合もあるため、強制的にこう設定するといったことが明確な場合に有効です。
CDNで制御するデメリット
CDNの管理画面で設定することはいいことばかりではありません。勿論デメリットもあります。まず始めに学習コストがかかってしまうということ。CDNベンダーの管理画面の特性や設定の意味を理解しなければいけなく、結局設定後に裏付けのため動作確認を改めておこなうことになります。
そして、CDNベンダによってWEB管理画面上から設定できる項目・できない項目のギャップが存在します。例えばA社ではこのような設定ができていたのにB社では設定項目がそもそも存在しない、または、A社では20個の項目を設定出来ていたのにB社では10個しか設定出来ないなどのギャップに悩まされる可能性があります。
また、設定項目が大量にあると再設定する手間や管理コストがかかります。例えば100個のパスに対して個別にユニークなキャッシュ設定を適用した場合、どれが適用されていてどれを変更したのか把握するコストがかる恐れがあります。
CDNをHTTPヘッダで制御するメリット
CDNを導入していない場合でも、ブラウザキャッシュを意識する設定を行っているWEBサイトであれば環境によってはそのままCDN化出来てしまう可能性があります。
また、CDNベンダの仕様を確認するだけで設定の洗い出しが可能となり、「キャッシュをするのか・しないのか」という2択の動作を確認するだけですので、たとえば画面上の設定が期待した動作となっているのかということを改めて確認する必要はありません。これはほとんどのCDNベンダはRFC7234にのっとったキャッシュコントロールに準拠しているためです。そして、キャッシュルールはコンテンツごとに1つずつ定義されるため、キャッシュルールの項目数という概念が存在しないため柔軟なキャッシュ設定を計画することが出来ます。
CDNをHTTPヘッダで制御するデメリット
キャッシュコントロールヘッダにはそれぞれ強さがあります。これはRFCで定義されている通りなのですが、CDNベンダによっては独自のルールを設けている場合があり、これらを確認しないと意図した動作とならず大惨事になるケースがあります。
また、WordPressやDrupalなど人気CMSの場合、プラグインやCMS本体で管理者が意図しないヘッダをレスポンスしてしまうケースも多く、これにより意図していないキャッシュ制御となってしまう場合があります。そのため、設定項目以外にもコンテンツ側に何か変更を加えた際は、改めてHTTPヘッダへの影響を意識する必要が出てきます。
0秒キャッシュという罠
2017年6月22日大手ECモールを運営しているメルカリは、CDNベンダの切り替え(いわゆる移転)を実施しました。※発表を見る限りHTTPヘッダにてキャッシュをコントロールしていることが読み取れます。 その際、移転前のCDNベンダの仕様と移転後のCDNベンダの仕様が若干異なっていたことから、意図しないページをキャッシュしてしまい個人情報漏えいにつながったと報道されていましたが、その後の続報で以下のように追加発表しています。
Expiresヘッダは、Cache-Controlヘッダにmax-ageまたはs-maxageがない場合採用されます。
ただし、過去の日付である場合、0秒として扱われます。キャッシュの有効期限が0秒となる場合、CDNからオリジンへのリクエストの処理中に、
同じURLに対してリクエストが発生すると、最初のレスポンスを待って、2つ目以降のリクエストにも同じレスポンスが返される仕様になっていました。
0秒キャッシュはキャッシュされないわけではない
これらは、所謂「0秒キャッシュの罠」です。キャッシュを1秒するというのは1秒間キャッシュし、1秒後に破棄するということでイメージしやすいとおもいます。
しかし、0秒キャッシュというのは一見キャッシュを行わないという動作と同一に見えがちですが、
同時リクエストを発行した場合に限り、初めのユーザーが閲覧したコンテンツを閲覧できてしまうことがあります。これが0秒キャッシュです。
キャッシュをしてはいけない会員情報のページなどは、確実にキャッシュを行わない命令ヘッダで一番強いものを必ず付与させておくのが安全でしょう。さらに万一の事態に備えCookie内の認証情報別にキャッシュするルールも追加しておくとベストです。
キャッシュさせるヘッダ・させないヘッダ
弊社のエッジキャッシュやCloudFrontに代表されるCDNはどのヘッダを付与した際に、キャッシュするのか、キャッシュしないのかという仕様が公開されています。さらにこれらのヘッダの優先順位も掲載されているため、どれが一番優先度が高いヘッダなのかを押えておく必要があります。
キャッシュさせるヘッダと順序例
以下のレスポンスヘッダがある場合キャッシュをおこなう。Cache-Controlヘッダが付与されていない場合は、デフォルト時間キャッシュをおこなう。
Cache-Control: s-maxage
、Cache-Control: max-age
、Expires
のいずれかのヘッダーがある。
優先順序
s-maxage > max-age > Expires
※Cache-Controlヘッダにmax-ageまたはs-maxageがない場合Expiresヘッダを判定
キャッシュさせないヘッダ一覧
レスポンスヘッダに以下のいずれかのヘッダが付与されている場合は、キャッシュをおこなわずPASSする。
- Cache-Control: no-store
- Cache-Control: no-cache
- Cache-Control: max-age=0
- Cache-Control: private
- Pragma: no-cache
弊社は、Max-Age=0が付与されていた場合、0秒キャッシュをおこなわず確実にキャッシュMISSします。これは複雑なキャッシュポリシーをおこなっている場合不用意にキャッシュしてしまう事故を避けるためです。また0秒キャッシュは秒間に一斉同時リクエストが発生した際、なるべくオリジンサーバーに到達させないようにする仕組みですが、一瞬キャッシュすることには変わりないため注意が必要となる項目の一つです。
CDNサービスベンダは国内外に複数存在しますが、基本はRFCで取り決められたSharedキャッシュルールに準拠しています。
しかし、CDNの動きにプロトコル(決まりごとや標準)は存在しないといっても過言ではなく、ベンダによって同じ設定をしていても優先順位や強制力が影響して異なる動作となる場合があります。弊社はリリース時からCDNの仕様を掲載していますが、特に0秒キャッシュ時どのようになるのかという詳細はCDNベンダの仕様書をみても記載されていないケースがおおいのが現状です。
まとめ
CDNのキャッシュコントロール手段はCDNベンダの管理画面で設定する方法と、HTTPヘッダを付与しCDNを制御する方法2種類あります。画像やCSS・JSなどの静的コンテンツだけキャッシュしその他のコンテンツはPASSするといった簡単なキャッシュルールであれば、CDN側で制御してしまったほうが楽です。一方、動的コンテンツやページキャッシュも考慮した運用の場合は、柔軟に命令出来るHTTPヘッダによる制御のほうが望ましいことが分かったと思います。
CDNはなるべくキャッシュHITしてほしいとおもいますが、キャッシュHITすることが逆に事故へとつながる事もあるため、安全ではないページは絶対にキャッシュさせないというおもいきりも大切です。CDNを用いたWEB高速化・負荷分散は、コンテンツの仕様・サイトの運用によって最適なキャッシュルールを検討することが必要不可欠で避けては通れません。これには、残念ながら決まった正解というものが存在しないため、WEB担当者が責任をもって調べながらルールを洗い出すのは一苦労だとおもいます。このような理由から、弊社ではWEBサイトやコンテンツ配信状況に最適なキャッシュルールをお客様と一緒に作成するお手伝いをしています。