欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

现代浏览器中设备检测的未来:用户代理客户端提示

程序员文章站 2022-04-28 22:32:28
...

  多年来,User-Agent HTTP头被用来检测浏览器和设备信息。此外,随着对新属性需求的增加,头的大小也显著增加。这也会影响用户的隐私,因为这些数据在默认情况下也会被发送到Web服务器。

  最近,浏览器引入了用户代理客户端提示(Hints),并承诺解决这些问题。本文将探讨为什么我们需要一种新的方法,以及我们应该了解的关于用户代理客户端提示的内容。

  为什么我们需要用户代理客户端提示

  最初,仅User-Agent标头包含用户的浏览器版本和操作系统。但是随着需求的增加,新的浏览器版本支持像设备信息和架构这样的属性。

  Mozilla/5.0 (Linux; Android 10; OnePlus 6T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4076.0 Mobile Safari/537.36

  如果我们采用上面的示例字符串,就可以提取一些关于客户机的信息。因此,有报告称使用User-Agent字符串进行隐蔽跟踪。

  然而,我们不能只删除User-Agent字符串,因为它负责众多有效的用例,如差异化服务、市场份额分析、内容适配。

  因此,需要保护用户的隐私,防止隐蔽的跟踪方法,同时保持用户文凭代理头的向后兼容性。

  用户代理客户端提示(User-Agent Client Hints)简介

  引入了User-Agent Client Hints作为User-Agent字符串的替代方法,它允许在保护用户隐私的同时访问相同的数据。

  与User-Agent字符串不同,默认情况下,User-Agent Client Hints不会将所有数据传输到服务器。

  User-Agent Client Hints方法引入了一个三步过程,以在浏览器和服务器之间传输相关信息:

  Step 1

  首先,客户端(浏览器)向服务器发送一个没有任何提示的请求。这就是最初的页面加载请求或导航。

  Step 2

  然后,服务器通过请求有关客户端的必要数据进行响应。该响应包括一个 Accept-CH 标头,它负责让客户端知道服务器的需求。

  Accept-CH: Viewport-Width, Width</code>

  如果响应包含上面的 Accept-CH 标头,则意味着服务器需要知道客户端设备的视口宽度和宽度。

  Step 3

  客户端收到服务器的响应后,它将决定需要传输的内容,授予对相关数据的访问权限,并在所有后续请求中发回。

  Viewport-Width: 560

  Width: 340

  如果您熟悉请求和响应标头,则不会发现上述机制有任何新变化。

  除了采用上述通信机制外,User-Agent Client Hints还允许使用多个新属性。

  这些新属性以Sec-CH-UA为前缀,我们可以在Accept-CH服务器响应标头中使用它们,以请求比以前更多的详细信息。

  以下是一组新引入的Client Hints:

  Sec-CH-UA:您可以通过此提示请求浏览器品牌及其重要版本的列表。 (例如:"Google Chrome"; v=“84”)Sec-CH-UA-Platform:设备的平台,通常是操作系统。(例如:”Windows”)Sec-CH-UA-Platform-Version:平台或操作系统的版本。Sec-CH-UA-Arch:设备的基础架构。(例如:ARM64)Sec-CH-UA-Model:设备型号。(例如:"OnePlus 6”)Sec-CH-UA-Mobile:布尔值,指示浏览器是否在移动设备上。 (?1为真,?0为假)Sec-CH-UA-Full-Version:浏览器的完整版本。(例如:”73.1.2343B.TR”)

  在这些头提示中,Sec-CH-UA和Sec-CH-UA-Mobile被称为低熵提示,这2个提示将默认随客户端向服务器的初始请求发送。

  如果服务器需要了解浏览器品牌和移动设备以外的任何其他信息,则它必须使用响应中的Accept-CH标头向客户端请求。

  自从您了解了最新的功能之后,让我们通过一个示例来了解如何使用这些提示。

  User-Agent Client Hints操作提示

  例如,让我们设想一下浏览器请求网站首页的情况。

  

  第1步:初始请求

  通过初始页面请求,客户端将向服务器发送 Sec-CH-UA 和 Sec-CH-UA-Mobile 头提示,告知浏览器的类型、版本以及用户是否喜欢移动用户体验。

  GET /home HTTP/1.1

  Host: myblog

  Sec-CH-UA: "Chromium";v="84", "Google Chrome";v="84"

  Sec-CH-UA-Mobile: ?1

  步骤2:服务器回应

  当服务器发送请求的主页时,它也会请求额外的细节;它需要了解客户端的情况。在这种情况下,它要求的是设备的完整浏览器版本、平台和架构。

  HTTP/1.1 200 OK

  Accept-CH: Sec-CH-UA-Full-Version, Sec-CH-UA-Platform, Sec-CH-UA-Arch

  步骤3:后续要求

  然后,客户端将提供对所请求信息的访问,并且这些提示将在每个后续请求中发送。

  GET /home HTTP/1.1

  Host: myblog

  Sec-CH-UA: "Chromium";v="84", "Google Chrome";v="84"

  Sec-CH-UA-Mobile: ?1

  Sec-CH-UA-Full-Version: "84.0.4143.2"

  Sec-CH-UA-Platform: "Android"

  Sec-CH-UA-Arch: "ARM64"有关提示的其他注意事项

  除了了解新的提示,以及我们如何使用它们之外,也要知道这些提示的局限性。

  提示的寿命

  User-Agent Client Hint的寿命有限,该寿命因2个因素而异。

  一个用户代理客户端提示可以有效,直到你的浏览器会话过期或要求一个不同的提示集。

  让我们举一个例子来详细说明第二个场景。假设服务器使用Accept-CH头请求 Sec-CH-UA-Platform 提示,客户端正在发送相关信息,在所有后续请求中都是 Sec-CH-UA-Platform: "Android“。

  过一会儿,服务器需要另一个提示,并使用 Accept-CH 头请求 Sec-CH-UA-Full-Version。然后客户端将停止发送之前的信息,并完全用新请求的信息替换它。

  因此,建议指定所需的完整提示集,即使需要一个新的提示,也要确保在响应中包含了以前请求的所有提示。同样,您可以通过发送一个空的 Accept-CH 头来清除所有提示。

  提示范围

  通常,用户代理客户端提示的范围仅限于相同的原始请求。

  但是如果需要,我们可以通过指定 Feature-Policy 标头在跨域请求中配置提示。

  例如,如果您想从yourblog到myblog得到提示,那么您从myblog得到的响应除了通常的 Accept-CH 头外,还应该包括 Feature-Policy 头。

  Accept-CH: Sec-CH-UA-Full-Version, DPR

  Feature-Policy: ch-ua-full-version yourblog;

  然后yourblog将授予对完整版本详细信息的访问权限,如我之前所述。

  总结

  引入User-Agent Client Hints可以防止隐私问题,并减少用户代理头字符串的大小。总的来说,我认为User-Agent Client Hints已经达到了其主要目的,引入了一套新的提示,我们可以按需请求。另一方面,User-Agent Client Hints也处于发展的早期阶段,目前仍然只支持Chrome 84+版本。

  此外,还有许多有效的用例,我们需要User-Agent字符串。其中一些用例可以通过使用User-Agent Client Hints来实现,但在一些关键的用例中,User-Agent字符串是最可行的选择。因此,我们不能完全删除User-Agent字符串。

  例如,User-Agent Client Hints可以成为检测设备屏幕尺寸的最佳选择,以便从服务器提供最佳的图像或视频分辨率。但是,User-Agent Client Hints在欺诈检测、内容协商等情况下仍然无法胜任。

  引入User-Agent Client Hints的主要想法不是为了取代User-Agent字符串,而是为了减少秘密跟踪活动。所以,我认为最好的选择是根据需要同时使用用户-代理客户端提示和用户-代理字符串。