Concepts Fondamentaux
HttpOnly vs Stockage Côté Client
Les cookies marqués HttpOnly ne peuvent pas être consultés ou modifiés par JavaScript côté client (cookieStore ou document.cookie). Cependant, le navigateur attache automatiquement les cookies HttpOnly actifs aux en-têtes des requêtes HTTP sortantes (Cookie).
- Pour inspecter les valeurs HttpOnly actuelles : Consultez l'en-tête de requête
Cookiede toute requête HTTP sortante viaget_network_request. - Pour inspecter comment les cookies ont été créés ou configurés : Consultez l'en-tête de réponse
Set-Cookiedes réponses de connexion ou d'authentification. - Pour inspecter les cookies non-HttpOnly : Utilisez
evaluate_scriptavec l'API modernecookieStore(async () => await cookieStore.getAll()).
Stratégie de Session : Onglet Actif vs Contexte Isolé
Choisissez l'environnement de session approprié pour éviter la contamination de l'état (par exemple, analytiques résiduelles ou jetons d'authentification) :
| Stratégie | Quand l'utiliser | Mise en place / Nettoyage |
|---|---|---|
| Onglet Actif (Page Active) | Diagnostiquer une session utilisateur active, une erreur 401/403 en direct, ou l'état actuel. | Opère directement sur la page actuellement sélectionnée. |
Page vierge (isolatedContext) | Tester les bannières de consentement aux cookies, les premières visites, ou les garanties zéro-cookie. | Appelez new_page avec un isolatedContext unique (ex: "consent-audit-1"). Une fois terminé, appelez close_page. |
Capacités & Limitations Côté Client
| Action | JavaScript Client (cookieStore / document.cookie) | Outils DevTools Réseau & Contexte |
|---|---|---|
| Lire Non-HttpOnly | ✅ async () => await cookieStore.getAll() | ✅ get_network_request (Requête Cookie) |
| Lire HttpOnly | ❌ Bloqué par la sécurité du navigateur | ✅ get_network_request (Requête Cookie) |
Inspecter les Attributs (Domain, Path, SameSite, Expires) | ✅ async () => await cookieStore.getAll() | ✅ get_network_request (Réponse Set-Cookie) |
| Modifier / Supprimer Non-HttpOnly | ✅ async () => await cookieStore.set(...) | N/A |
| Modifier / Supprimer HttpOnly | ❌ Échec silencieux en JavaScript | ✅ Utilisez new_page(isolatedContext: ...) pour un état vierge |
[!AVERTISSEMENT] Tenter d'effacer un cookie
HttpOnlyvia JavaScript (cookieStore.deleteoudocument.cookie = "...; max-age=0") échouera silencieusement. Pour tester dans un état non authentifié ou vierge, créez toujours un nouveau contexte isolé en utilisantnew_pageavecisolatedContext.
Schémas de Travail
1. Diagnostiquer les Échecs d'Authentification & Redirections (401 / 403)
Lorsqu'une requête de page authentifiée échoue, retourne 401/403, ou redirige vers la connexion :
- Lister les Requêtes Récentes : Appelez
list_network_requestsavecincludePreservedRequests: true. - Trouver la Requête Cible : Localisez la requête en échec (401/403) ou la redirection (302/307).
- Inspecter l'En-tête
CookieSortant : Appelezget_network_requestavec lereqid.- Vérifiez si l'en-tête
Cookiea été attaché et si les jetons requis (ex:SESSION_ID,auth_token) ont été envoyés.
- Vérifiez si l'en-tête
- Déclencher une Inspection Active (si aucune requête récente n'existe) :
- Si le cookie a été défini dans une session précédente et qu'aucun appel réseau n'est listé, déclenchez une requête :
- Utilisez
navigate_pageavecreload: true, OU - Appelez
evaluate_scriptavec() => fetch(window.location.href)
- Utilisez
- Ensuite, appelez
get_network_requestsur la nouvelle requête pour inspecter l'en-têteCookieactif.
- Si le cookie a été défini dans une session précédente et qu'aucun appel réseau n'est listé, déclenchez une requête :
- Tracer la Requête de Définition : Si le cookie est manquant ou rejeté :
- Vérifiez les réponses précédentes de connexion/établissement de liaison pour les directives
Set-Cookie:- Incompatibilité de chemin : ex:
Path=/apialors que la requête est vers/. - Incompatibilité de domaine : ex:
Domain=api.example.comempêchant les cookies sursub.example.com. - Drapeau Secure sur HTTP : Les cookies
Securene sont jamais envoyés surhttp://non chiffré. - Blocage SameSite : Les cookies
SameSite=Strictsont omis sur les navigations inter-sites. - Expiration : Vérifiez si
ExpiresouMax-Ageont expiré.
- Incompatibilité de chemin : ex:
- Vérifiez les réponses précédentes de connexion/établissement de liaison pour les directives
2. Test de Conformité de la Bannière de Cookies & Consentement
Pour vérifier qu'aucun cookie non essentiel ou de suivi n'est défini avant le consentement ou en cas de refus :
- Démarrer Propre : Ouvrez un nouveau contexte isolé avec un nom dédié :
{"url": "<PAGE_URL>", "isolatedContext": "consent-test-1"} - Enregistrer les Cookies de Base : Avant d'interagir avec la bannière, exécutez
evaluate_scriptavecasync () => await cookieStore.getAll(). - Inspecter les Requêtes Réseau Prématurées & Problèmes :
- Appelez
list_network_requestspour vous assurer qu'aucun beacon de suivi tiers n'a été déclenché avant le consentement. - Appelez
list_console_messagesavectypes: ["issue"]pour vérifier les avertissements de suivi.
- Appelez
- Interagir avec la Bannière de Consentement :
- Capturez un instantané avec
take_snapshotpour localiser leuiddu bouton "Refuser" ou "Tout Rejeter". - Cliquez sur le bouton avec
click.
- Capturez un instantané avec
- Vérifier la Différence de Cookies :
- Exécutez
evaluate_scriptavecasync () => await cookieStore.getAll()après le clic pour affirmer que seuls les cookies strictement nécessaires ou d'état de consentement existent.
- Exécutez
- Tester la Révocation du Consentement (Audit du Cycle de Vie) :
- Lors de l'audit du retrait du consentement ou des changements de préférences :
- Localisez et cliquez sur le bouton "Paramètres des Cookies", "Gérer les Préférences", ou le déclencheur de confidentialité en pied de page (
take_snapshot$\rightarrow$click). - Désélectionnez les catégories non essentielles ou cliquez sur "Tout Révoquer" / "Enregistrer les Préférences".
- Interrogez à nouveau
cookieStore.getAll()pour vérifier que les cookies non essentiels précédemment acceptés ont été effacés ou ont expiré. - Appelez
list_network_requestssur les actions suivantes pour vous assurer que les beacons de suivi ne sont plus déclenchés.
- Localisez et cliquez sur le bouton "Paramètres des Cookies", "Gérer les Préférences", ou le déclencheur de confidentialité en pied de page (
- Lors de l'audit du retrait du consentement ou des changements de préférences :
- Nettoyage du Contexte : Appelez
close_pageune fois l'audit terminé pour éviter que des cookies résiduels n'affectent les tâches suivantes.
3. Audit de la Sécurité des Cookies, SameSite & CHIPS (Cookies Partitionnés)
- Voie Rapide : Problèmes Natifs DevTools (Recommandé) :
- Appelez
list_console_messagesavec :{ "types": ["issue"], "includePreservedMessages": true } - Vérifiez les entrées
CookieIssue, telles que :SameSiteNoneInsecure:SameSite=NonesansSecure.ThirdPartyCookiePhaseout: Cookie tiers bloqué ou restreint.SchemefulSameSite: Problèmes de cookies multi-schémas.PartitionedCookies: Attributs de partitionnement CHIPS invalides.
- Appelez
- Audit Approfondi : Cookies Tiers Lighthouse :
- Exécutez
lighthouse_auditavecmode: "navigation"etoutputDirPath: "/tmp/lh-report". - Extrayez l'audit spécifique des cookies sans charger le rapport complet dans le contexte :
node -e "const r=require('/tmp/lh-report/report.json'); const a=r.audits['third-party-cookies']; console.log(JSON.stringify({score: a?.score, display
- Exécutez