2025/08/17 12:07 HTTP Caching

やっほー、ロボ子!今日のITニュースはHTTPキャッシュについてじゃ。

HTTPキャッシュですか、博士。なんだか奥が深そうですね。

そうぞ!HTTPキャッシュは、リクエストに関連付けられたレスポンスを保存して、後続のリクエストで再利用する仕組みのことじゃ。応答時間の短縮とオリジンサーバーの負荷軽減に繋がるから、システム全体の健全性にとってめっちゃ重要なのじゃ。

なるほど。キャッシュの種類も色々あるんですね。プライベートキャッシュと共有キャッシュがあるみたいですが。

そうじゃ!プライベートキャッシュは特定のクライアント、つまりブラウザに紐づくキャッシュで、個人化されたレスポンスを保存できるんじゃ。`Cache-Control: private` ディレクティブで指定するぞ。

共有キャッシュは、クライアントとサーバーの間にあるんですね。プロキシキャッシュやマネージドキャッシュがあるみたいですが、違いは何ですか?

プロキシキャッシュは、ネットワークからのトラフィックを削減するために、アクセス制御に加えてキャッシュ機能も実装するものじゃ。マネージドキャッシュは、サービス開発者が明示的に展開して、オリジンサーバーの負荷を軽減し、コンテンツを効率的に配信するキャッシュのことじゃ。CDNとかService Workerがそうじゃな。

`Cache-Control`ヘッダーがない場合でもキャッシュされることがあるんですね。ヒューリスティックキャッシュというんですか。

そうじゃ。例えば、1年間更新されていないコンテンツは、その後もしばらく更新されないと判断されてキャッシュされることがあるんじゃ。でも今は`Cache-Control`ヘッダーを明示的に指定することが推奨されてるぞ。

レスポンスには新鮮(fresh)と陳腐(stale)の2つの状態があるんですね。`max-age`ディレクティブで有効期間を指定すると。

`Expires`ヘッダーもあったけど、`max-age`が推奨されてるんじゃな。両方ある場合は`max-age`が優先されるぞ。

`Vary`ヘッダーは、同じURLでもリクエストヘッダーによって異なるレスポンスをキャッシュするために使うんですね。

その通り!`Accept`、`Accept-Language`、`Accept-Encoding`などのリクエストヘッダーの値によってレスポンスが変わる場合に使うんじゃ。Cookieを使う場合は`Cache-Control: private`を使うのがおすすめじゃ。

陳腐化したレスポンスを検証する仕組みもあるんですね。`If-Modified-Since`や`If-None-Match`を使うんですね。

`If-Modified-Since`は指定された日時以降に変更があったかどうかをサーバーに問い合わせるんじゃ。`ETag`はサーバーが生成するコンテンツのハッシュ値みたいなものじゃな。`If-None-Match`でその値をサーバーに送って、変更があったか確認するぞ。

`Cache-Control: no-cache`を使うと、常にサーバーから最新のコンテンツを取得できるんですね。

そうじゃ!でも`Cache-Control: no-store`はレスポンスをキャッシュに保存させないから、個人情報を含むレスポンスの場合はこっちを使うんじゃ。

リロードと強制リロードで挙動が違うんですね。強制リロードはキャッシュを完全にバイパスするんですね。

その通り!コンテンツが変更されない場合は、キャッシュバスティングで長い`max-age`を設定したり、`Cache-Control: immutable`を使って再検証を回避したりできるぞ。

デフォルト設定では、`Cache-Control: no-cache`を使うことが多いんですね。Cookieを使っている場合は、`Cache-Control: no-cache, private`を指定すると。

そうじゃな。CDNやService Workerを使うと、キャッシュを積極的に削除できるから、もっとアグレッシブなキャッシュ戦略が取れるぞ。

HTTPキャッシュ、奥が深いですね。でも、ウェブサイトのパフォーマンスを上げるために、しっかり理解しておきたいです。

HTTPキャッシュをマスターすれば、ウェブサイトは光速になるぞ!…たぶん。ところでロボ子、キャッシュって英語でなんて言うか知ってるか?

えっと…cash…ですか?

ブッブー!正解は「It depends.」…キャッシュだけにね!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。