運用使用者代理程式用戶端提示,改善使用者隱私和開發人員體驗

User-Agent Client Hints 是 Client Hints API 的一項新擴充項目,讓開發人員能夠以保護隱私權和符合使用者需求的方式,存取使用者瀏覽器的相關資訊。

用戶端提示可讓開發人員主動要求使用者提供的資訊, 而不需要將其從使用者代理程式 (UA) 剖析 字串。提供這個替代路徑是最終 降低 User-Agent 字串的精細程度

瞭解如何更新需要剖析 改用 User-Agent Client Hints 的使用者代理程式字串。

背景

網路瀏覽器提出要求時,會納入瀏覽器和 以便伺服器啟用分析和自訂回應功能。 這是在 1996 中的定義 (HTTP/1.0 的 RFC 1945),其中您可以 找出使用者代理程式字串的原始定義,其中包含 範例:

User-Agent: CERN-LineMode/2.15 libwww/2.17b3

此標題旨在按照重要性 (例如 瀏覽器或程式庫) 和註解 (例如版本)。

User-Agent 字串的狀態

在介入的十年期間,這個字串又累積了各種 發出請求之用戶端的詳細資料 (以及因反向作業而產生的完整資料 相容性)。在查看 Chrome 目前的使用者代理程式時 字串:

