キャッシュ

 

キャッシュとは

キャッシュとは、ユーザがアクセスしたWebページのデータを保存しておき、再度同じページへアクセスがあった際、Webサーバへアクセス無しに高速にWebページを提供する機能。
 

キャッシュ使うメリット

  • Webサーバ側は、アクセスが多い場合でも処理の負荷を軽減できる。
  • ユーザ側は、ページ読み込みまでの待ち時間を短縮できる。
 

キャッシュの種類と格納場所

キャッシュは大きく分けて「共有キャッシュ」と「プライベートキャッシュ」に分類される。
キャッシュの種類概要キャッシュ格納場所
共有キャッシュ複数ユーザ間で共用されるキャッシュ。 サイトのロゴなどの全ユーザでアクセス内容が同一のデータを保存する。ProxyサーバやCDN(Content Delivery Network)
プライベートキャッシュユーザがアクセスした全ページを保存するキャッシュ。 個人情報やログイン後のページなど、共有キャッシュには格納できないデータも保存できる。各ユーザのブラウザ
 

キャッシュの制御方法

HTTPにおけるキャッシュの仕様はRFC7234で定められている。
HTTPヘッダの情報を基に「キャッシュを保存するか?」や「キャッシュを利用するか?」を決める。
HTTPヘッダやHTTPメッセージについてはこちらの記事を参照!
 

キャッシュ制御に関わるHTTPヘッダ一覧

キャッシュ制御の例

Cache-Controlヘッダによる制御の例

Cache-Controlヘッダに、キャッシュ禁止を示す値「no-store」が指定されている場合の通信例を挙げる。
その他のCache-Controlヘッダに指定可能なフィールド値一覧はこちらを参照。
 
 

EtagヘッダとLast-Modifiedヘッダによる制御の例

Webページの内容が同じ間、コンテンツの送信を省略することで、回線帯域を節約する制御の例を挙げる。
 

Varyヘッダによる制御の例

多言語対応していて表示言語がAccept-Languageヘッダに基づいて決定されるウェブサイトにて、Varyヘッダを用いてキャッシュ制御をする例を挙げる。
ユーザAとユーザBがAccept-Languageヘッダの値を 「ja」 に設定し、ユーザCが 「en」 に設定したとする。この場合、ユーザAとユーザBは表示言語が日本語、ユーザCは英語を要求することとなり、同じURLでも異なる内容(異なる言語)のウェブページを受け取る。
このようなケースで、キャッシュを正しく機能させるためには、Varyヘッダが必要となる。 サーバはレスポンスに 「Vary: Accept-Language」 を含めることで、キャッシュにこのレスポンスが「Accept-Language」 値によって異なるレスポンスであることを伝える。
その結果、キャッシュはAccept-Languageヘッダの値に基づいて適切なレスポンスを提供することができる。
 

参考リンク

HTTP キャッシュ - HTTP | MDN
HTTP/1.1 の Cache-Control 一般ヘッダーは、リクエストおよびレスポンスでキャッシュ機能に関するディレクティブを指定するために使用します。このヘッダーが提供するさまざまなディレクティブを使用して、キャッシュのポリシーを定義してください。 キャッシュしない クライアントのリクエストおよびサーバーのレスポンスについて、キャッシュに何も保存してはいけません。リクエストはサーバーに送信されて、リクエストごとに毎回完全なレスポンスをダウンロードします。 Cache-Control: no-store キャッシュするが再検証する キャッシュした複製を渡す前に検証のため、キャッシュは生成元のサーバーにリクエストを送信します。 Cache-Control: no-cache private キャッシュと public キャッシュ "public" ディレクティブは、どのキャッシュでもレスポンスを保存してよいことを示します。これは、通常はキャッシュできない HTTP 認証やレスポンスステータスコードを伴うページをキャッシュしなければならない時に有用です。 一方、"private" はレスポンスがひとりのユーザーのためのものであり、共有キャッシュに保存してはならないことを示します。ブラウザーのプライベートキャッシュは、この場合でもレスポンスを保存できます。 Cache-Control: private Cache-Control: public 有効期限 このヘッダーでもっとも重要なディレクティブが、リソースが陳腐化していないと考えられる最長期間を表す " max-age= " です。 とは対照的に、このディレクティブはリクエストの時刻と関係があります。変更しない予定のアプリケーションのファイルには、たいてい積極的なキャッシュを行います。これは例えば画像、CSS ファイル、JavaScript ファイルといった静的なファイルが含まれます。 詳しくは、後述する 鮮度 のセクションもご覧ください。 Cache-Control: max-age=31536000 検証 " must-revalidate" ディレクティブを使用すると、キャッシュはリソースを使用する前に陳腐化の状態を検証しなければならず、また期限切れのリソースを使用するべきではありません。詳しくは、 キャッシュの検証 のセクションをご覧ください。 Cache-Control: must-revalidate