[簡單說] Browser Cache (瀏覽器快取) 的兩三事

把複雜的事情簡單說
這裡只簡略講,所以可以視為入門,
師傅帶入門後,進階的修行就要看各人了

網頁快取與快取分層

【提要】

網頁快取:內容留存一份,方便下次取用
網頁快取的目的:節省流量、節省時間
快取分層:
Browser (local storage) -> proxy server / CDN -> Web Server -> Cache Server -> DB Server

【說明】

快取的目的就是要節省流量,加速反應時間,
因此網頁常用但不常變動的資料(如圖片、圖示),
通常會在本地端有暫存或備份。
這個暫存的動作,就是快取 (Cache)。

網路的世界中的動作稱為 Request,
每個 Request 經過的節點會包含 Browser -> proxy server -> Web Server -> Cache Server -> DB Server 等。

網路世界中,所有的動作都有成本(時間 / 流量),
為了節省成本,在經過的節點會有相關的暫存機制。

快取分層

【說明】

下圖為 AWS 針對快取與相關機制提供的概觀圖,
從 Users 到 Database (DB),
途中會經過 Devices (Mobile / Desktop) / Internet / Web Content / Applications 等節點,
表格內則有提到 AWS 在對應的節點有提供的快取服務。

舉例來說,Redis 是很常見的快取資料庫,
AWS 在 Web / Applications / DB 層,皆有提供 Redis 服務,
實務上則依照業務需求或商業邏輯使用,不一定在每一層都會有 Redis 快取。

本文提到的 Browser 主要指 Device 端的快取,
通常指 Browser (瀏覽器) 自身的 Local Storage。

(資料來源:快取概觀)

網頁快取機制與參數

【提要】

如何判斷 Request 是否使用快取?
有兩個判斷依據:過期時間、內容變動。

  1. 判斷過期時間 => Expires / Cache-Control 

    Header

    資料

    Expires

    過期時間

    Cache-Control

    public:公開的資源,可以被所有節點暫存
    private:私有的資源,只被允許儲存成使用者的本地快取
    no-cache:有 Cache,使用前會發 Request 問是否過期
    no-store:完全不 Cache
    max-age:快取過期秒數
    Last-Modified / If-Modified-Since

  2. 判斷資料是否變動了 => ETag / If-None-Match

【補充說明】

  1. 當 Request 的 Header 中包含了 expires 與 max-age 時,會以 max-age 為優先。
用戶端行為與網頁快取

有 Cache 可使用的狀況下:

動作 Http Status 網路流量 反應速度
輸入網址 / 回上一步 200 OK (from cache) 少(0)
F5 / 畫面重整 304 Not Modified
Ctrl + F5 200 OK
參考文件

更詳細的說明可以參考以下文件:

  1. 循序漸進理解 HTTP Cache 機制
  2. HTTP缓存控制小结
  3. 前端三十|23. [FE] 網頁的快取機制是怎麼運作的?
  4. [不是工程師] 讓網站速度飛快的秘密,你了解什麼是網頁快取(Cache)嗎?
  5. Browser Cache
  6. Reverse Proxy