キャッシュの利用は、レスポンスの高速化やオリジンサーバーの負荷削減といったメリットがありますが、適切な設定をしないとその効果を発揮できません。また、誤ったコンテンツをCDNでキャッシュすることは他人の情報が見えてしまうといったセキュリティ事故に繋がります。
本記事では、セキュリティ事故が発生しにくい、かつキャッシュを有効活用しやすいキャッシュ戦略の指針をお伝えします。
ただし、キャッシュ設計は導入時に一度やればOKというものではありません。なぜならば、Webサイトのコンテンツは変化していくからです。また、CDN導入前にキャッシュ可能なコンテンツを全てキャッシュしようと努力するよりも、導入後のレポートを見て、よくアクセスされているのにキャッシュされていないコンテンツを探す方が簡単です。
そのため、本記事を参考にしてCDN導入時のキャッシュ戦略の設計を行い、導入後はレポートを見ながら継続的に改善するという使い方を推奨します。
キャッシュが行われる場所
CDNを導入する場合、キャッシュはCDNとWebブラウザの2箇所で行われます。そのため、両者でどのようにキャッシュすべきか(キャッシュ戦略)を検討していきます。
キャッシュ戦略を考えるに当たって、まずはキャッシュする場所によってメリットとデメリットがあることを整理します。
- CDNでのキャッシュ
- メリット: CDNの機能でキャッシュを削除することができます。そのため、コンテンツ更新後にすぐにユーザーに新しいものを表示させたい場合や不適切な情報がキャッシュされてしまった場合に対応できます。
- デメリット: Webブラウザでのキャッシュに比べるとCDNからのデータ転送が発生する分、レスポンスが遅くなります。加えて、CDNのデータ転送料金がWebサイト事業者に発生します。
- ブラウザでのキャッシュ
- メリット: 通信を発生させることなくリソースを再利用できるため、最速でコンテンツを表示できます。
- デメリット: Webサイト運営者側から確実にブラウザキャッシュを削除する手段がありません。そのため、新しいコンテンツにすぐに差し替えたい場合にHTMLを書き換え、コンテンツのURLパスを変更する必要があります。
このような性質から、次の手順でキャッシュ戦略を決めることになります。
- CDNでのキャッシュ戦略を考える。
- CDNでキャッシュするコンテンツの一部をブラウザでキャッシュする戦略を考える。
ここでのポイントは、CDNのキャッシュの方が柔軟に変更しやすいため、まずはCDNでのキャッシュを考えるということです。
CDNのキャッシュ戦略
ここから、CDNのキャッシュ戦略を考えていきます。CDNのキャッシュ設計は、次のルールを順に設定することで進めます。
- デフォルトではキャッシュをしない
- 静的なコンテンツをキャッシュ対象に加える
- 動的なコンテンツのうちキャッシュ可能であるものをキャッシュする
これらの内容を順に見ていきましょう。
デフォルトではキャッシュをしない
どのルールにも合致しないデフォルトのルールでは、キャッシュしない設定にします。
このようなルールを作成する際には大きく分けて2通りの考え方があります。
- キャッシュしたいコンテンツだけ明示的に指定してキャッシュする(ホワイトリスト方式)
- デフォルトでは全てをキャッシュの対象にし、キャッシュしたくないコンテンツだけ明示的に指定して除外する(ブラックリスト方式)
このうち、1の方式をおすすめします。
CDNを使うからにはできるだけキャッシュを利用できる2の方が良いのでは?と思われた方もいるかと思います。
1を推奨する理由は、キャッシュしてはいけない個人情報を含んだコンテンツをキャッシュしてしまうことのリスクが大きいからです。
そのため、デフォルトでは一切キャッシュしない設定とし、キャッシュしても良いコンテンツだけを明示的に許可していくやり方をします。
静的コンテンツをキャッシュ対象に加える
次に静的コンテンツをキャッシュするルールを作成します。
静的コンテンツとは、ユーザーのリクエストの前に事前に作成されるコンテンツであり、CSS(.css)、Javascript(.js)、画像(.webp, .jpg)、フォント(.woff2)などが含まれます。
静的コンテンツに対して、動的コンテンツがあります。動的コンテンツは、サーバー側でユーザーのリクエストに応じて、リアルタイムに生成されるコンテンツです。ユーザーの会員情報に応じて作成されるページなどが動的コンテンツに該当します。
静的コンテンツはユーザーごとに出し分けする必要がないため、キャッシュ可能です。また、一般的に静的コンテンツのキャッシュの期間は次に述べる動的コンテンツよりも長くする傾向にあります。これは、静的コンテンツ自体が変更されることはほとんどなく、変更される場合はCDNが提供するキャッシュの削除機能によって行えるためです。
動的なコンテンツのうちキャッシュ可能であるものをキャッシュする
次に、動的コンテンツのうちキャッシュ可能なものに絞ってキャッシュを行います。
動的コンテンツはキャッシュできないという説明がされることがありますが、これは正確ではありません。
例えば、WordPressはPHPスクリプトとデータベースに保存されたデータに基づいて、ユーザーからのリクエストに対してコンテンツをリアルタイムで生成しています。つまり、WordPressで表示されるページは動的コンテンツです。
ですが、WordPressで作成された企業のホームページやブログは、全員が同じコンテンツを見ても良いので、キャッシュすることができます。
コンテンツをキャッシュできるかどうかは、そのコンテンツが動的コンテンツかどうかではなく、各ユーザーに対してユニークかどうかによって決まります。PCとスマートフォンに対してコンテンツを出し分けしていても、キャッシュキーを適切に設定することでキャッシュ可能なため、動的コンテンツかどうかはキャッシュの可否に関係がありません。
ユーザーに対してユニークかというのは、ユーザーごとに異なる内容を表示すべきかどうかを指しています。例えば、会員登録のあるWebサイトのマイページの情報は、ユーザーごとに異なる内容を出す必要があります。 こういったページをキャッシュしてしまうと、他人の名前や住所の情報が見えてしまうというセキュリティ事故が発生します。
そのため、動的コンテンツは注意深くユニークでないコンテンツに絞ってキャッシュ対象に追加します。
キャッシューキーについては前回記事で解説しています。
Webブラウザのキャッシュ戦略
CDNのキャッシュ戦略を決めた後は、Webブラウザのキャッシュ戦略を決めていきます。
ブラウザでキャッシュする対象は、CDNのキャッシュ対象の一部にです。
前述した通り、ブラウザにキャッシュされたコンテンツをWebサイト管理者が確実に削除する方法はありません。そのため、変化することが少ないコンテンツ(主に静的コンテンツ)のみを対象にキャッシュすることになります。
また、ブラウザのキャッシュの有効期限は、CDNのキャッシュの有効期限と同じか、より短くするのが一般的です。キャッシュの有効期限は、Cache-Control
ヘッダーのmax-age
ディレクティブで指定しますので、CDNの有効期限よりも短くしたい場合、CDNでこのヘッダーを書き換えることになります。
まとめ
本記事では、CDNとブラウザの両方を対象にしたキャッシュ戦略について解説しました。このキャッシュ戦略を軸にして、個別のWebサイトに合わせてキャッシュ設計をしていくとスムーズに進められます。
また、冒頭に記載した通り、CDN導入時に全てのキャッシュ可能なコンテンツをキャッシュすることは難しいので、運用レポートを見ながら徐々に改善していく方法を推奨しています。 無理してキャッシュしてはいけないコンテンツをキャッシュするリスクが大きいため、判断に迷ったらキャッシュしない方向で意思決定をすべきです。
次回は、HTTPプロトコルで利用できるコンテンツ圧縮機能について解説します。
CDN入門の記事一覧ページはこちらです。