この記事に広告・アフィリエイトリンクはありません。HTTPキャッシュはRFC 9111・RFC 9110、追加ディレクティブや観測ヘッダーは関連RFC、実装確認はMozilla MDN・Chrome・Cloudflare・Googleの公式資料を基準に、2026年7月29日時点で確認しています。
キャッシュとは、データをただ一時保存する機能ではなく、「どの保存済み結果を、いつ、誰に、どの条件で再利用してよいか」を管理する仕組みです。 うまく使えば表示を速くし、サーバー負荷と転送量を減らせます。一方、キーや更新方法を誤ると、古い情報や別の利用者向け情報を返す事故につながります。
キャッシュは「保存済みコピー」より、再利用条件の設計が本体
Webキャッシュでは、リクエストに対応する応答を保存し、キャッシュキーが一致し、freshであればそのまま再利用します。staleになってもETagなどで未変更と確認できれば、本文を再送せず304応答で再利用できます。
| 一言でいうと | 過去の応答や計算結果を保存し、同じ条件の後続処理で再利用する仕組み |
|---|---|
| 主な効果 | 表示時間、オリジン負荷、データ転送量、処理コストを減らす |
| 基本判定 | キャッシュキー一致 → freshならHIT、staleなら再検証、未保存ならMISS |
| 重要ヘッダー | Cache-Control、ETag、Last-Modified、Vary、Age、Cache-Status |
| 最大のリスク | 古い情報の長期表示と、個人向け応答を共有キャッシュで誤配信すること |
| 安全な更新 | 静的ファイルは版付きURL、HTML・APIは短い鮮度または再検証、緊急時は対象単位でpurge |
キャッシュとは、結果を保存して後の処理で再利用する仕組み
コンピューター分野のキャッシュ(cache)は、取得や計算に時間がかかるデータを、元の場所より近い場所または高速な保存領域へ置き、次回以降の処理を速くする仕組みです。CPUキャッシュ、DNSキャッシュ、ブラウザキャッシュ、CDNキャッシュ、データベース照会結果のキャッシュなど、用途は幅広くあります。
この記事で扱う中心はWebキャッシュです。RFC 9111のHTTPキャッシュでは、あるリクエストに対する応答メッセージを保存し、後のリクエストへ回答するために再利用します。重要なのは、保存したデータそのものよりも、次の4点です。
キー
URL、メソッド、クエリ、言語、圧縮方式など、どのリクエストと同じ応答かを識別します。
鮮度
保存済み応答を検証なしで再利用できる期間を、max-ageや共有キャッシュ向けのs-maxageなどで決めます。
再検証
staleになった応答が現在も同じか、ETagやLast-Modifiedを使ってオリジンへ確認します。
無効化
更新時にURLを変える、期限を短くする、対象URLやタグをpurgeするなど、旧版を使わない手段を用意します。
消しても再生成できる派生物
画像やHTMLのコピー、API応答、計算結果など、正規データから再取得・再計算できるものです。
失うと業務に影響する元データ
注文、会員、記事原稿、請求記録などはデータベースやファイルストレージへ永続保存します。
リクエストがHIT・MISS・304へ分かれる仕組み
キャッシュはURLだけを見て、保存済みコピーを無条件に返すわけではありません。対象URI、HTTPメソッド、Varyで指定されたリクエストヘッダー、認証やCookie、製品固有のキー規則などから候補を選び、鮮度と再検証条件を評価します。
リクエストを受け取る
例として、ブラウザが GET /assets/app.v8.css を要求します。
対応する保存済み応答を探す
URI、メソッド、Vary対象ヘッダーなどが一致する候補を選びます。なければMISSです。
freshならHITとして再利用する
現在年齢が鮮度寿命を超えておらず、他の条件も満たせば、オリジンへ問い合わせず保存済み応答を使えます。
staleなら条件付きで再検証する
If-None-MatchにETagを付けて送信し、未変更なら304、変更済みなら200と新しい本文を受け取ります。
新しい応答と条件を保存する
保存可能な応答であれば、本文とCache-Control、ETag、Varyなどを保存し、後続リクエストへ備えます。
検証なしで再利用
current_age < freshness_lifetime の間は、保存済み応答をそのまま利用できます。中間キャッシュでは年齢がAgeへ反映されます。
通信はするが本文を送らない
304は完全なオフライン表示ではありません。条件付きリクエストと検証の往復は行い、本文転送だけを省きます。
| 状態 | 意味 | 一般的な動き |
|---|---|---|
| HIT | 再利用できる保存済み応答が見つかった | ブラウザまたは中間キャッシュから返す |
| MISS | 対応する応答がない、または利用できない | 上流・オリジンへ取得しに行く |
| STALE | 鮮度寿命を過ぎた | 原則は再検証。設定により限定的に古い応答を使う場合もある |
| 304 | 保存済み表現は未変更 | 本文を再送せず、保存済み本文を再利用する |
| BYPASS | キャッシュを経由しても保存・再利用対象外 | 認証、Cookie、ルール、明示設定などによりオリジンへ転送する |
CF-Cache-Status、X-Cacheなど独自ヘッダーを使うことがあります。標準のCache-Statusがある場合も、値の意味と出力条件は実装資料を確認してください。キャッシュのメリットと、設計を誤ったときのリスク
キャッシュの価値は「速くなる」だけではありません。オリジンへの到達回数、データ転送量、データベース照会、動的生成を減らせるため、安定性と運用コストにも影響します。ただし、効果とリスクは同じ設定の裏表です。
再利用による4つの効果
- 利用者に近い場所から返し、待ち時間を減らす
- アプリ処理とデータベース照会を減らす
- 同じ本文の繰り返し転送を減らす
stale-if-error等を設計すれば、障害時の限定的な代替応答に使える
速さより先に防ぐ4つの事故
- 価格・在庫・記事が更新後も古いまま残る
- 利用者別ページを共有して情報が漏れる
- 言語や圧縮方式の違いを同じキーで返す
- 全件purge後にMISSが集中し、オリジンが過負荷になる
Webキャッシュの種類は、保存場所と共有範囲で分ける
一つのページでも、ブラウザ、CDN、リバースプロキシ、CMS、アプリケーション、データベースの前後に複数のキャッシュが重なります。「キャッシュを消した」と言うだけでは不十分で、どの層を操作したかを明確にする必要があります。
| 種類 | 保存場所・共有範囲 | 向く対象 | 主な注意点 |
|---|---|---|---|
| ブラウザHTTPキャッシュ | 利用者のブラウザ内。通常はその端末・プロファイルで利用 | 画像、CSS、JavaScript、再検証可能なHTML | 利用者ごとに残り方が違い、強制再読み込みでもCDNは消えない |
| CDN・共有キャッシュ | 複数利用者の手前にある配信拠点・プロキシ | 公開画像、版付き静的ファイル、共有可能なHTML・API | 個人向け応答、キー不足、拠点差、purge範囲に注意 |
| リバースプロキシ | オリジン手前のNginx、Varnish等 | 生成コストが高い公開HTMLやAPI | 認証Cookie、言語、端末差、クエリをどうキーへ含めるか決める |
| CMS・ページキャッシュ | WordPress等が生成済みHTMLを保存 | 同じ入力から同じ公開ページを返す処理 | 下書き、予約公開、権限別表示、更新イベントと失効処理を連携する |
| アプリ・オブジェクトキャッシュ | アプリ内メモリ、Redis等 | 設定、集計、API結果、DB照会結果 | 依存データ更新時の失効、同時生成、メモリ上限を管理する |
| Cache Storage | ブラウザ内でJavaScriptやService Workerが管理 | オフライン対応、アプリシェル、任意の取得戦略 | HTTPキャッシュとは別。自動更新・自動期限切れに頼らずコードで更新・削除する |
私用キャッシュ
一人の利用者を対象とするブラウザキャッシュなど。共有キャッシュより扱える応答は広いものの、機密情報は別途慎重に制御します。
共有キャッシュ
CDNや共有プロキシのように複数利用者で再利用します。公開応答に限定し、利用者差をキーまたは保存禁止で分離します。
bfcache・Service Worker
戻る・進むを高速化するbfcacheやCache Storageは、HTTPキャッシュと同一ではありません。調査時に混同しないよう分けます。
HTTPキャッシュを制御・観測する主要ヘッダー
HTTPでは、保存可否、共有範囲、鮮度、再検証、表現差、現在年齢、通過したキャッシュの処理結果を複数のヘッダーで表します。最初に「公開応答か」「利用者ごとに変わるか」「URLを変更できるか」「何分まで旧版を許容できるか」を決め、それから値を選びます。
| ヘッダー | 役割 | 確認ポイント |
|---|---|---|
Cache-Control | 保存可否、鮮度、共有範囲、stale利用などを指示 | 応答の種類ごとに値を分ける |
ETag | 表現の版を識別する検証子 | If-None-Matchと一致すれば304を返せる |
Last-Modified | 表現の最終更新日時 | If-Modified-Sinceによる条件付き取得に使う |
Vary | 同じURLでも応答を変えるリクエストヘッダーを指定 | Accept-Encoding、Accept-Language等。種類が多すぎるとHITしにくい |
Age | 応答生成から経過した概算秒数 | 共有キャッシュでの年齢を確認する。受信後の単純タイマーではない |
Cache-Status | キャッシュがリクエストをどう処理したかを表す標準ヘッダー | hit、fwd、ttl等。すべての製品が常時出すとは限らない |
Expires | 絶対日時で期限を示す旧来の仕組み | Cache-Controlのmax-ageがある場合は通常そちらを優先する |
Cache-Controlでよく使うディレクティブ
| 値 | 意味 | よく使う場面 |
|---|---|---|
max-age=秒 | 応答生成からfreshとみなせる秒数 | ブラウザを含むキャッシュの鮮度 |
s-maxage=秒 | 共有キャッシュ向けの鮮度を指定 | ブラウザとCDNでTTLを分ける |
public | 共有キャッシュで保存可能であることを明示 | 公開静的ファイル、共有可能な公開応答 |
private | 共有キャッシュへの保存を禁止し、私用キャッシュに限定 | 利用者別ページ、個人化された応答 |
no-cache | 保存は可能だが、再利用前に検証を要求 | 更新されるHTML、常に最新性を確認したい応答 |
no-store | 応答を保存しないよう要求 | 機密性が高く、どのキャッシュにも残したくない応答 |
must-revalidate | stale後は成功した検証なしで再利用しない | 古い状態を返すと不整合になる応答 |
immutable | freshな期間中は内容が変わらないと示す | 内容ハッシュ・版をURLへ含めた静的ファイル |
stale-while-revalidate=秒 | 指定時間、古い応答を返しながら再検証できる | 多少の遅延を許容し、応答待ちを減らしたい公開コンテンツ |
stale-if-error=秒 | 上流エラー時に指定時間、古い応答を利用できる | 障害時も限定的に公開情報を返したい場合 |
no-cacheは保存禁止ではない
保存済み応答を使う前にオリジンへ確認する指示です。ETagと組み合わせれば、変更がないときは304で本文転送を省けます。
no-storeは保存させない
新しい応答を保存しないよう求めます。ただし、後からno-storeを付けても、過去に保存された同URLの応答を一括削除する命令にはなりません。
Cache-Statusは、複数キャッシュを通った処理結果を標準形式で表せます。またRFC 9213はCDN-Cache-Controlのような対象別Cache-Controlフィールドの枠組みを定めています。ただし、実際の対応状況と優先順位はCDN・プロキシの公式資料を確認してください。用途別のCache-Control設定例
次の例は出発点です。すべてのサイトへ同じ値を貼り付けるのではなく、URLを変更できるか、更新後に何秒まで旧版を許容できるか、個人情報を含むか、CDNやブラウザのどちらで再利用したいかを確認して調整します。
1. 内容ハッシュ付きのCSS・JavaScript・画像
長期保存向きapp.8d7c31.cssのように内容変更時にURLも変える静的ファイルは、旧URLを上書きしない前提で長期保存できます。
Cache-Control: public, max-age=31536000, immutable2. 更新されるHTML
再検証向きURLを固定したまま内容が変わる記事やトップページは、保存を許可しつつ再利用前に検証する方法が分かりやすい構成です。
Cache-Control: no-cache
ETag: "page-v42"未変更ならクライアントはIf-None-Match: "page-v42"を送り、サーバーは304を返せます。毎回本文を送るより転送量を抑えられます。
3. 共有可能な公開API
CDN活用同じ入力に同じ公開結果を返し、数分の更新遅延を許容できるAPIでは、ブラウザと共有キャッシュの鮮度を分けられます。
Cache-Control: public, max-age=30, s-maxage=300,
stale-while-revalidate=60, stale-if-error=600
Vary: Accept-Encoding4. 機密性の高い利用者別ページ
保存を避ける決済直後、医療・金融情報、ワンタイム情報など、どのキャッシュにも残したくない応答では保存を避けます。
Cache-Control: private, no-storeすべてのログイン後ページへ機械的にno-storeを付けるのではなく、機密性と戻る操作の体験、再検証で足りるかを個別に判断します。
キャッシュを削除するとどうなる?層ごとの消し方と安全な更新
キャッシュを削除すると、次回は保存済み結果を使えず、元データの取得・再計算・再生成が発生します。適切な設計なら元の注文、会員、記事、画像原本は消えません。ただし、ブラウザの削除画面でCookieやサイトデータまで同時に選ぶと、ログイン状態やローカル保存情報へ影響する場合があります。
| 対象 | 主な削除・更新手段 | 削除後の動き |
|---|---|---|
| ブラウザHTTPキャッシュ | ブラウザ設定、DevToolsのClear browser cache、強制再読み込み | 対象ファイルを再取得するため、最初の表示は転送量と時間が増える |
| CDN | URL、プレフィックス、タグ、ホスト、全件などのpurge API・管理画面 | 次のアクセスがMISSになり、オリジン負荷が増える |
| CMSページキャッシュ | 記事更新イベント、プラグイン機能、対象URL失効 | 次のアクセスでHTMLを再生成する |
| Redis・アプリキャッシュ | 対象キー削除、タグ・世代番号、TTL、イベント連携 | データベース照会や計算をやり直す |
| Cache Storage | Service Workerの更新処理、CacheStorage API、DevTools | コードで定義した取得戦略に従い再取得・再保存する |
更新を早く安全に反映する5つの方法
静的ファイルはURLへ版を含める
app.cssを上書きせず、app.8d7c31.cssのように内容変更でURLも変えます。
HTML・APIは許容反映時間からTTLを決める
毎日更新だから24時間ではなく、公開後に旧版が何分残ってよいかから逆算します。
ETag等で再検証できるようにする
内容が同じなら304、変わっていれば新しい200応答を返し、転送量と鮮度を両立します。
purgeは対象URL・タグ単位を基本にする
全件削除は最終手段にし、更新したページや依存資産だけを失効させます。
MISS集中への備えを用意する
全件purgeや期限切れが重なるときは、事前ウォームアップ、リクエスト集約、オリジン容量、切り戻しを準備します。
キャッシュが効いているか確認する方法
「表示が古い」「HITしない」「ログイン後だけ違う」といった問題は、最初に層を特定し、実際の応答ヘッダーを記録すると切り分けやすくなります。ブラウザの見た目だけで判断せず、同じURLを条件を変えて複数回確認します。
Chrome DevToolsで確認する
- DevToolsのNetworkを開き、対象ページを読み込みます。
- 対象リクエストを選び、HeadersでCache-Control、Age、ETag、Vary、Cache-Statusや製品固有ヘッダーを確認します。
- Sizeや転送表示に「memory cache」「disk cache」、Statusに304が出ているか確認します。
- 初回利用者を再現したいときはDisable cacheを有効にします。これは主にブラウザキャッシュの影響を外す操作で、CDNをpurgeする機能ではありません。
- ログイン有無、言語、クエリ、Cookie、端末条件を変え、別の応答が同じキーで混ざっていないか確認します。
curlで応答ヘッダーを記録する
# 応答ヘッダーだけを取得
curl -I https://example.com/assets/app.v8.css
# 再検証を要求して挙動を比較
curl -I -H 'Cache-Control: no-cache' https://example.com/
# ETagを使った条件付きリクエスト
curl -I -H 'If-None-Match: "page-v42"' https://example.com/リクエスト側のCache-Control: no-cacheは、保存済み応答の削除命令ではありません。経路上のキャッシュへ再検証を求める意図であり、CDNやブラウザの実装・設定によって挙動が異なります。
| 見る項目 | 分かること | 注意点 |
|---|---|---|
Cache-Control | 保存範囲、鮮度、再検証、stale利用 | CDNが独自設定で上書きしていないか確認 |
Age | 共有キャッシュ上での応答年齢 | 値がないだけで未キャッシュとは断定できない |
ETag / 304 | 条件付き再検証が成立しているか | 弱いETag、圧縮差、複数サーバーでの生成差を確認 |
Vary | どのリクエストヘッダーで表現を分けるか | Vary: *や高カーディナリティ値は再利用を難しくする |
Cache-Status | hit、forward理由、残TTL、格納有無など | 出力が任意で、セキュリティ上詳細を隠す実装もある |
| 製品固有ヘッダー | CDN・プロキシ固有のHIT、MISS、BYPASS理由 | 名称と意味は製品資料を優先する |
キャッシュとSEO・Core Web Vitalsの関係
キャッシュそのものに「設定すれば検索順位が上がる」という単独の保証はありません。ただし、適切なブラウザキャッシュ、CDN、サーバー内キャッシュは、サーバー応答とリソース転送を減らし、表示体験を改善する土台になります。
版付き静的資産を長期保存
再訪時のCSS・JavaScript・画像転送を減らし、オリジンやCDNの近い拠点から配信します。サーバー生成が重い公開HTMLは、安全に共有できる範囲でキャッシュします。
古いHTMLを長く残さない
タイトル、本文、価格、構造化データ、canonicalを更新しても、古いHTMLが残れば利用者とクローラーへ旧情報を返します。HTMLは再検証または短いTTLとpurgeを設計します。
キャッシュ設計でよくある失敗と公開前チェックリスト
no-cacheを保存禁止だと思う
保存禁止はno-storeです。no-cacheは再利用前の検証を求めます。
長期TTLのURLへ内容を上書きする
長期保存する静的ファイルは、内容変更時にURLも変えます。
個人向け応答を共有キャッシュへ保存する
認証Cookieがあるから安全と推測せず、private、no-store、bypass、キー設計を明示します。
言語・圧縮・端末差をキーへ反映しない
応答が変わる条件を列挙し、必要なVaryやCDNキーへ含めます。
ブラウザだけ消して「直らない」と判断する
CDN、CMS、リバースプロキシ、Redis、Service Workerを別々に確認します。
HIT率だけを成功指標にする
更新反映、正しさ、エラー、漏えい、オリジン負荷、応答時間も同時に観測します。
公開前に確認する10項目
- 公開・利用者別・機密の3分類ができている
- 同じURLで応答が変わる条件を列挙した
- 静的資産に内容ハッシュまたは版を付けている
- HTML・APIの旧版許容時間を決めている
- ETagまたはLast-Modifiedで再検証できる
- 個人向け応答が共有キャッシュへ入らない
- 更新イベントとpurge・失効処理が連携している
- ログイン有無、言語、クエリ、端末差をテストした
- 全件purge後のオリジン負荷を想定した
- 問題発生時のbypass・切り戻し手順がある
キャッシュについてよくある質問
キャッシュとは簡単に言うと何ですか?
過去に取得・計算した結果を保存し、同じ条件の後続処理で再利用する仕組みです。WebではブラウザやCDNがHTTP応答を保存し、転送やサーバー処理を減らします。
キャッシュを削除すると元のデータも消えますか?
適切な設計なら消えません。キャッシュはデータベースやファイルなどの正規データから再取得・再生成できる派生物です。ただし、ブラウザでCookieやサイトデータも同時に削除すると、ログイン状態などに影響することがあります。
Cache-Control: no-cacheは保存を禁止しますか?
保存を禁止しません。no-cacheは保存済み応答を再利用する前に検証するよう求めます。保存自体を禁止する指示はno-storeです。
304 Not Modifiedはネットワーク通信なしという意味ですか?
いいえ。条件付きリクエストと検証の通信は発生しています。サーバーが未変更と判断したため本文を再送せず、保存済み本文を再利用した状態です。
ブラウザの強制再読み込みでCDNキャッシュも消えますか?
通常は消えません。強制再読み込みは主にブラウザ側の取得方法を変える操作で、CDNの保存済み応答を削除するにはCDNの管理画面やAPIなどでpurgeします。
毎日更新するページならmax-age=86400でよいですか?
更新直前に保存された応答は、公開後も長く残る可能性があります。更新間隔ではなく、旧版を許容できる時間、再検証、版付きURL、purge手段からTTLを決めます。
Cache-Controlを付けなければキャッシュされませんか?
そうとは限りません。明示的な鮮度情報がなくても、キャッシュが更新日時などから鮮度を推測する場合があります。意図を伝えるために応答の種類ごとに明示的な方針を設定します。
キャッシュHIT率が高いほど良い設定ですか?
HIT率だけでは判断できません。古い価格や他人向けの応答を高いHIT率で返しても失敗です。正しさ、漏えい防止、更新反映時間、オリジン負荷、応答時間を合わせて評価します。
確認した標準仕様・公式資料
HTTPキャッシュの意味と制御は標準仕様を優先し、ブラウザ・CDN・検索関連の実装や確認方法は各公式資料で照合しました。CDN、CMS、リバースプロキシでは独自ルールがあるため、実運用では利用製品の資料も併せて確認してください。
- RFC 9111 — HTTP Caching
- RFC 9110 — HTTP Semantics
- RFC 9211 — The Cache-Status HTTP Response Header Field
- RFC 9213 — Targeted HTTP Cache Control
- RFC 8246 — HTTP Immutable Responses
- RFC 5861 — stale-while-revalidate / stale-if-error
- MDN Web Docs — HTTP caching
- MDN Web Docs — Cache-Control
- MDN Web Docs — Cache API
- Chrome for Developers — Network features reference
- Cloudflare Docs — Purge cache
- Google Search Central — Core Web Vitals
事実確認日:2026年7月29日。標準仕様と実装資料の内容が異なる場合、仕様上の意味と製品固有の挙動を分けて記載しています。
キャッシュは、保存場所より先に再利用条件と更新方法を決める
キャッシュとは、過去の応答や計算結果を保存し、条件が合う後続処理で再利用する仕組みです。ブラウザ、CDN、リバースプロキシ、CMS、アプリ内では、共有範囲、キー、消し方、観測方法が異なります。
静的ファイルは版付きURLで長期保存し、更新されるHTMLやAPIは鮮度と再検証を設計し、個人向け応答は共有しない。 さらに、対象単位のpurge、MISS集中への備え、ログイン・言語・公開直後の検証、切り戻しまで用意すれば、速度と正しさを両立できます。