Trace pré-consentement
v1.0 — 27 juillet 2026
La méthode et le test que j'utilise pour vérifier qu'une page n'émet aucune requête tierce avant toute interaction. Reproductible à la main, automatisable, et exécutée à chaque déploiement de ce site.
La méthode
- Fenêtre de navigation privée.
- Stockage vidé — cookies, localStorage, sessionStorage.
- Onglet « Réseau » des outils de développement en enregistrement.
- Rechargement forcé de la page.
- Ne toucher à rien.
Ce qui est vérifié à T-0
- Liste blanche, pas liste noire : à T-0, toute requête réseau a la même origine que la page. Toute requête tierce échoue — traqueur connu ou non.
- document.cookie est vide.
- localStorage et sessionStorage ne contiennent qu'une éventuelle clé fonctionnelle de première partie (ici portfolio-locale).
Le test (Playwright)
// Trace pré-consentement — v1.0 (27 juillet 2026)
// Licence : CC BY 4.0 — https://creativecommons.org/licenses/by/4.0/deed.fr
// Auteur : Mickael Gomes — https://mickael-gomes.com/grilles/trace-pre-consentement
//
// MÉTHODE (à reproduire à la main, sans aucun outil) :
// 1. Fenêtre de navigation privée.
// 2. Stockage vidé (cookies, localStorage, sessionStorage).
// 3. Onglet « Réseau » des outils de développement en enregistrement.
// 4. Rechargement forcé de la page.
// 5. Ne toucher à rien.
//
// À T-0 (avant toute interaction), on vérifie par une LISTE BLANCHE, non par une
// liste noire : toute requête réseau doit avoir la même origine que la page.
// Toute requête tierce échoue — qu'il s'agisse d'un traqueur connu ou non.
// On vérifie aussi qu'aucun cookie n'est posé et que le stockage ne contient
// rien d'autre qu'une éventuelle clé fonctionnelle de première partie.
//
// Playwright — `npx playwright test` (adapter PAGES et ALLOWED_STORAGE à votre site) :
import { test, expect, type Request } from "@playwright/test";
const PAGES = ["/"]; // les pages à tracer
const ALLOWED_STORAGE = new Set<string>([]); // clés fonctionnelles de 1re partie tolérées
for (const path of PAGES) {
test(`pre-consent T-0 (same-origin only): ${path}`, async ({ page, context }) => {
await context.clearCookies();
const requests: string[] = [];
page.on("request", (r: Request) => requests.push(r.url()));
// Chargement, puis délai pour laisser partir les requêtes différées/asynchrones.
// Aucune interaction.
await page.goto(path, { waitUntil: "commit" });
await page.waitForTimeout(2500);
const pageOrigin = new URL(page.url()).origin;
const crossOrigin = [
...new Set(
requests
.filter((u) => /^https?:/i.test(u))
.filter((u) => {
try {
return new URL(u).origin !== pageOrigin;
} catch {
return true;
}
}),
),
];
const cookie = await page.evaluate(() => document.cookie);
const storage = await page.evaluate(() => [
...Object.keys(localStorage),
...Object.keys(sessionStorage),
]);
const disallowedStorage = storage.filter((k) => !ALLOWED_STORAGE.has(k));
expect(crossOrigin, `requête(s) tierce(s) à T-0 :\n${crossOrigin.join("\n")}`).toEqual([]);
expect(cookie, "document.cookie doit être vide à T-0").toBe("");
expect(disallowedStorage, "stockage non autorisé à T-0").toEqual([]);
});
}
Licence
Cette grille et son test sont publiés sous licence Creative Commons Attribution 4.0 (CC BY 4.0) (ouvre un nouvel onglet). Réutilisation libre, y compris commerciale, avec attribution.
Journal des versions
- v1.0 — 27 juillet 2026 — version initiale : liste blanche same-origin à T-0, cookie vide, stockage limité à la clé fonctionnelle de première partie.