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-UA
、Sec-CH-UA-Mobile
和
Sec-CH-UA-Platform
標頭資訊可透過 brands
和
mobile
屬性,分別為:
// 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.provider
或 img.example.com
DPR: 2
哪裡可以使用使用者代理程式用戶端提示?
最快的做法是,您應重構任何正在剖析的例項
為
存取相同的資訊 (例如 navigator.userAgent
、navigator.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 為 禁用