HTTP 客戶端提示
客戶端提示(Client hints)是一組 HTTP 請求頭欄位,伺服器可以主動向客戶端請求這些欄位,以獲取有關裝置、網路、使用者以及使用者代理特定偏好的資訊。伺服器可以根據客戶端選擇提供的資訊來確定傳送哪些資源。
概述
伺服器必須使用 Accept-CH 頭欄位來宣佈它支援客戶端提示,指定它感興趣接收的提示。當支援客戶端提示的客戶端收到 Accept-CH 頭欄位時,它可以選擇在其後續請求中附加部分或全部列出的客戶端提示頭欄位。
例如,在下面的響應中跟隨 Accept-CH 之後,客戶端可以在所有後續請求中附加 Width、Downlink 和 Sec-CH-UA 頭欄位。
Accept-CH: Width, Downlink, Sec-CH-UA
這種方法是高效的,因為伺服器只請求它能夠有效處理的資訊。它也相對“保護隱私”,因為由客戶端決定可以安全共享哪些資訊。
有一小部分低熵客戶端提示頭欄位,即使未請求,客戶端也可能傳送。
注意:客戶端提示也可以透過在 HTML 中使用帶有 http-equiv 屬性的 <meta> 元素來指定。
<meta http-equiv="Accept-CH" content="Width, Downlink, Sec-CH-UA" />
快取與客戶端提示
決定響應中傳送哪些資源的客戶端提示通常也應該包含在受影響響應的 Vary 頭欄位中。這確保了為提示頭欄位的每個不同值快取不同的資源。
Vary: Accept, Width, ECT
對於值經常變化的客戶端提示頭欄位,您可能更傾向於省略指定 Vary 或使用其他策略,因為這實際上會使資源不可快取。(為每個唯一值建立一個新的快取條目。)這尤其適用於網路客戶端提示,如 Downlink 和 RTT。有關更多資訊,請參閱 HTTP 快取 > Vary。
提示生命週期
伺服器在 Accept-CH 響應頭中指定它感興趣的客戶端提示頭欄位。使用者代理將請求的客戶端提示頭欄位(或至少是它希望與該伺服器共享的子集)附加到當前瀏覽會話中的所有後續請求中。
換句話說,對特定提示集的請求在瀏覽器關閉之前不會過期。
伺服器可以透過重新發送帶有新列表的 Accept-CH 響應頭來替換它感興趣接收的客戶端提示集。例如,要停止請求任何提示,它將傳送帶有空列表的 Accept-CH。
注意:特定源的客戶端提示集也可以透過傳送針對該源內部 URL 的 Clear-Site-Data: "clientHints" 響應頭來清除。
低熵提示
客戶端提示大致分為高熵提示和低熵提示。低熵提示是那些不會洩露太多可能用於為使用者建立指紋的資訊的提示。根據許可權策略,它們可能預設在每個客戶端請求中傳送,無論伺服器 Accept-CH 響應頭如何。低熵提示有:
高熵提示
高熵提示是那些有可能洩露更多可用於使用者指紋識別的資訊的提示,因此受到限制,使用者代理可以決定是否提供它們。該決定可能基於使用者偏好、許可權請求或許可權策略。所有非低熵提示的客戶端提示都被認為是高熵提示。
關鍵客戶端提示
關鍵客戶端提示是指應用響應可能會顯著改變渲染頁面,可能以令人不適或影響可用性的方式,因此必須在內容渲染之前應用。例如,Sec-CH-Prefers-Reduced-Motion 通常被視為關鍵提示,因為它可能會顯著影響動畫的行為,並且選擇此偏好的使用者需要將其設定好。
伺服器可以使用 Critical-CH 響應頭與 Accept-CH 一起指定一個被接受的客戶端提示也是一個關鍵客戶端提示(Critical-CH 中的頭欄位也必須出現在 Accept-CH 中)。接收帶有 Critical-CH 響應的使用者代理必須檢查原始請求中是否傳送了指示的關鍵頭欄位。如果未傳送,則使用者代理將重試請求而不是渲染頁面。此方法確保即使未包含在第一個請求中,或者伺服器配置發生更改,使用關鍵客戶端提示設定的客戶端偏好也始終會被使用。
例如,在這種情況下,伺服器透過 Accept-CH 告訴客戶端它接受 Sec-CH-Prefers-Reduced-Motion,並且 Critical-CH 用於指定 Sec-CH-Prefers-Reduced-Motion 被視為關鍵客戶端提示。
HTTP/1.1 200 OK
Content-Type: text/html
Accept-CH: Sec-CH-Prefers-Reduced-Motion
Vary: Sec-CH-Prefers-Reduced-Motion
Critical-CH: Sec-CH-Prefers-Reduced-Motion
注意:我們還在 Vary 頭欄位中指定了 Sec-CH-Prefers-Reduced-Motion,以指示瀏覽器所提供的內容將根據此頭欄位值而不同,即使 URL 保持不變,因此瀏覽器不應僅僅使用現有的快取響應,而應單獨快取此響應。Critical-CH 頭欄位中列出的每個頭欄位也應出現在 Accept-CH 和 Vary 頭欄位中。
由於 Sec-CH-Prefers-Reduced-Motion 是一個關鍵提示,且未包含在原始請求中,客戶端會自動重試請求——這次透過 Sec-CH-Prefers-Reduced-Motion 告訴伺服器它對減少運動動畫有使用者偏好。
GET / HTTP/1.1
Host: example.com
Sec-CH-Prefers-Reduced-Motion: "reduce"
提示型別
使用者代理客戶端提示
使用者代理(UA)客戶端提示頭欄位允許伺服器根據使用者代理(瀏覽器)、作業系統和裝置來改變響應。有關 Sec-CH-UA-* 頭欄位的列表,請參閱使用者代理客戶端提示頭欄位。
客戶端提示可透過 User Agent Client Hints API 供網頁 JavaScript 使用。
注意:伺服器目前透過解析 User-Agent 頭欄位獲取大部分相同的資訊。由於歷史原因,此頭欄位包含大量基本不相關的資訊,以及可能用於識別特定使用者的資訊。UA 客戶端提示提供了一種更高效、更保護隱私的方式來獲取所需資訊。它們最終有望取代這種舊方法。
注意:使用者代理客戶端提示在 Fenced Frames 內不可用,因為它們依賴於 Permissions Policy 委託,這可能導致資料洩露。
使用者偏好媒體特性客戶端提示
使用者偏好媒體特性客戶端提示允許伺服器根據使用者代理對 CSS 媒體特性(例如顏色方案或減少運動)的偏好來改變響應。頭欄位包括:Sec-CH-Prefers-Reduced-Motion、Sec-CH-Prefers-Color-Scheme。
裝置客戶端提示
裝置客戶端提示允許伺服器根據裝置特性(包括可用記憶體和螢幕屬性)來改變響應。頭欄位包括:Device-Memory、Width、Viewport-Width。
網路客戶端提示
網路客戶端提示允許伺服器根據使用者的選擇、網路頻寬和延遲來改變響應。頭欄位包括:Save-Data、Downlink、ECT、RTT。
另見
- 客戶端提示頭欄位
VaryHTTP 頭欄位- 客戶端提示基礎設施
- User Agent Client Hints API
- 透過使用者代理客戶端提示改善使用者隱私和開發者體驗 (developer.chrome.com)