HTTP 快取(HTTP caching)
如果說網頁快取是「就近留副本」的想法,HTTP 快取就是網路實際用來安全做這件事的規則書。可以把它想成麵包店貼在麵包上的有效期限貼紙:店家(伺服器)告訴每位顧客(瀏覽器或代理)這個項目能放多久、過期時該怎麼檢查、以及是否真的需要新一批。HTTP 快取是一組回應標頭(伺服器在回覆上附帶的欄位),告訴各快取:這個回應可不可以儲存、能在不再詢問的情況下重用多久、以及有疑慮時該如何便宜地重新驗證。
它建立在兩個互補的想法上。新鮮度(freshness):伺服器可以為回應蓋上一個到期時間,用 Cache-Control 標頭(例如 Cache-Control: max-age=3600 表示可用一小時),或用較舊的 Expires 標頭(一個絕對日期)。當所存副本仍新鮮時,快取可以完全不發網路請求就提供它。驗證(validation):一旦副本過時,快取不會盲目丟棄它——它會送出一個條件式請求,用伺服器先前給的驗證子(一個 ETag 或一個 Last-Modified 日期)詢問「這個變了嗎?」。若沒變,伺服器回覆 304 Not Modified,內文是空的,快取就重用所存副本。那個 304 很小,所以即使是過時的副本,確認起來也很便宜。
為什麼重要:這些標頭讓瀏覽器快取、代理與 CDN 在沒有中央協調者的情況下也能合作——伺服器宣告政策,路徑上每個快取都遵守它。把它們設對是一門真功夫:太積極,使用者會看到過時頁面(常見錯誤,常用「內容一變就改 URL」這招修正,稱為 cache busting);太保守,你又會浪費往返去重新驗證那些很少變的東西。要注意 Cache-Control 也帶有安全指令,像 no-store(絕不保留)與 private(只有使用者自己的瀏覽器可快取,共用代理不行),用來保護敏感回應。
伺服器送出一個 CSS 檔,帶 Cache-Control: max-age=86400 與 ETag: "v7"。一天之內,瀏覽器不發請求就重用它。之後,瀏覽器詢問 If-None-Match: "v7";若檔案未變,伺服器回 304 Not Modified——不再重送檔案內文。
新鮮度省去請求;驗證讓確認過時副本變得便宜。
HTTP 快取管的是重用,不是保密。它不加密任何東西;標記為可快取的回應,仍可被任何儲存它的人讀取。敏感資料要用 private/no-store,機密性則要靠 TLS(HTTPS)。