Volver al Blog
Huella digital

Client Hints Fingerprinting: Cómo los encabezados HTTP revelan la identidad de tu navegador

Los encabezados Client Hints como sec-ch-ua exponen marca, versión, plataforma y detalles del dispositivo en cada solicitud HTTP. Aprende cómo las inconsistencias en estos encabezados crean señales rastreables y cómo mantener la consistencia.

Introducción

Cada solicitud HTTP que envía tu navegador lleva información de identidad en forma de encabezados Client Hints. Antes de que se ejecute cualquier JavaScript, antes de que se cargue cualquier contenido de página, encabezados como Sec-CH-UA, Sec-CH-UA-Platform y Sec-CH-UA-Mobile ya han transmitido la marca del navegador, la versión y los detalles del sistema operativo al servidor en un formato estructurado y legible por máquinas. Valores adicionales de alta entropía que cubren la arquitectura de CPU, la versión del sistema operativo, el modelo del dispositivo y las cadenas de versión completas están disponibles cuando el servidor los solicita o cuando JavaScript llama a navigator.userAgentData.getHighEntropyValues().

Estos encabezados fueron diseñados como una mejora de privacidad sobre la cadena monolítica User-Agent, proporcionando datos estructurados a través de un mecanismo de opt-in. En la práctica, los encabezados predeterminados enviados en cada solicitud ya contribuyen con entropía significativa al fingerprinting del navegador. Más importante aún, la consistencia interna de los valores Client Hints en todos los tipos de solicitud dentro de una sesión, y la alineación entre los encabezados HTTP y las APIs de JavaScript, se ha convertido en una superficie crítica para la privacidad. Cualquier inconsistencia entre lo que reporta la capa de red y lo que expone la capa de JavaScript crea una señal rastreable que es trivialmente observable del lado del servidor.

BotBrowser aborda esto a nivel de motor, asegurando que cada valor de Client Hints esté impulsado por el perfil, sea consistente en todos los tipos de solicitud y contextos de ejecución, y esté alineado entre los encabezados HTTP y las APIs de JavaScript.

La solución de BotBrowser

Client Hints impulsados por perfil

BotBrowser genera todos los valores de Client Hints a partir de perfiles capturados en instancias reales de navegador. Cuando se carga un perfil, el motor construye la configuración completa de Client Hints a partir de los datos del perfil, incluyendo:

  • La lista completa de marcas Sec-CH-UA con la marca GREASE correcta para la versión de Chrome del perfil
  • Ordenamiento determinístico de marcas que coincide con el comportamiento real de Chrome
  • Valores de plataforma, versión de plataforma, arquitectura, bitness y modelo
  • Lista de versiones completas con todas las entradas de marca y sus cadenas de versión completas

Esta configuración se establece una vez al inicio del navegador y se aplica uniformemente a cada solicitud durante toda la sesión. No hay una ruta de código secundaria, no hay regeneración por solicitud ni variación dependiente del contexto.

Consistencia entre solicitudes

Todos los tipos de solicitud usan la misma lista de marcas. Las solicitudes de navegación, solicitudes de subrecursos (scripts, hojas de estilo, imágenes, llamadas fetch), solicitudes de workers, solicitudes de prefetch y solicitudes de service workers reciben encabezados Sec-CH-UA idénticos porque todos obtienen su configuración de la misma fuente derivada del perfil. Una sola carga de página puede generar docenas de solicitudes HTTP, y cada una lleva los mismos valores de Client Hints.

Alineación de JavaScript y HTTP

BotBrowser asegura que navigator.userAgentData.brands en JavaScript devuelve las mismas marcas que aparecen en el encabezado HTTP Sec-CH-UA. De manera similar, navigator.userAgentData.getHighEntropyValues() devuelve valores consistentes con los encabezados Client Hints de alta entropía. Esta alineación se extiende a cada contexto de ejecución en el navegador:

  • Hilo principal (contexto window)
  • Web workers dedicados
  • Workers compartidos
  • Service workers
  • Worklets

Cada contexto reporta los mismos valores de Client Hints porque todos se derivan del mismo perfil.

Estabilidad entre sesiones

Al usar el mismo perfil en múltiples sesiones de navegador, BotBrowser produce la misma configuración de Client Hints cada vez. La marca GREASE, la versión, el ordenamiento y todos los valores de metadatos son determinísticos dado el mismo perfil. Esto es importante para escenarios donde se debe mantener una identidad de navegador persistente entre reinicios.

Sobrescritura de marca

Cuando necesitas presentar una marca de navegador diferente (por ejemplo, Edge en lugar de Chrome), BotBrowser ajusta automáticamente todas las superficies de Client Hints:

chrome --bot-profile="/path/to/profile.enc" \
       --bot-config-browser-brand=edge \
       --bot-config-brand-full-version=136.0.3240.76

