Web配信を高速化するために、これまでに様々な技術革新が行われてきました。サーバーとクライアントには、地理的な距離に依存するRTT(Round-Trip Time)、途中経路の回線速度、プロトコルの仕様など数々のボトルネックが存在します。
それらを解決する一つの方法として、キャッシュがあります。キャッシュは一度ダウンロードしたものを一時的に保管して、再利用するものです。これにより、距離遅延、中間経路の回線速度など、さまざまなボトルネックを解消することができます。
今回は、キャッシュの管理をつかさどるCache-Controlについて解説していきたいと思います。
キャッシュが行われる場所は、主に下記の図の3か所によって行われます。
クライアントキャッシュは主にブラウザによりキャッシュです。PCによるWeb閲覧はもちろんのこと、スマートフォンでゲームをするときにダウンロードしたアセットを利用するのもクライアントキャッシュのひとつです。
クライアントキャッシュは、Cache-Controlの設定内容に基づいて、クライアントに保存されているデータと同じものが必要になった場合、サーバーにはリクエストを送らずにキャッシュデータを参照します。そうすることでサーバーまでの通信量、通信遅延を軽減し高速化することができます。
経路上のキャッシュでは、主にProxyやCDNによりキャッシュが行われます。中間経路で行われるキャッシュのメリットとしては、ただ単純にオリジンサーバーの負荷軽減、通信量の削減だけではなく、同じエリア内のクライアントとキャッシュしたコンテンツを共有できることにあります。
例えば、iPhone端末からiOSのアップデートが行われるタイミングでは、多くの通信が集中することが考えられます。その際、中間経路にキャッシュできるシステムがあったらいかがでしょうか?クライアント端末では再利用が難しいキャッシュコンテンツであっても、同一エリア内のユーザー(クライアント)同士でキャッシュコンテンツを共有できるかもしれません。
これにはエリア特性もあるため、同じ学校、職場、地域のイベントなど特定のエリアに依存したコンテンツをエリア内のユーザー同士で共有できるかもしれません。もちろんこの場合、通信事業者によってキャッシュが行われるため、ユーザーは何も意識することなく、キャッシュの恩恵だけを得ることになります。
最後にサーバーキャッシュですが、主にReverse Proxyを用いてキャッシュすることが多いでしょう。Originサーバーの負荷を軽減するために導入することがほとんどになりますが、機能的には経路上のキャッシュとほぼ同等の役割になるかと思います。
但し、オリジンサーバーの手前のサーバーロードバランサーなどに、Reverse Proxyとしてのキャッシュ機能を持たせることも多いでしょう。そうすることでさらに耐障害性は向上します。
これまでどこでキャッシュするかについて説明してきました。そして、それぞれのポイントで何のコンテンツをキャッシュして、何のコンテンツをキャッシュしないのかを定義するのがCache-Controlになります。
Cache-Controlは、HTTPヘッダー内に存在し、キャッシュするコンテンツの有効期限など、キャッシュポリシーを設定するヘッダーになります。特に中間経路におけるキャッシュにおいては、不特定多数のユーザーとキャッシュコンテンツを共有することになるため、このCache-Controlの設定を正しく理解しなければ、ユーザーに紐づいた情報を誤配信してしまうなど注意が必要になります。
例えば、誤ってset-cookie をキャッシュしてしまい、キャッシュされたページにアクセスしたユーザーのログイン状態が共有されてしまい個人情報が漏えいするなど、オペレーションミスによっては思いもよらない事故を引き起こすことがあります。この点は常に念頭に置いておきましょう。
Cache-Controlに関しては、RFC7234で定義されています。このキャッシュの技術は冒頭でも説明した通り、Webの高速配信を可能にするためには必要不可欠な要素です。この技術を正しく利用するためにCache-Controlについてのいくつかの仕様を紹介したいと思います。
このヘッダーは、キャッシュされているコンテンツが現在も有効であるかどうかをサーバーに必ず確認せよ、という指示になります。
このヘッダーは、キャッシュが行われる際に評価され、キャッシュを格納してはならないという指定になります。キャッシュさせたくない場合はレスポンスヘッダーにno-storeを必ず指定します。
no-storeと非常に似ていますが、no-storeは初回のアクセス時にキャッシュしないとということを指定するのに対し、no-cacheは2回目以降のリクエストを受けた時点で、キャッシュを使う際にはオリジンに問い合わせを行い、そのキャッシュが有効でない限り使用してはいけないという指定になります。
キャッシュは、事業者にとってもユーザーにとってもメリットの高い技術になります。事業者においては通信量、通信帯域を削減し、ユーザーにとってはRTTを短縮することでユーザーエクスペリエンスの向上につながります。この恩恵を得るためには、どこでキャッシュするかと合わせて、何のコンテンツをキャッシュするのかしないのか定義する必要があります。Cache-Controlを正しく理解し、適切な設定を行いましょう。