Mozilla/5.0 (Linux; Android 10; Pixel 3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4076.0 Mobile Safari/537.36

上述字串包含使用者的作業系統相關資訊,以及 版本、裝置型號、瀏覽器品牌和完整版本等等都足以判定 會推測這是行動瀏覽器,而不用提及其他 以及瀏覽器版本

我們結合這些參數及可能的值更多元 代表 User-Agent 字串可包含足夠的資訊 明確識別使用者

User-Agent 字串可實現許多合法的用途。 而且這對開發人員和網站擁有者來說至關重要不過, 也須保障使用者的不受隱密追蹤方式保護 並預設傳送通用 Analytics 資訊。

使用使用者代理程式時,也有提高網頁相容性 字串。它是非結構化的,因此剖析會產生不必要的複雜性 這通常是因為錯誤和網站相容性問題,對使用者有害 這類問題也會對較不常見的瀏覽器使用者造成極大影響, 可能無法測試網站的設定。

全新的使用者代理程式用戶端提示隆重登場

使用者代理程式用戶端提示 使用者仍可存取相同的資訊,但以更具隱私權的方式, 讓瀏覽器最終能減少 User-Agent 字串的預設值 廣播所有內容用戶端提示會強制執行 模型必須要求瀏覽器提供一組用戶端資料 (提示),瀏覽器則會將自己的政策或使用者設定套用至 決定傳回的資料。也就是說,與其公開所有 在預設狀態下,使用者代理程式資訊 值得稽核的風格開發人員也能受益於更簡單的 API, 運算式!

目前的用戶端提示組合主要描述瀏覽器的顯示畫面與 連線功能。詳情請參閱使用用戶端提示自動選取資源。 但在此快速複習一下相關流程

伺服器會透過標頭要求特定的用戶端提示:

⬇️ 伺服器回應

Accept-CH: Viewport-Width, Width

或中繼標記:

<meta http-equiv="Accept-CH" content="Viewport-Width, Width" />

瀏覽器隨後可選擇在後續頁面,將下列標頭傳回 要求:

🗓?️ 後續要求

Viewport-Width: 460
Width: 230

伺服器可以選擇不同的回應,例如 合適的解決方法。

User-Agent Client Hints 使用 Sec-CH-UA 擴大屬性範圍 前置字串,此要求可透過 Accept-CH 伺服器回應標頭指定。所有 詳細資訊,就從說明和 然後深入研究完整提案

Chromium 89 版的使用者代理程式用戶端提示

自 89 版起,Chrome 已預設啟用「使用者代理程式用戶端提示」。

根據預設,瀏覽器會傳回瀏覽器品牌、重要 / 主要版本、 平台,以及一個指標 (如果客戶使用的是行動裝置):

❌️ 所有要求

Sec-CH-UA: "Chromium";v="93", "Google Chrome";v="93", " Not;A Brand";v="99"
Sec-CH-UA-Mobile: ?0
Sec-CH-UA-Platform: "macOS"
敬上

使用者代理程式回應與要求標頭

⬇️ 回應 Accept-CH
⬇️ 要求標頭
➜️ 要求
範例值
說明
Sec-CH-UA "Chromium";v="84",
"Google Chrome";v="84"
瀏覽器品牌清單及其重要版本。
Sec-CH-UA-Mobile ?1 布林值,指出瀏覽器是否在行動裝置上 (?1 代表 true) 或否 (?0 代表 false)。
Sec-CH-UA-Full-Version "84.0.4143.2" [已淘汰]瀏覽器的完整版本。
Sec-CH-UA-Full-Version-List "Chromium";v="84.0.4143.2",
"Google Chrome";v="84.0.4143.2"
瀏覽器品牌及其完整版本清單。
Sec-CH-UA-Platform "Android" 裝置的平台,通常是作業系統 (OS)。
Sec-CH-UA-Platform-Version "10" 平台或 OS 的版本。
Sec-CH-UA-Arch "arm" 裝置的基礎架構。儘管這可能與顯示網頁無關,不過網站會需要提供預設格式的下載項目。
Sec-CH-UA-Model "Pixel 3" 裝置型號。
Sec-CH-UA-Bitness "64" 基礎架構的位元程度 (即整數或記憶體位址的大小,以位元為單位)

廣告交易平台範例

廣告交易平台範例會像這樣:

🗓?️ 瀏覽器的初始要求
瀏覽器要求 /downloads 並傳送預設的基本使用者代理程式。

GET /downloads HTTP/1.1
Host: example.site

Sec-CH-UA: "Chromium";v="93", "Google Chrome";v="93", " Not;A Brand";v="99"
Sec-CH-UA-Mobile: ?1
Sec-CH-UA-Platform: "Android"

⬇️ 伺服器回應
伺服器將網頁傳回 要求提供完整瀏覽器版本和平台資訊

HTTP/1.1 200 OK
Accept-CH: Sec-CH-UA-Full-Version-List

🎨?️ 後續要求
瀏覽器會授權伺服器存取 並在後續所有後續事件中 要求。

GET /downloads/app1 HTTP/1.1
Host: example.site

Sec-CH-UA: " Not A;Brand";v="99", "Chromium";v="98", "Google Chrome";v="98"
Sec-CH-UA-Mobile: ?1
Sec-CH-UA-Full-Version-List: " Not A;Brand";v="99.0.0.0", "Chromium";v="98.0.4738.0", "Google Chrome";v="98.0.4738.0"
Sec-CH-UA-Platform: "Android"

JavaScript API

除了標頭外,您也可以透過 JavaScript 存取使用者代理程式,步驟如下: navigator.userAgentData。預設的 Sec-CH-UASec-CH-UA-MobileSec-CH-UA-Platform 標頭資訊可透過 brandsmobile 屬性,分別為:

// Log the brand data
console.log(navigator.userAgentData.brands);

// output
[
  {
    brand: 'Chromium',
    version: '93',
  },
  {
    brand: 'Google Chrome',
    version: '93',
  },
  {
    brand: ' Not;A Brand',
    version: '99',
  },
];

// Log the mobile indicator
console.log(navigator.userAgentData.mobile);

// output
false;

// Log the platform value
console.log(navigator.userAgentData.platform);

// output
"macOS";

其他值可透過 getHighEntropyValues() 呼叫存取。 「高熵」詞是資訊熵的參照 word - 這些值呈現的使用者資訊量 。如同要求額外的標頭,會由瀏覽器解決 系統會傳回哪些值 (如果有的話)

// Log the full user-agent data
navigator
  .userAgentData.getHighEntropyValues(
    ["architecture", "model", "bitness", "platformVersion",
     "fullVersionList"])
  .then(ua => { console.log(ua) });

// output
{
   "architecture":"x86",
   "bitness":"64",
   "brands":[
      {
         "brand":" Not A;Brand",
         "version":"99"
      },
      {
         "brand":"Chromium",
         "version":"98"
      },
      {
         "brand":"Google Chrome",
         "version":"98"
      }
   ],
   "fullVersionList":[
      {
         "brand":" Not A;Brand",
         "version":"99.0.0.0"
      },
      {
         "brand":"Chromium",
         "version":"98.0.4738.0"
      },
      {
         "brand":"Google Chrome",
         "version":"98.0.4738.0"
      }
   ],
   "mobile":false,
   "model":"",
   "platformVersion":"12.0.1"
}

示範

您可以在自己的裝置上試用標頭和 JavaScript API,網址為: user-agent-client-hints.glitch.me.

提示生活時間與重設

透過 Accept-CH 標頭指定的提示將在 或在指定不同提示組合前,指定 Cookie 工作階段。

也就是說,如果伺服器傳送下列內容:

⬇️ 回覆

Accept-CH: Sec-CH-UA-Full-Version-List

接著,瀏覽器會針對所有要求傳送 Sec-CH-UA-Full-Version-List 標頭 ,直到瀏覽器關閉為止

🗓?️ 後續要求

Sec-CH-UA-Full-Version-List: " Not A;Brand";v="99.0.0.0", "Chromium";v="98.0.4738.0", "Google Chrome";v="98.0.4738.0"

不過,如果收到另一個 Accept-CH 標頭,則可完全 取代瀏覽器目前傳送的提示。

⬇️ 回覆

Accept-CH: Sec-CH-UA-Bitness

🗓?️ 後續要求

Sec-CH-UA-Platform: "64"

你先前要求的「Sec-CH-UA-Full-Version-List不會傳送

建議您將 Accept-CH 標頭視為指定完整的 提示網址,表示瀏覽器接著會將指定的提示傳送給您 該頁面中的所有子資源雖然提示會保持顯示 網站不應仰賴或假設這類連結會獲得傳送。

您也可以透過這項功能,有效清除瀏覽器傳送的所有提示。 只要在回應中傳送空白的 Accept-CH 即可。建議將這項資訊新增至任何地方 使用者重設偏好設定或登出網站。

這個模式也符合透過 <meta http-equiv="Accept-CH" …> 標記。要求的提示只會在 要求,不是由網頁發起,而非後續瀏覽。

提示範圍和跨來源要求

根據預設,系統只會在相同來源的要求中傳送「用戶端提示」。也就是說 如果在 https://example.com 上要求特定提示,但資源 是希望最佳化的https://downloads.example.com使用者不會 接收任何提示

如要允許跨來源要求顯示提示,必須為每個提示和來源指定 由 Permissions-Policy 標頭指定。如要將這個方塊套用至「使用者代理程式用戶端提示」,您必須 我需要小寫提示,並移除 sec- 前置字元。例如:

⬇️ 來自「example.com」的回覆

Accept-CH: Sec-CH-UA-Platform-Version, DPR
Permissions-Policy: ch-ua-platform-version=(self "downloads.example.com"),
                    ch-dpr=(self "cdn.provider" "img.example.com");

❌️ 要求傳送至 downloads.example.com

Sec-CH-UA-Platform-Version: "10"

❌️ 要求 cdn.providerimg.example.com

DPR: 2

哪裡可以使用使用者代理程式用戶端提示?

最快的做法是,您應重構任何正在剖析的例項 為 存取相同的資訊 (例如 navigator.userAgentnavigator.appVersion、 或 navigator.platform) 改用「使用者代理程式用戶端提示」。

要進一步執行這類動作,請重新檢查使用 User-Agent 的方式 並替換為其他方法。通常,您可以 能夠達成相同的目標 或回應式設計。 善用「使用者代理程式」資料的關鍵問題在於 您要檢查的屬性與行為之間的對應關係 這是維護負擔 並保持最新狀態

請記住,User-Agent Client Hints 存放區列出了一些適用於網站的有效用途

使用者代理程式字串會受到什麼影響?

這項計劃是要透過減少 現有使用者代理程式字串揭露的識別資訊量 不會造成現有網站意外中斷介紹使用者代理程式 現在,您可以透過「客戶提示」 來瞭解並測試 功能,在對使用者代理程式字串進行任何變更之前。

Eventually、 系統會減少 User-Agent 字串中的資訊,以維持 舊版格式,但只提供相同的高階瀏覽器和功能 更新版本資訊。對 Chromium 來說 延後到至少 2022 年,為生態系統提供額外時間 評估新的「使用者代理程式用戶端提示」功能。

您可以啟用 Chrome 93 的 about://flags/#reduce-user-agent 旗標 (注意:這個標記是 Chrome 84 至 92 版中名為 about://flags/#freeze-user-agent)。這將 基於相容性因素,會傳回包含歷史項目的字串,但 及消毒的具體內容例如:

Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.0.0 Mobile Safari/537.36

縮圖來源:Sergey Zolkin禁用