TL

HTTP キャッシュ

一度取得した応答を再利用して通信を省く仕組みです。Cache-Control / ETag、ブラウザと CDN の役割、更新時の無効化(キャッシュバスティング)を整理します。

中級HTTPキャッシュCDNパフォーマンス最終更新: 2026-06-06
TL;DR要点だけ先に
  • 1.HTTP キャッシュは、取得済みの応答を再利用して通信を省き、表示を速くしサーバ負荷を下げる仕組み。
  • 2.Cache-Control で「どれだけ・どう使い回すか」を、ETag で「中身が変わったか」を検証する。
  • 3.更新が反映されない事故を防ぐには、ファイル名にハッシュを付けるキャッシュバスティングが定番。

HTTP キャッシュとは

同じ画像や CSS を、アクセスのたびにダウンロードし直すのは無駄です。HTTP キャッシュは、一度取得した応答を手元に保存して再利用し、通信そのものを省く仕組みです。

効果は 2 つあります。利用者には表示が速くなり、提供側にはサーバ負荷と転送量が減る。Core Web Vitals の LCP 改善にも直結する、地味だが効果の大きい施策です。

  • うまく効けば、2 回目以降の表示はほぼ瞬時になる。
  • 反面、設定を誤ると古い内容が表示され続ける事故になる。

鮮度(Cache-Control)

キャッシュの中心は、サーバが応答に付ける Cache-Control ヘッダです。「どれだけの間、どう使い回してよいか」を指定します。

# 1 年間、変更されない前提で強くキャッシュ(ハッシュ付きファイル向け)
Cache-Control: public, max-age=31536000, immutable

# 毎回サーバに確認させる(HTML など内容が変わるもの向け)
Cache-Control: no-cache

# 一切キャッシュさせない(個人情報を含む応答など)
Cache-Control: no-store

主要な指示子の意味を押さえておきましょう。

指示子意味
max-age=NN 秒間は再取得せずそのまま使ってよい
publicCDN など共有キャッシュにも保存してよい
private各ブラウザのみ保存可(共有キャッシュ不可)
no-cache保存はするが、使う前に毎回サーバへ検証する
no-store保存自体を禁止する
immutable有効期間中は変わらない。再検証も省く
no-cache は「キャッシュしない」ではない

名前に反して、no-cache は**キャッシュした上で「使う前に必ず検証する」**指示です。「保存させない」のは no-store の方。混同して no-cache を機密応答に付けると、保存されてしまう恐れがあります。ここは間違えやすい最大の落とし穴です。

検証(ETag / Last-Modified)

max-age が切れても、中身が変わっていなければ再ダウンロードは無駄です。そこで変わったかどうかだけを確認するのが検証です。

サーバは応答に ETag(内容の指紋)や Last-Modified(更新時刻)を付けます。次回ブラウザは、その値を If-None-Match / If-Modified-Since で送って問い合わせます。

# サーバ → ブラウザ:内容の指紋を付与
ETag: "abc123"

# 期限切れ後、ブラウザ → サーバ:この指紋のままか確認
GET /style.css HTTP/1.1
If-None-Match: "abc123"

# 変わっていなければ本文ゼロで「そのまま使え」と返る
HTTP/1.1 304 Not Modified

変更が無ければサーバは 304 Not Modified を本文なしで返し、ブラウザは手元のコピーを使い続けます。本文を再送しない分だけ通信が軽くなります。これを再検証と呼びます。

ブラウザと CDN のキャッシュ

キャッシュは 1 か所ではありません。利用者に近い順に、複数の層があります。

置き場所特徴
ブラウザキャッシュ各利用者の端末その人専用。private でも保存される
CDN / 共有キャッシュ世界各地のエッジ拠点多数の利用者で共有。public が必要
オリジンサーバ大本のサーバ最終的なデータの出どころ

**CDN(Content Delivery Network)**は、コンテンツを利用者に物理的に近い拠点へ複製し、そこから配信します。public 指定の応答をエッジでキャッシュすることで、オリジンへのアクセスを減らし、世界中で高速に届けられます。

HTML は短く、静的アセットは長く

内容が変わる HTML には no-cache(毎回検証)、ハッシュ付きの CSS / JS / 画像には max-age=31536000, immutable(強く長く)という二段構えが定番です。HTML さえ最新を取りに行けば、そこから参照する新しいアセット名に自然と切り替わります。

更新時の無効化(キャッシュバスティング)

強くキャッシュすると速い反面、更新したのに古いファイルが表示され続ける問題が起きます。これを避ける定番がキャッシュバスティングです。

仕組みは単純で、ファイル名にハッシュ(内容に応じた識別子)を埋め込むだけです。

  • 旧: app.js → 新: app.9f3c2a.js
  • 中身が変わればファイル名そのものが変わるため、ブラウザは新しい URL を別物として取得する。
  • 変わらないファイルは名前も同じなので、長期キャッシュがそのまま効く。

これにより、「長くキャッシュして速い」と「更新は確実に届く」を両立できます。多くのビルドツールが、この命名を自動で行います。

クエリ文字列での更新は確実ではない

app.js?v=2 のようにクエリで版を変える方法もありますが、一部の CDN やプロキシはクエリを無視してキャッシュすることがあり、確実とは限りません。可能ならファイル名自体を変える方式(ハッシュ付き)を選ぶのが安全です。緊急時は CDN 側のパージ(強制無効化)も併用します。

土台となる HTTP のヘッダやステータスコード、配信を速くする観点では Web パフォーマンス もあわせて読むと、全体像がつながります。

Web/フロントエンド Article

HTTP キャッシュを実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

HTTP

比較で見る軸

難易度: intermediate / カテゴリ: Web/フロントエンド / タグ数: 4

導入後に効く点

Cache-Control で「どれだけ・どう使い回すか」を、ETag で「中身が変わったか」を検証する。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
intermediate
カテゴリ
Web/フロントエンド
タグ数
4

判断チェックリスト

  • 自社の用途が「HTTP / キャッシュ」に近いか確認する。
  • 強みである「HTTP キャッシュは、取得済みの応答を再利用して通信を省き、表示を速くしサーバ負荷を下げる仕組み。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

HTTPキャッシュCDNパフォーマンスHTTPキャッシュCDNパフォーマンス
参考: 公式情報