Esto actualiza las marcas Sec-CH-UA, Sec-CH-UA-Full-Version-List, navigator.userAgentData.brands y la cadena User-Agent en una operación coherente. Todas las superficies reflejan la misma identidad de marca.

Configuración y uso

Uso básico de perfil

Para la mayoría de los casos de uso, cargar un perfil es suficiente:

chrome --bot-profile="/path/to/profile.enc"

El perfil contiene toda la configuración de Client Hints. No se necesitan flags adicionales para un comportamiento consistente de Client Hints.

Integración con Playwright

const { chromium } = require('playwright-core');

(async () => {
  const browser = await chromium.launch({
    executablePath: '/path/to/botbrowser/chrome',
    args: [
      '--bot-profile=/path/to/profile.enc',
    ],
    headless: true,
  });

  const context = await browser.newContext();
  const page = await context.newPage();
  await page.goto('https://example.com');

  // Read low-entropy Client Hints from JavaScript
  const brands = await page.evaluate(() =>
    navigator.userAgentData.brands.map(b => `${b.brand};v="${b.version}"`)
  );
  console.log('Brands:', brands);

  // Read high-entropy Client Hints
  const hints = await page.evaluate(async () => {
    const data = await navigator.userAgentData.getHighEntropyValues([
      'platformVersion', 'architecture', 'bitness',
      'fullVersionList', 'model'
    ]);
    return {
      platform: data.platform,
      platformVersion: data.platformVersion,
      architecture: data.architecture,
      bitness: data.bitness,
      fullVersionList: data.fullVersionList,
      model: data.model,
    };
  });
  console.log('High-entropy hints:', hints);

  await browser.close();
})();

Integración con Puppeteer

const puppeteer = require('puppeteer-core');

(async () => {
  const browser = await puppeteer.launch({
    executablePath: '/path/to/botbrowser/chrome',
    args: [
      '--bot-profile=/path/to/profile.enc',
    ],
    headless: true,
    defaultViewport: null,
  });

  const page = await browser.newPage();
  await page.goto('https://example.com');

  // Verify Client Hints from the loaded profile
  const jsHints = await page.evaluate(() => ({
    brands: navigator.userAgentData.brands,
    mobile: navigator.userAgentData.mobile,
    platform: navigator.userAgentData.platform,
  }));
  console.log('Client Hints:', jsHints);

  await browser.close();
})();

Verificación

Verificar Client Hints de JavaScript

Abre una página y verifica que navigator.userAgentData devuelve los valores esperados:

// In browser console or via automation
const brands = navigator.userAgentData.brands;
console.log('Brands:', JSON.stringify(brands, null, 2));
console.log('Platform:', navigator.userAgentData.platform);
console.log('Mobile:', navigator.userAgentData.mobile);

const high = await navigator.userAgentData.getHighEntropyValues([
  'platformVersion', 'architecture', 'bitness',
  'fullVersionList', 'model', 'wow64'
]);
console.log('High-entropy:', JSON.stringify(high, null, 2));

Uso de herramientas de verificación en línea

Visita BrowserLeaks, CreepJS o Cover Your Tracks para ver tus valores de Client Hints junto con otros datos de fingerprinting. Confirma que las marcas, plataforma y versión reportadas coinciden con lo que esperas de tu perfil. Consulta también la guía de verificación de fingerprint de BotBrowser para orientación completa sobre verificación.

Mejores prácticas

Siempre usa perfiles

No construyas manualmente los valores de Client Hints. La relación entre la versión de Chrome, la marca GREASE y el ordenamiento de marcas depende de la versión y cambia con cada lanzamiento. Los perfiles capturan estas relaciones de instancias reales del navegador y las reproducen exactamente.

Haz coincidir Client Hints con User-Agent

Si sobrescribes la cadena User-Agent con --user-agent, asegúrate de que los flags --bot-config-browser-brand y --bot-config-ua-full-version estén alineados. BotBrowser generará Client Hints coincidentes automáticamente, pero la sobrescritura de la cadena User-Agent se aplica por separado y debe ser consistente.

Mantén los perfiles actualizados

Los Client Hints cambian con cada versión de Chrome. Se introducen nuevas marcas GREASE y los números de versión avanzan. Usar un perfil desactualizado con números de versión antiguos puede convertirse en una señal distintiva. Actualiza regularmente tus perfiles desde el repositorio de perfiles de BotBrowser para coincidir con las versiones actuales del navegador.

No mezcles fuentes de Client Hints

Evita combinar los Client Hints basados en perfil de BotBrowser con sobrescrituras de CDP o cambios de User-Agent a nivel de framework. Cada uno opera en una capa diferente, y combinarlos crea inconsistencias. Deja que BotBrowser maneje todas las señales de identidad a través de su sistema de perfiles.

