Client Hints Fingerprinting : comment les en-tetes HTTP revelent l'identite de votre navigateur
Les en-tetes Client Hints comme sec-ch-ua exposent la marque, la version, la plateforme et les details de l'appareil a chaque requete HTTP. Decouvrez comment les incoherences dans ces en-tetes creent des signaux tracables et comment maintenir la coherence.
Introduction
Chaque requete HTTP envoyee par votre navigateur transporte des informations d'identite sous forme d'en-tetes Client Hints. Avant l'execution de tout JavaScript, avant le chargement de tout contenu de page, des en-tetes comme Sec-CH-UA, Sec-CH-UA-Platform et Sec-CH-UA-Mobile ont deja transmis la marque du navigateur, la version et les details du systeme d'exploitation au serveur dans un format structure et lisible par machine. Des valeurs supplementaires a haute entropie couvrant l'architecture CPU, la version du systeme d'exploitation, le modele de l'appareil et les chaines de version completes sont disponibles lorsque le serveur les demande ou lorsque JavaScript appelle navigator.userAgentData.getHighEntropyValues().
Ces en-tetes ont ete concus comme une amelioration de la confidentialite par rapport a la chaine monolithique User-Agent, fournissant des donnees structurees via un mecanisme d'opt-in. En pratique, les en-tetes par defaut envoyes avec chaque requete contribuent deja de maniere significative a l'entropie du fingerprinting du navigateur. Plus important encore, la coherence interne des valeurs Client Hints entre tous les types de requetes au sein d'une session, et l'alignement entre les en-tetes HTTP et les API JavaScript, est devenue une surface critique pour la confidentialite. Toute incoherence entre ce que rapporte la couche reseau et ce qu'expose la couche JavaScript cree un signal tracable trivialement observable cote serveur.
BotBrowser resout ce probleme au niveau du moteur, en s'assurant que chaque valeur Client Hints est pilotee par le profil, coherente entre tous les types de requetes et contextes d'execution, et alignee entre les en-tetes HTTP et les API JavaScript.
La solution de BotBrowser
Client Hints pilotes par le profil
BotBrowser genere toutes les valeurs Client Hints a partir de profils captures sur des instances reelles de navigateur. Lorsqu'un profil est charge, le moteur construit la configuration complete des Client Hints a partir des donnees du profil, incluant :
- La liste complete des marques
Sec-CH-UAavec la marque GREASE correcte pour la version Chrome du profil - Un ordonnancement deterministe des marques correspondant au comportement reel de Chrome
- Les valeurs de plateforme, version de plateforme, architecture, bitness et modele
- La liste complete des versions avec toutes les entrees de marque et leurs chaines de version completes
Cette configuration est definie une fois au demarrage du navigateur et s'applique uniformement a chaque requete tout au long de la session. Il n'y a pas de chemin de code secondaire, pas de regeneration par requete et pas de variation dependante du contexte.
Coherence inter-requetes
Tous les types de requetes utilisent la meme liste de marques. Les requetes de navigation, les requetes de sous-ressources (scripts, feuilles de style, images, appels fetch), les requetes de workers, les requetes de prefetch et les requetes de service workers recoivent des en-tetes Sec-CH-UA identiques car ils puisent tous dans la meme configuration derivee du profil. Un seul chargement de page peut generer des dizaines de requetes HTTP, et chacune d'entre elles porte les memes valeurs Client Hints.
Alignement JavaScript et HTTP
BotBrowser s'assure que navigator.userAgentData.brands en JavaScript retourne les memes marques qui apparaissent dans l'en-tete HTTP Sec-CH-UA. De meme, navigator.userAgentData.getHighEntropyValues() retourne des valeurs coherentes avec les en-tetes Client Hints a haute entropie. Cet alignement s'etend a chaque contexte d'execution dans le navigateur :
- Thread principal (contexte
window) - Web workers dedies
- Workers partages
- Service workers
- Worklets
Chaque contexte rapporte les memes valeurs Client Hints car ils derivent tous du meme profil.
Stabilite inter-sessions
En utilisant le meme profil sur plusieurs sessions de navigateur, BotBrowser produit la meme configuration Client Hints a chaque fois. La marque GREASE, la version, l'ordonnancement et toutes les valeurs de metadonnees sont deterministes pour un meme profil. C'est important pour les scenarios ou une identite de navigateur persistante doit etre maintenue entre les redemarrages.
Remplacement de marque
Lorsque vous devez presenter une marque de navigateur differente (par exemple, Edge au lieu de Chrome), BotBrowser ajuste automatiquement toutes les surfaces Client Hints :
chrome --bot-profile="/path/to/profile.enc" \
--bot-config-browser-brand=edge \
--bot-config-brand-full-version=136.0.3240.76
Cela met a jour les marques Sec-CH-UA, Sec-CH-UA-Full-Version-List, navigator.userAgentData.brands et la chaine User-Agent en une operation coherente. Toutes les surfaces refletent la meme identite de marque.
Configuration et utilisation
Utilisation basique du profil
Pour la plupart des cas d'utilisation, charger un profil suffit :
chrome --bot-profile="/path/to/profile.enc"
Le profil contient toute la configuration Client Hints. Aucun flag supplementaire n'est necessaire pour un comportement Client Hints coherent.
Integration 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();
})();
Integration 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();
})();
Verification
Verifier les Client Hints JavaScript
Ouvrez une page et verifiez que navigator.userAgentData retourne les valeurs attendues :
// 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));
Utilisation d'outils de verification en ligne
Visitez BrowserLeaks, CreepJS ou Cover Your Tracks pour voir vos valeurs Client Hints aux cotes d'autres donnees de fingerprinting. Confirmez que les marques, la plateforme et la version rapportees correspondent a ce que vous attendez de votre profil. Consultez egalement le guide de verification de fingerprint de BotBrowser pour des conseils complets sur la verification.
Meilleures pratiques
Toujours utiliser des profils
Ne construisez pas manuellement les valeurs Client Hints. La relation entre la version de Chrome, la marque GREASE et l'ordonnancement des marques depend de la version et change a chaque sortie. Les profils capturent ces relations a partir d'instances reelles du navigateur et les reproduisent exactement.
Faire correspondre Client Hints et User-Agent
Si vous remplacez la chaine User-Agent avec --user-agent, assurez-vous que les flags --bot-config-browser-brand et --bot-config-ua-full-version sont alignes. BotBrowser generera des Client Hints correspondants automatiquement, mais le remplacement de la chaine User-Agent est applique separement et doit etre coherent.
Maintenir les profils a jour
Les Client Hints changent avec chaque version de Chrome. De nouvelles marques GREASE sont introduites et les numeros de version avancent. Utiliser un profil obsolete avec d'anciens numeros de version peut devenir un signal distinctif. Mettez regulierement a jour vos profils depuis le depot de profils BotBrowser pour correspondre aux versions actuelles du navigateur.
Ne pas melanger les sources de Client Hints
Evitez de combiner les Client Hints bases sur le profil de BotBrowser avec des surcharges CDP ou des changements de User-Agent au niveau du framework. Chacun opere a une couche differente, et les combiner cree des incoherences. Laissez BotBrowser gerer tous les signaux d'identite via son systeme de profils.
Surveiller les Hints demandes par le serveur
Certains serveurs demandent des hints a haute entropie supplementaires via Accept-CH. BotBrowser repond a ces demandes avec les valeurs du profil. Si vous testez contre un service specifique, verifiez quels hints il demande et confirmez que les reponses de BotBrowser sont completes et coherentes.
Questions frequentes
Quelle est la difference entre User-Agent et Client Hints ?
L'en-tete User-Agent est une chaine unique contenant les informations du navigateur, de la version et du systeme d'exploitation dans un format libre. Les Client Hints (en-tetes Sec-CH-UA-*) fournissent les memes informations sous forme de paires cle-valeur structurees. Les navigateurs Chromium modernes envoient les deux, et les serveurs les comparent pour verifier la coherence. Consultez User Agent personnalise pour une comparaison detaillee.
Puis-je configurer les Client Hints manuellement avec Playwright ou Puppeteer ?
Playwright et Puppeteer permettent de remplacer la chaine User-Agent et, via CDP, certaines metadonnees Client Hints. Cependant, ces remplacements ne couvrent pas toutes les surfaces (workers, service workers, valeurs a haute entropie) et necessitent une gestion manuelle des marques GREASE. L'approche basee sur les profils de BotBrowser couvre chaque surface et evite le risque que des remplacements partiels creent des incoherences.
Les Client Hints fonctionnent-ils en mode headless ?
Oui. BotBrowser envoie des Client Hints identiques en mode headless et en mode avec interface graphique. Les en-tetes Sec-CH-UA et les valeurs de navigator.userAgentData sont les memes quel que soit le mode d'affichage.
Comment les Client Hints sont-ils lies aux proprietes de navigator ?
navigator.userAgentData est l'interface JavaScript pour les Client Hints. Les marques, la plateforme et le flag mobile exposes via navigator.userAgentData correspondent directement aux en-tetes HTTP Sec-CH-UA, Sec-CH-UA-Platform et Sec-CH-UA-Mobile. BotBrowser s'assure qu'ils sont toujours alignes. Pour plus d'informations sur les proprietes de navigator, consultez Fingerprinting des proprietes Navigator.
Que se passe-t-il si le serveur ne demande pas les hints a haute entropie ?
BotBrowser n'envoie les en-tetes Client Hints a haute entropie que lorsque le serveur les demande via Accept-CH, suivant le comportement standard de Chromium. Cependant, l'API JavaScript getHighEntropyValues() est toujours disponible. BotBrowser s'assure que les en-tetes HTTP (lorsqu'ils sont envoyes) et l'API JavaScript retournent des valeurs coherentes du profil.
Les en-tetes Client Hints peuvent-ils etre utilises pour le suivi sans JavaScript ?
Oui. Les en-tetes par defaut Sec-CH-UA, Sec-CH-UA-Mobile et Sec-CH-UA-Platform sont envoyes avec chaque requete HTTP, meme lorsque JavaScript est desactive. C'est pourquoi la protection de BotBrowser opere au niveau du moteur plutot que de s'appuyer sur des interventions au niveau JavaScript.
A quelle frequence dois-je mettre a jour mes profils pour la precision des Client Hints ?
Chaque version de Chrome peut introduire des changements dans les valeurs Client Hints. Il est recommande de mettre a jour les profils a chaque version majeure de Chrome (environ toutes les quatre semaines) pour s'assurer que les valeurs correspondent aux versions actuelles du navigateur.
BotBrowser prend-il en charge les remplacements de marque pour Edge, Brave et Opera ?
Oui. Le flag --bot-config-browser-brand prend en charge chrome, edge, brave, opera et webview. Lorsqu'une marque est specifiee, BotBrowser met a jour tous les en-tetes Client Hints, les API JavaScript et la chaine User-Agent pour refleter la marque choisie de maniere coherente.
Resume
Les en-tetes Client Hints transportent des informations d'identite du navigateur a chaque requete HTTP, creant une surface significative pour la confidentialite qui opere avant le chargement de tout contenu de page. La coherence de ces valeurs entre les types de requetes, les contextes d'execution et entre les en-tetes HTTP et les API JavaScript est critique pour la protection de la confidentialite.
BotBrowser gere cela au niveau du moteur. Les profils captures a partir d'instances reelles du navigateur definissent toutes les valeurs Client Hints. Ces valeurs sont generees une fois a partir du profil et appliquees uniformement a chaque type de requete, chaque contexte d'execution et chaque surface d'API. Le resultat est un comportement Client Hints qui correspond a la sortie reelle du navigateur, car il est produit par le meme moteur Chromium avec une configuration pilotee par le profil.
Pour plus d'informations sur les sujets lies, consultez :
- User Agent personnalise pour la gestion des chaines User-Agent et Client Hints
- Fingerprinting des proprietes Navigator pour l'identite du navigateur au niveau JavaScript
- Qu'est-ce que le fingerprinting de navigateur pour un apercu complet des techniques de fingerprinting
Articles Connexes
Prêt à protéger votre empreinte navigateur ?
BotBrowser offre un contrôle des empreintes au niveau moteur avec des profils réels. Commencez gratuitement ou explorez toutes les fonctionnalités.