Client Hints Fingerprinting: encabezados HTTP e identidad
Los encabezados Client Hints como sec-ch-ua describen marca, versión y plataforma en cada solicitud. Aprende de dónde vienen las discrepancias y cómo compararlas con JavaScript.
Quieres la documentación estructurada de Huella digital?
Este artículo forma parte de la biblioteca editorial. Para pasos de configuración, material de referencia y actualizaciones continuas, entra en la sección de docs.
Cada solicitud que envía un navegador basado en Chromium puede llevar una descripción breve y estructurada del navegador que la envía. Esas descripciones se llaman Client Hints, y tres de ellas se envían por defecto: Sec-CH-UA, Sec-CH-UA-Mobile y Sec-CH-UA-Platform. Llegan como encabezados de la solicitud antes de que se ejecute cualquier script de la página, de modo que un servidor puede leer la marca del navegador, la versión principal, el tipo de dispositivo y la familia del sistema operativo desde la primera navegación.
Los Client Hints se introdujeron para sustituir la cadena User-Agent, larga y de formato libre, por algo más acotado y más fácil de controlar. En la práctica también crearon un segundo lugar donde el navegador se describe a sí mismo. Cuando los encabezados dicen una cosa, navigator.userAgentData dice otra y la cadena User-Agent dice una tercera, la discrepancia es en sí misma una señal que una revisión de huella digital va a notar. Las secciones siguientes cubren qué informa cada capa, de dónde vienen las discrepancias, cómo comparar las capas en una sesión y qué documenta BotBrowser, y qué no documenta, sobre este tema.
Lo que envía el navegador antes de que se ejecute cualquier script
Los Client Hints se dividen en dos grupos. Los hints de baja entropía se envían por defecto. Sec-CH-UA enumera las marcas del navegador con sus versiones principales, Sec-CH-UA-Mobile indica si el navegador pide la experiencia móvil y Sec-CH-UA-Platform nombra la familia del sistema operativo. Como estos tres describen de forma parecida a una gran parte de los navegadores, la especificación los considera de bajo riesgo y permite que el navegador los envíe sin que nadie se los pida.
Los hints de alta entropía son los detallados: la lista completa de versiones, la versión de la plataforma, la arquitectura de la CPU, los bits, el modelo del dispositivo y si un navegador de 32 bits se ejecuta en un sistema de 64 bits. Un servidor solo los recibe después de aceptarlos con un encabezado de respuesta Accept-CH que nombra los hints que quiere, y entonces el navegador los incluye en las solicitudes posteriores a ese origen. Un servidor que necesite un hint ya en la primera solicitud también puede usar Critical-CH, que pide al navegador repetir la solicitud con el hint adjunto. Los marcos de terceros reciben un hint solo cuando la página que los incrusta lo delega con un encabezado Permissions-Policy.
JavaScript tiene su propia vía hacia los mismos datos. navigator.userAgentData expone de inmediato las marcas, el indicador móvil y la plataforma, y getHighEntropyValues() devuelve los valores detallados como una promesa cuando la página pide nombres concretos. Las dos vías deben describir un único navegador, y por eso compararlas es la comprobación de coherencia más directa que existe.
Una solicitud por defecto de un navegador de escritorio de la familia Chrome lleva encabezados con la forma de las líneas siguientes. La entrada GREASE exacta y su posición cambian entre versiones de Chrome, así que los valores muestran la forma de los datos y no son algo que copiar.
Sec-CH-UA: "Chromium";v="136", "Google Chrome";v="136", "Not.A/Brand";v="99"
Sec-CH-UA-Mobile: ?0
Sec-CH-UA-Platform: "Windows"
El encabezado User-Agent sigue existiendo. Chrome redujo el detalle que contiene, y con ello la información precisa de versión y plataforma pasó a los Client Hints. Un servidor dispone así de dos descripciones de un mismo navegador y puede comprobar si coinciden. Para una comparación más detallada entre la cadena y los hints estructurados, consulta Custom User Agent.
La lista de marcas también contiene una entrada GREASE, una marca deliberadamente extraña como Not.A/Brand cuyo texto, versión y posición cambian con el tiempo. Su objetivo es evitar que los servidores fijen una lista concreta en su código. Para quien configura una identidad de navegador, GREASE recuerda que la lista de marcas sigue una regla que depende de la versión, y que una lista escrita a mano puede parecer incorrecta aunque cada nombre de marca sea real.
De dónde vienen las discrepancias
Una identidad de navegador tiene varias superficies, y cada una la lee una parte distinta de la página o del servidor. Aparece una discrepancia cuando dos superficies describen navegadores distintos. Las fuentes más comunes son estas:
- Una cadena User-Agent que nombra una versión del navegador mientras
Sec-CH-UAindica otra versión principal. - Una plataforma en
Sec-CH-UA-Platformque difiere de la plataforma denavigator.userAgentData, o un indicador móvil que contradice la plataforma. - Una lista de marcas en los encabezados que difiere de las marcas devueltas en JavaScript, por ejemplo Edge en una y Chrome a secas en la otra.
- Un worker que informa una identidad distinta de la del hilo principal porque el cambio se aplicó solo a las páginas.
- Cambios aplicados por dos herramientas diferentes, como un perfil más un cambio de User-Agent a nivel de framework o de CDP, donde cada herramienta cubre un subconjunto distinto de superficies.
- Una configuración que era correcta cuando se escribió pero que ahora va por detrás de la versión de Chrome que produjo el binario del navegador.
Los elementos del lado de los encabezados se pueden leer en el servidor sin ejecutar scripts de la página: los encabezados predeterminados llegan con la primera solicitud, y un servidor que pide hints de alta entropía los recibe en el siguiente ciclo de solicitud y puede compararlos con el User-Agent. Las comparaciones de navigator.userAgentData y de workers sí necesitan script. Desde el punto de vista de la privacidad, los Client Hints se suman al conjunto de valores que, combinados con otras señales, acotan a un navegador. Cover Your Tracks, de la EFF, muestra cómo las combinaciones de valores corrientes se vuelven distintivas, y los Client Hints son un ingrediente más de esa combinación. Un conjunto coherente de valores también es más fácil de revisar que un mosaico, porque cada diferencia que ves es una pregunta real y no ruido.
Imagina un equipo que carga un perfil que describe un escritorio Windows y luego, mediante un framework de pruebas, fija una cadena User-Agent de otro sistema operativo. El framework cubre la cadena y quizá algunos metadatos, el perfil cubre sus propias superficies y ninguna herramienta sabe de la otra. El resultado es una sesión en la que los encabezados y los valores visibles para el script describen dos máquinas distintas. La solución no es un cambio mejor. La solución es elegir una fuente para cada valor y eliminar la otra.
Los contextos de ejecución importan tanto como los tipos de solicitud. Un worker dedicado, un worker compartido y un service worker tienen cada uno su propio ámbito global, y la interfaz NavigatorUAData está expuesta en los ámbitos de worker además de en las ventanas. Por tanto, una página puede leer los valores de marca y plataforma dentro de un worker y compararlos con los suyos. Un cambio que solo modifica la página deja esa comparación abierta.
Los valores relacionados con la plataforma merecen especial atención porque están ligados entre sí. El nombre de la plataforma, su versión, la arquitectura, los bits y el indicador móvil describen un único dispositivo. Una versión de plataforma normal para un sistema operativo parece incorrecta junto al nombre de otro, y un indicador móvil en verdadero junto a una arquitectura de escritorio plantea de inmediato una pregunta. Cuando cambies uno de estos valores, revísalos todos juntos.
Comparar encabezados y valores de JavaScript en una sesión
El objetivo de la comparación es acotado: confirmar que una sesión informa una sola identidad en todos los lugares donde puedes leerla. Para eso no necesitas una página de puntuación de terceros. Basta una página y un servidor que controles, y te permiten pedir hints de alta entropía a propósito.
- Sirve una página de prueba por HTTPS desde un servidor que controles y registra los encabezados de solicitud que recibe en la primera navegación.
- Añade un encabezado de respuesta
Accept-CHcon los hints de alta entropía que quieres comparar, comoSec-CH-UA-Full-Version-List,Sec-CH-UA-Platform-VersionySec-CH-UA-Arch, y carga la página una segunda vez para que el navegador los incluya. - En la página, lee
navigator.userAgentDatay llama agetHighEntropyValues()con los mismos nombres, y anota los resultados junto a los encabezados. - Repite las lecturas de JavaScript desde un worker dedicado y, si tu sitio usa uno, desde un service worker, y anota cualquier diferencia respecto al hilo principal.
- Compara nombres de marca, versiones principales, plataforma, versión de plataforma, arquitectura, bits, modelo e indicador móvil, añade la cadena User-Agent y anota cada diferencia con la solicitud o el contexto que la produjo.
Las páginas públicas pueden complementar esto. Cover Your Tracks, de la EFF, muestra cómo ve tu navegador un rastreador típico, lo cual sirve como segunda opinión sobre lo distintivo que es el conjunto. Estas páginas son menos adecuadas para una comparación encabezado por encabezado, porque no te dicen qué solicitud produjo cada valor. Reserva tu propia página de prueba para eso y trata las herramientas públicas como contexto. Consulta Verify Browser Fingerprint para una rutina de comprobación más amplia.
Anota los resultados en una cuadrícula sencilla con una fila por valor y una columna por superficie: encabezado de solicitud, hilo principal, worker y cadena User-Agent. Una fila donde las columnas difieren es un hallazgo. Una fila donde coinciden es evidencia solo de ese valor, y no dice nada sobre cómo tratará un sitio web concreto la sesión.
Cuando encuentres una diferencia, trabaja hacia atrás desde la superficie incorrecta. Pregunta qué herramienta o flag es responsable de esa superficie, comprueba si una segunda herramienta también escribe en ella y elimina la fuente duplicada. Después repite toda la comparación, no solo la fila que falló, porque el cambio de un valor puede dejar al descubierto una discrepancia en el vecino.
Una sola fuente de Client Hints con BotBrowser
BotBrowser documenta que configurar las flags de identidad, incluidas --bot-browser-brand y las flags de User-Agent y plataforma, genera Client Hints coherentes: marcas, tokens GREASE, valores de alta entropía y encabezados HTTP de Client Hints que coinciden con navigator.userAgentData en el hilo principal, los Workers y las solicitudes HTTP. Para la comparación descrita arriba, esto significa que puedes contrastar los encabezados y los valores de JavaScript de una sesión con una única identidad configurada, en lugar de reconciliar varias fuentes a mano. BotBrowser no puede controlar cómo un sitio web clasifica los Client Hints u otras señales de huella digital, no puede garantizar ningún resultado de detección o de acceso y no puede reconciliar los cambios de User-Agent a nivel de CDP o de framework aplicados fuera de BotBrowser. El User-Agent personalizado y el control completo de userAgentData requieren la licencia ENT Tier3 documentada.
La vía documentada es corta. Carga un perfil y añade flags de identidad solo cuando necesites una marca o una plataforma distintas de las del perfil. Las flags van en los argumentos de lanzamiento, no en una opción del framework. A partir de esas entradas BotBrowser genera los valores dependientes, así que no escribes tú mismo una lista de marcas ni una entrada GREASE.
chromium-browser \
--bot-profile="path/to/profile.enc" \
--bot-browser-brand=edge \
--bot-ua-full-version=142.0.7444.60 \
--bot-brand-full-version=142.0.3595.65
Los valores de marca documentados son chrome, edge, brave, opera, chromium y webview. Cada marca sigue su propio ritmo de versiones, así que las versiones completas de Edge y Opera difieren de la versión de Chromium aunque compartan la versión principal. Usa --bot-ua-full-version para la versión de Chromium y --bot-brand-full-version para la versión propia de la marca, y mantén ambas en la misma versión principal. El cambio de marca está documentado con la licencia ENT Tier2, mientras que la marca WebView y el User-Agent personalizado están documentados con ENT Tier3.
Trata el perfil y las flags de identidad como la fuente única. Si además fijas un User-Agent mediante CDP o una opción del framework, ese cambio se aplica fuera de BotBrowser, y BotBrowser no lo reconcilia con los Client Hints generados. Elige una fuente para cada valor. Cuando pases --user-agent, usa los marcadores documentados como {ua-full-version} para que la cadena siga las mismas flags que los hints.
Después de cada versión de Chrome, comprueba que --bot-ua-full-version sigue teniendo la misma versión principal de Chromium que tu binario de BotBrowser. Cuando el binario pase a una versión principal nueva, usa un perfil y unas flags que apunten a esa versión. El síntoma documentado de una discrepancia son Client Hints que no coinciden con el binario, y una versión obsoleta es una incoherencia entre la configuración y el navegador que la ejecuta.
Preguntas habituales sobre Client Hints
¿Se envían los Client Hints cuando JavaScript está desactivado?
Los hints de baja entropía por defecto son encabezados de solicitud, así que no dependen del script de la página. Los hints de alta entropía dependen de que el servidor los acepte mediante Accept-CH. La interfaz de JavaScript, como es natural, necesita que se ejecute un script. Esta división es la razón por la que una revisión de encabezados y una revisión de script responden preguntas distintas, y por la que ambas forman parte de una comprobación de coherencia.
¿Puede un servidor recibir un hint de alta entropía que nunca pidió?
No a través de los encabezados de solicitud. El navegador los adjunta solo después de una aceptación previa. Un script que se ejecute en la página sí puede llamar a getHighEntropyValues() y reenviar el resultado por su cuenta, lo cual es una vía distinta con sus propios controles. Al revisar el comportamiento de un sitio, mira las dos vías.
¿Puede un framework de pruebas fijar Client Hints?
Los frameworks de pruebas y el protocolo de DevTools pueden cambiar la cadena User-Agent y, en algunos casos, metadatos relacionados. Lo que cubre un cambio depende de la herramienta, y los cambios de herramientas distintas pueden contradecirse. Comprueba cada superficie con la comparación anterior. BotBrowser no reconcilia los cambios aplicados fuera de BotBrowser, así que mantén los valores de identidad en un solo lugar.
¿Cuál es la diferencia entre Sec-CH-UA y Sec-CH-UA-Full-Version-List?
Sec-CH-UA lleva las marcas con versiones principales y se envía por defecto. Sec-CH-UA-Full-Version-List lleva la cadena de versión completa de cada marca y es un hint de alta entropía que requiere aceptación previa. En JavaScript aparece la misma división: brands para las versiones principales y fullVersionList para las detalladas. Ambos deben nombrar las mismas marcas y las mismas versiones principales.
¿Que los Client Hints coincidan decide cómo trata un sitio una sesión?
No. Los Client Hints son una señal de huella digital entre muchas. La coherencia elimina un tipo de discrepancia, pero los sitios web combinan muchas otras entradas, y BotBrowser no puede garantizar una clasificación, un resultado de rastreo ni un resultado de acceso. Considera una comparación limpia como un control de calidad de tu propia configuración y nada más.
¿Qué flags de BotBrowser afectan a los Client Hints?
Las flags de identidad documentadas son --user-agent, --bot-platform, --bot-platform-version, --bot-model, --bot-architecture, --bot-bitness y --bot-mobile, junto con las flags de apoyo --bot-browser-brand, --bot-ua-full-version y --bot-brand-full-version. La flag --user-agent admite marcadores que leen de las demás flags, de modo que la cadena y los hints parten de los mismos valores.
Lista de comprobación antes de confiar en una configuración
Una lista corta hace que la revisión sea repetible. Ejecútala cada vez que cambies un perfil, una marca, una flag de plataforma o el binario del navegador.
- Cada valor tiene una sola fuente: el perfil, una flag de identidad o nada más.
- Las marcas, la plataforma y el indicador móvil coinciden entre los encabezados de solicitud, el hilo principal y los workers.
- Los valores de alta entropía pedidos mediante
Accept-CHcoinciden con los resultados degetHighEntropyValues(). - La cadena User-Agent y los Client Hints nombran la misma versión principal de Chromium.
- La versión principal de
--bot-ua-full-versioncoincide con el binario de BotBrowser después de cada versión. - El nivel de licencia cubre las flags en uso.
Como lectura relacionada, Navigator Properties Fingerprinting cubre los valores de navigator visibles para el script que acompañan a navigator.userAgentData, y What Is Browser Fingerprinting ofrece el contexto más amplio sobre cómo se combinan las señales.
Fuentes públicas
Artículos Relacionados
Lleva BotBrowser de la investigación a producción
Usa estas guías para entender el modelo y después avanzar hacia validación multiplataforma, contextos aislados y despliegue de navegador preparado para escalar.