Cache-Control、ETag、条件付きリクエストによるブラウザキャッシュの仕組みを可視化
ブラウザキャッシュは、以前取得したWebリソースをローカルに保存し、再アクセス時のネットワーク通信を省略する仕組みです。HTTPレスポンスヘッダー(Cache-Control、ETag等)でキャッシュの有効期限や検証方法を制御します。冷蔵庫に例えてみましょう。毎回スーパーに買い物に行く代わりに、冷蔵庫(キャッシュ)に食材を保存しておけば、すぐに料理を始められます。ただし賞味期限(max-age)が切れたら、まだ食べられるか確認(条件付きリクエスト)してから使うか、新しいものを買い直す(200 OK)必要があります。
キャッシュはWebパフォーマンスの最も効果的な最適化手法の一つです。適切に設定すれば、ページロード時間を大幅に短縮し、サーバー負荷を劇的に削減できます。特にCSS・JS・画像などの静的アセットは、長期間キャッシュすることで初回以降のアクセスがほぼ瞬時になります。上のツールで「キャッシュヒット」シナリオを再生すると、サーバーにリクエストを送信せずにレスポンスが返る様子が確認できます。「条件付きリクエスト」シナリオでは、304 Not Modifiedによる帯域節約の仕組みが確認できます。
ブラウザがリソースをリクエストしたとき、キャッシュをどう扱うかの判定フローです。
| ディレクティブ | 説明 |
|---|---|
| max-age=N | レスポンスがN秒間有効。この間はサーバーに問い合わせずキャッシュを使用。例: max-age=3600(1時間) |
| no-cache | キャッシュに保存するが、使用前に毎回サーバーに検証(条件付きリクエスト)が必要。「キャッシュするな」ではなく「検証しろ」の意味 |
| no-store | キャッシュに一切保存しない。機密データ(口座残高、個人情報等)に使用。最も厳格なディレクティブ |
| public | CDN等の共有キャッシュに保存可。認証が必要なレスポンスでも共有キャッシュに保存したい場合に明示的に指定 |
| private | ブラウザのキャッシュにのみ保存可。CDN等の共有キャッシュには保存されない。ユーザー固有のデータに使用 |
| must-revalidate | キャッシュが古くなったら必ずサーバーに検証する。オフライン時に古いキャッシュを使うことを禁止 |
| s-maxage=N | 共有キャッシュ(CDN等)専用のmax-age。ブラウザのmax-ageとは独立に設定でき、CDNのキャッシュ期限を別途制御 |
| immutable | リソースが変更されないことを宣言。条件付きリクエストも送信しない。ハッシュ付きファイル名のアセットに最適 |