什么是 HTTP/2 指纹识别?
HTTP/2 指纹识别 这是一种连接层检测技术,通过分析客户端构建 HTTP/2 协议帧的方式(而不仅仅是请求的内容)来识别客户端。真正的浏览器会发送具有特定且一致模式的 SETTINGS 参数、WINDOW_UPDATE 值以及伪头部排序。 大多数 HTTP 库和机器人无法复制这种模式,因此它们在发送任何 URL 之前就会被识别出来。
HTTP/2 指纹识别是如何工作的?
当客户端建立 HTTP/2 连接时,会在发送任何应用数据之前先发送几个低级帧。 Akamai的研究人员记录到,服务器可以通过四种可观察的信号对客户端进行指纹识别:SETTINGS帧参数(按顺序排列的ID:value对)、WINDOW_UPDATE增量、PRIORITY帧数据,以及伪头部(:method、:authority、:scheme、:path)的顺序(Akamai 白皮书——HTTP/2 客户端的被动指纹识别,Black Hat EU 2017, 2017)。
每款主流浏览器(Chrome、Firefox、Safari)都会生成一个一致且已知的指纹。像 curl 或 Python 的requests 库会生成一个不同的指纹,因为它们并未模拟浏览器层面的 HTTP/2 初始化过程。机器人检测系统会构建已知浏览器指纹的查找表,并对任何不匹配的指纹进行标记。
一个能够运行 JavaScript 并渲染网页的完整浏览器环境,默认会生成一个真实的 HTTP/2 指纹。这就是为什么基于渲染的方法能够通过此验证,而普通 HTTP 客户端或基本代理却无法通过。
常见问题解答
服务器会读取 SETTINGS 帧(具体参数及其顺序)、WINDOW_UPDATE 增量、PRIORITY 数据,以及伪头(:method、:authority、:scheme、:path)的排列顺序。这些信号综合起来,构成了每种 HTTP 客户端类型的近乎唯一的“指纹”。
TLS 指纹识别(JA3/JA4)是在交换任何 HTTP 数据之前,对 TLS 握手过程进行分析。HTTP/2 指纹识别则发生在更高一层,即加密隧道建立之后,通过解析首个 HTTP/2 帧的结构来实现。这两种技术通常结合使用,以实现分层机器人检测。
代理服务器仅负责转发流量,不会改变生成帧的 HTTP 客户端。如果代理服务器背后的软件发送的不是浏览器生成的 HTTP/2 帧,该指纹仍会被标记。只有真正的浏览器环境才能原生生成预期的帧结构。