Monitorea los Hints solicitados por el servidor

Algunos servidores solicitan hints de alta entropía adicionales a través de Accept-CH. BotBrowser responde a estas solicitudes con valores del perfil. Si estás probando contra un servicio específico, verifica qué hints solicita y confirma que las respuestas de BotBrowser sean completas y consistentes.

Preguntas frecuentes

¿Cuál es la diferencia entre User-Agent y Client Hints?

El encabezado User-Agent es una cadena única que contiene información del navegador, versión y sistema operativo en un formato libre. Los Client Hints (encabezados Sec-CH-UA-*) proporcionan la misma información como pares clave-valor estructurados. Los navegadores Chromium modernos envían ambos, y los servidores los comparan para verificar consistencia. Consulta User Agent personalizado para una comparación detallada.

¿Puedo configurar Client Hints manualmente con Playwright o Puppeteer?

Playwright y Puppeteer permiten sobrescribir la cadena User-Agent y, a través de CDP, algunos metadatos de Client Hints. Sin embargo, estas sobrescrituras no cubren todas las superficies (workers, service workers, valores de alta entropía) y requieren gestión manual de marcas GREASE. El enfoque basado en perfiles de BotBrowser cubre cada superficie y evita el riesgo de que sobrescrituras parciales creen inconsistencias.

¿Funcionan los Client Hints en modo headless?

Sí. BotBrowser envía Client Hints idénticos en modo headless y con interfaz gráfica. Los encabezados Sec-CH-UA y los valores de navigator.userAgentData son los mismos independientemente del modo de visualización.

¿Cómo se relacionan los Client Hints con las propiedades de navigator?

navigator.userAgentData es la interfaz JavaScript para Client Hints. Las marcas, plataforma y flag mobile expuestos a través de navigator.userAgentData corresponden directamente a los encabezados HTTP Sec-CH-UA, Sec-CH-UA-Platform y Sec-CH-UA-Mobile. BotBrowser asegura que siempre estén alineados. Para más información sobre las propiedades de navigator, consulta Fingerprinting de propiedades de Navigator.

¿Qué sucede si el servidor no solicita hints de alta entropía?

BotBrowser solo envía encabezados Client Hints de alta entropía cuando el servidor los solicita a través de Accept-CH, siguiendo el comportamiento estándar de Chromium. Sin embargo, la API JavaScript getHighEntropyValues() siempre está disponible. BotBrowser asegura que tanto los encabezados HTTP (cuando se envían) como la API de JavaScript devuelvan valores consistentes del perfil.

¿Pueden usarse los encabezados Client Hints para rastreo sin JavaScript?

Sí. Los encabezados predeterminados Sec-CH-UA, Sec-CH-UA-Mobile y Sec-CH-UA-Platform se envían con cada solicitud HTTP, incluso cuando JavaScript está deshabilitado. Por eso la protección de BotBrowser opera a nivel de motor en lugar de depender de intervenciones en la capa de JavaScript.

¿Con qué frecuencia debo actualizar mis perfiles para la precisión de Client Hints?

Cada versión de Chrome puede introducir cambios en los valores de Client Hints. Se recomienda actualizar los perfiles con cada versión mayor de Chrome (aproximadamente cada cuatro semanas) para asegurar que los valores coincidan con las versiones actuales del navegador.

¿Soporta BotBrowser sobrescrituras de marca para Edge, Brave y Opera?

Sí. El flag --bot-config-browser-brand soporta chrome, edge, brave, opera y webview. Cuando se especifica una marca, BotBrowser actualiza todos los encabezados Client Hints, las APIs de JavaScript y la cadena User-Agent para reflejar la marca elegida de manera consistente.

Resumen

Los encabezados Client Hints llevan información de identidad del navegador en cada solicitud HTTP, creando una superficie significativa para la privacidad que opera antes de que se cargue cualquier contenido de página. La consistencia de estos valores entre tipos de solicitud, contextos de ejecución y entre encabezados HTTP y APIs de JavaScript es crítica para la protección de la privacidad.

BotBrowser maneja esto a nivel de motor. Los perfiles capturados de instancias reales del navegador definen todos los valores de Client Hints. Estos valores se generan una vez a partir del perfil y se aplican uniformemente a cada tipo de solicitud, cada contexto de ejecución y cada superficie de API. El resultado es un comportamiento de Client Hints que coincide con la salida real del navegador, porque es producido por el mismo motor Chromium con configuración impulsada por perfil.

Para más información sobre temas relacionados, consulta:

#client hints#sec-ch-ua#fingerprinting#GREASE#user agent#privacy#browser identity#HTTP headers

¿Listo para proteger tu huella digital?

BotBrowser ofrece control de huellas a nivel de motor con perfiles de dispositivos reales. Comience gratis o explore todas las funciones.