Cache-Control: no-cache は、名前から「キャッシュしない」と読まれやすいです。仕様上の意味は違います。レスポンスの保存自体は許したうえで、キャッシュ済みの応答を使う前にオリジンサーバへ再検証しなければならない、という指示です。
本当に保存させたくない場合に使うのが no-store です。機密データをどこにも残したくないつもりで no-cache だけを付けると、ブラウザなどのキャッシュに残る可能性があります。意図が保存禁止なら no-store を選びます。
共有キャッシュ(CDN)だけに置きたくない場合は private です。no-cache とも no-store とも別の指示です。
Pragma: no-cache では足りない
2020 年ごろ、Twitter のダイレクトメッセージが Firefox のブラウザキャッシュに残る問題がありました。DM 応答には Cache-Control が無く、代わりに Pragma: no-cache が付いていました。
Pragma は HTTP/1.0 時代のキャッシュ制御用ヘッダで、いまは Cache-Control の互換用として残っています。Pragma: no-cache は仕様上リクエスト向けの意味であり、レスポンスの保存禁止にはなりません。no-cache 自体も保存禁止ではないので、残したくない応答には Cache-Control: no-store を明示します。
参考文献
- Cache-Control - MDN —
no-cacheは保存可・再利用前に再検証、no-storeは保存禁止 - Twitter Direct Message Caching and Firefox - Mozilla Hacks —
Pragma: no-cacheでは不十分で DM がキャッシュに残った事例(Editor’s Note) - HTTPWTF: No-cache means “do cache” — 誤解しやすいキャッシュディレクティブの整理