Mettre Google Analytics en conformité avec le RGPD, sans bandeau de cookie

De quoi on parle ?

Google Analytics est sûrement l’outil de statistiques web le plus utilisé. Son premier avantage est d’être gratuit, mais il faut dire qu’il propose énormément de fonctionnalités, avec une ergonomie plutôt bonne une fois qu’on s’est repéré dans les options.
Pour fonctionner, Google Analytics a besoin de poser un cookie sur le navigateur des internautes, afin de pouvoir les suivre tout au long de leurs visites (sans cela, chaque page vue serait perçue comme étant la première d’une nouvelle visite). Au passage, Google récolte un certain nombre d’infos ; certaines sont accessibles (la taille de l’écran, la langue du navigateur…), d’autres comme l’adresse IP des internautes sont utilisées par Google en interne.

Le RGPD a été promulgué en 2016, et si la CNIL a fait preuve de tolérance dans l’application de certaines contraintes, il est temps désormais de se mettre en conformité sous peine de sanctions.

Ce dont je parle, ce n’est pas seulement l’obligation de prévenir les internautes qu’on pose des cookies sur leur navigateur. En effet, pendant très longtemps la majorité des sites se contentaient de mettre un bandeau alertant les internautes (avec un simple bouton « OK » pour cacher le panneau). Mais cela n’était déjà pas suffisant. Depuis 5 ans, en plus d’informer il faut aussi donner la possibilité de refuser l’ajout de cookies.
On peut regrouper les cookies en plusieurs groupes, permettant d’accepter ou de refuser tous les cookies de statistiques d’un côté, tous les cookies publicitaires de l’autre, etc.

Est-ce qu’on peut simplifier ?

Mais vous avez peut-être un site sur lequel vous ne diffusez pas de publicités, et pour lequel vous n’avez besoin que d’un minimum de statistiques (nombre de visiteurs, nombre de pages vues, etc.). Vous voulez utiliser Google Analytics, mais vous n’avez pas envie de mettre un bandeau de cookie.
Il faut voir aussi que si votre solution de statistiques est configurée pour déposer des cookies, et que vous laissez la possibilité à l’utilisateur de le refuser, une partie (potentiellement importante) de votre trafic ne sera plus comptabilisée. Donc ce serait doublement avantageux de trouver une solution qui n’impose pas de pollution visuelle (le bandeau d’information sur les cookies), et qui ne risque pas de fausser vos statistiques.

Il existe quelques alternatives qui mettent en avant le respect de la vie privée des internautes, comme Matomo ou Analytics Suite Delta d’AT Internet (si configuré comme le préconise la CNIL). Mais ce sont des solutions payantes (avec la possibilité de l’installer gratuitement sur ses propres serveurs dans le cas de Matomo, mais ça représente aussi des coûts).

Ça tombe bien, il est possible d’utiliser Google Analytics sans mettre de bandeau cookies, tout en étant en conformité avec le RGPD. Pour cela, il faut appliquer deux modifications dans l’appel à Google Analytics :

  • demander à ce qu’aucun cookie ne soit déposé sur le navigateur ;
  • anonymiser les requêtes pour que Google ne stocke pas les adresses IP.

Ensuite, on verra une astuce pour que les différentes pages vues par un même internaute soient comptabilisées correctement.

Modification de l’appel Javacript

Je vais partir du principe que vous utilisez la dernière version de Google Analytics, dont l’appel utilise Google Tag Manager.

Vous devez donc avoir dans votre code HTML quelque chose qui ressemble à ça :

<script async src="https://www.googletagmanager.com/gtag/js?id=VOTRE_IDENTIFIANT_GA"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', "VOTRE_IDENTIFIANT_GA");
</script>

On va donc modifier ce code. Tout se passe dans le dernier appel de fonction, à laquelle on va passer des paramètres supplémentaires :

<script async src="https://www.googletagmanager.com/gtag/js?id=VOTRE_IDENTIFIANT_GA"></script>
<script>
    window.dataLayer = window.dataLayer || [];
    function gtag(){dataLayer.push(arguments);}
    gtag('js', new Date());
    gtag('config', 'VOTRE_IDENTIFIANT_GA', {
        client_storage: 'none',
        anonymize_ip: true
    });
</script>

La clé client_storage sert à indiquer de ne rien enregistrer sur le navigateur (grâce à la valeur « none« ), et donc de ne pas déposer de cookie. La clé anonymize_ip fait en sorte que Google ne stocke pas l’adresse IP exacte de l’internaute.

Et voilà, pas besoin de plus pour être en conformité avec le RGPD. Et si vous ne déposez pas de cookies par ailleurs (soit par vous-même, soit par de la publicité ou autre appels à des librairies externes), vous n’avez pas besoin de mettre de bandeau cookie. Merveilleux, non ?

Et le suivi des visites ?

Il reste un problème avec le code ci-dessus : si un internaute visite plusieurs pages, au gré de ses clics sur les liens internes du site, vous ne saurez pas qu’il s’agit de la même personne. Chaque page sera considérée comme faisant partie d’une nouvelle visite ; vous aurez un nombre de visiteurs, un nombre de visites et un nombre de pages vues qui seront tous égaux.
C’est logique ; sans cookie sur le navigateur, il n’est pas possible de savoir que deux accès sont effectués depuis le même navigateur.

Mais ne serait-il pas possible d’utiliser un autre moyen pour identifier un visiteur ?

L’idée va être de générer un identifiant côté serveur, qui sera le même pour toutes les pages consultées par un même visiteur. On fournira cet identifiant à Google Analytics, qui pourra ainsi rapprocher les différentes connexions pour les regrouper au sein de la même “visite”.

La question est maintenant de savoir comment générer cet identifiant, sans déposer de cookie ni enregistrer des données personnelles en base de données. Ce qu’on peut faire, c’est utiliser l’adresse IP du visiteur. C’est une solution imparfaite, car plusieurs personnes peuvent visiter le site avec la même adresse IP ; mais c’est une approximation dont on se satisfera faute de mieux.

On ne va évidemment pas utiliser l’adresse IP telle quelle, car encore une fois c’est une donnée personnelle qu’il ne faut surtout pas transmettre en clair à Google. Par contre, il est possible de l’utiliser dans un calcul, dont le résultat sera toujours le même pour une adresse IP donnée.

On va donc calculer un hash MD5 à partir de l’adresse IP, à laquelle on aura concaténé l’année courante et le numéro de semaine courante. L’identifiant généré changera donc toutes les semaines, ce qui est suffisant pour suivre les pages vues pendant une visite.
Si on pinaille, on pourra remarquer qu’une personne qui visite le site du dimanche soir 23h30 jusqu’au lundi matin 00h30 sera vue comme deux visiteurs séparés. Si c’est vraiment problématique, on peut remplacer le numéro de la semaine par le numéro du mois ; le phénomène existera toujours, mais 12 fois par an au lieu de 52.

Voici un exemple de code serveur en PHP pour faire ce calcul :

$gaClientId = md5($_SERVER['REMOTE_ADDR'] . date('YW'));

Il faut ensuite utiliser cette variable dans le code Javascript. Voici un exemple d’utilisation en pur PHP (a priori vous utilisez sûrement un système de templates, mais c’est facilement adaptable) :

<script async src="https://www.googletagmanager.com/gtag/js?id=VOTRE_IDENTIFIANT_GA"></script>
<script>
    window.dataLayer = window.dataLayer || [];
    function gtag(){dataLayer.push(arguments);}
    gtag('js', new Date());
    gtag('config', 'VOTRE_IDENTIFIANT_GA', {
        client_storage: 'none',
        anonymize_ip: true,
        client_id: '<?=$gaClientId?>'
    });
</script>

Concernant la publicité

Le cas de la publicité en ligne est un peu particulier, notamment parce que Google crée des passerelles entre ses différents outils. Dans la console de Google Analytics, il est possible d’activer les fonctionnalités de remarketing. Donc pour être certain de ne pas commettre d’impair, vous pouvez vouloir les désactiver dans le code Javascript.

Pour cela, on va faire un appel de fonction supplémentaire :

<script async src="https://www.googletagmanager.com/gtag/js?id=VOTRE_IDENTIFIANT_GA"></script>
<script>
    window.dataLayer = window.dataLayer || [];
    function gtag(){dataLayer.push(arguments);}
    gtag('js', new Date());
    gtag('set', 'allow_google_signals', false);
    gtag('config', 'VOTRE_IDENTIFIANT_GA', {
        client_storage: 'none',
        anonymize_ip: true,
        client_id: '<?=$gaClientId?>'
    });
</script>

Avec cet appel supplémentaire, tous les appels publicitaires seront désactivés.

Événements Javascript

Google Analytics permet aussi de pister les clics qui sont faits. Cela peut être utile si vous chargez des pages en Javascript.

Dans ce cas, il faudra appeler la fonction gtag() en lui passant un paramètre supplémentaire.
Mais, pour commencer, on va reprendre le code précédent, en créant des variables globales qui faciliteront l’accès à l’identifiant Google Analytics et à l’identifiant client :

<script async src="https://www.googletagmanager.com/gtag/js?id=VOTRE_IDENTIFIANT_GA"></script>
<script>
    window._googleAnalyticsId = "VOTRE_IDENTIFIANT_GA";
    window._googleAnalyticsClientId = "<?=$gaClientId?>";

    window.dataLayer = window.dataLayer || [];
    function gtag(){dataLayer.push(arguments);}
    gtag('js', new Date());
    gtag('set', 'allow_google_signals', false);
    gtag('config', window._googleAnalyticsId, {
        client_storage: 'none',
        anonymize_ip: true,
        client_id: window._googleAnalyticsClientId
    });
</script>

Ensuite, à chaque fois qu’une page va être chargée en Javascript, on appellera le code suivant :

gtag('config', window._googleAnalyticsId, {
    page_path: "/URL/de/la/page",
    client_storage: 'none',
    anonymize_ip: true,
    client_id: window._googleAnalyticsClientId
});

La clé page_path doit contenir l’URL que vous voulez voir apparaître dans Google Analytics.

11 commentaires pour “Mettre Google Analytics en conformité avec le RGPD, sans bandeau de cookie

  1. Article intéressant 🙂
    si on veut affiner encore un peu les utilisateurs avec une même IP, on peut ajouter un peu plus d’informations dans le hash (par exemple si disponible le user agent ou d’autres entête HTTP lié au navigateur).

  2. @Damien : Non, c’est tentant mais c’est une fausse bonne idée. Tu tombes dans le « fingerprinting », qui est considéré comme un traceur au même titre que les cookies.

    Voir cet article de la CNIL : Cookies et traceurs : que dit la loi ?
    (il contient un lien vers cette explication du fingerprinting)

    Déjà, le calcul d’un identifiant à partir de l’adresse IP semble ne pas entrer dans le cadre du fingerprinting (surtout en réduisant la fenêtre temporelle de suivi), mais ce n’est pas très clair.

  3. ah j’avais raté cette « subtilité », bah j’ai appris un truc aujourd’hui

  4. Personnelement, je ne fait pas confiance à Google pour ne pas enregistré l’ip des visiteurs simplement car je lui demande gentiment.
    Si je ne me trompe pas, c’est la machine du client qui fait l’appel de tracking, avec son ip donc.
    Il la stock donc forcément dans leur logs, pour des raisons technique variées (et légitime), et que rien de me permet de savoir si google ne s’en sert pas pour autant. Cet aspet (le client fait l’appel lui même au serveur de google) à lui seul rend ta démarche caduc selon moi. Mais je suis extremiste de ce coté là je te l’accorde.

    Ensuite, Google peut tout a fait continuer de faire son fingerprinting avec les info qu’il a, ce qu’il fait très certainement. (UserAgent, ip, date, ordre des headers, …)

  5. @Zed : Si tu es en mode parano, tu as sûrement raison. Disons que je suis plus pragmatique et moins dogmatique.

    @Charlie: Renseignement pris, cette technique ne fonctionne pas avec Google Analytics v4, qui est le nouveau nom de GA « App + Web » (et « GA 360 » en version premium pour les entreprises). GA v4 est sorti en fin d’année dernière.
    Mais je confirme que ça fonctionne très bien avec un tag créé il y a un peu plus d’un an.

    J’avais réussi à trouver une page de documentation bien enfouie ; clairement ce n’était pas mis en avant par Google, ça ne va pas dans leur intérêt.

  6. C’est un peu dogmatique, je suis d’accord.
    À la fin, si tu veut utilisé GoogleAnlaytics, rien à dire, cependant, le message de ton article disant qu’il est possible de le faire en respectant GDPR, sans avertir le visiteur ni lui demandé son consentement, me semble un peu exagéré. Et même si légalement tout vas bien, car les « Privacy policies » s’alignent, dans le font le soucis du tracking reste le même et ne change pas.
    Utiliser Google analytics implique du tracking de ses visiteurs de la part de google quoi qu’il se passe. De plus, les commentaire précédent semble indiqué que google à changer la donne et rend les astuce que tu montre invalide (ce qui n’est guère étonnant de la part de google 😀 )

    Qui dit tracking de la part d’un prestataire/partenaire (ce qu’est google dans ton example), la GDPR dit recueil du consentement libre, non équivoque et éclairé du visiteur.

  7. Non, pas d’accord. Il y a un paramètre pour demander à ce que l’adresse IP soit anonymisée. Ce paramètre est très explicite. Toi tu pars du principe que Google fait sûrement l’inverse dans notre dos ; tu es libre de penser ça, mais c’est assez gratuit.
    En partant du principe que Google fait ce qu’il dit faire, le postulat de l’article reste complètement valide.

    Et si une nouvelle version de Google Analytics retire ce paramètre, mais que ça fonctionne toujours pour les trackings existants, ça ne rend pas cet article caduque. Le jour où Google forcera tout le monde à migrer vers la dernière version, ce sera différent − on est d’accord.
    En l’occurrence, le paramètre que Google a supprimé concerne les cookies, pas l’anonymisation de l’IP.

    Si tu es certain au fond de toi que Google enregistre systématiquement l’IP de l’internaute, je ne peux que t’inviter à installer Matomo. Je ne suis pas là pour prendre la défense de Google ou te faire changer d’avis. Mais mon blog n’est pas là non plus pour troller sur Google.

  8. > Non, pas d’accord. Il y a un paramètre pour demander à ce que l’adresse IP soit anonymisée. Ce paramètre est très explicite. Toi tu pars du principe que Google fait sûrement l’inverse dans notre dos ; tu es libre de penser ça, mais c’est assez gratuit.

    Non c’est pas gratuit 😀 C’est basé sur leur comportement, leurs intérêts, ect. Mes conviction sont pas très importantes et pas le sujet.

    > Et si une nouvelle version de Google Analytics retire ce paramètre, mais que ça fonctionne toujours pour les trackings existants, ça ne rend pas cet article caduque. Le jour où Google forcera tout le monde à migrer vers la dernière version, ce sera différent − on est d’accord.

    Le mot caduc est un peu fort, je te présente mes excuse. Je le remplacerais par « conditionné » .Je pense aussi que ton article sera lu par des gens de bonne fois souhaitant utiliser GA éthiquement (ou simplement sans bannière GDPR) lors de la mise en place de leur site/blog/service/… Ceux la pourront ils utiliser les ancien tag ? (partant du principe qu’ils commence tout juste ?)

    > En l’occurrence, le paramètre que Google a supprimé concerne les cookies, pas l’anonymisation de l’IP.

    Totalement d’accord pour le cookie, de plus c’est du code JS que tu peu inspecté (même s’il est minifié/ofusqué) . Je suis plus inquiet par les appels de tracking que ce que fait le tag. Tu pourrais même faire les appels de tracking GA toi même sans passer par leur tag. (et donc bien respecter cette logique de « non pose de cookie »). Je me demande si ça existe, un tag open-source d’ailleurs.

    > Si tu es certain au fond de toi que Google enregistre systématiquement l’IP de l’internaute, je ne peux que t’inviter à installer Matomo. Je ne suis pas là pour prendre la défense de Google ou te faire changer d’avis. Mais mon blog n’est pas là non plus pour troller sur Google.

    Désolé si mes mots donnent l’impression de troller google. C’est pas mon souhait. Et vraiment sans troll, c’est techniquement obligatoire de fournir l’ip des visiteurs a Google. (à moins que le client passe par un VPN/TOR, ce qui n’est pas le sujet). C’est pourquoi la confiance en Google est important et ne peu être mis de coté. Je ne dis pas qu’il ne faut pas avoir confiance, (même si je le pense), je dit que c’est important de le noté.

    Pour finir, ton article je le trouve très bien. Et réalisé ce que tu décrit est très bien aussi, et vas dans le bon sens je trouve (pour la Privacy, et l’expérience visiteur) . Je ne remet absolument pas en cause son contenu ni les étapes décrites.

  9. Merci pour l’article, pas mal d’entreprises aujourd’hui ne sont toujours pas conforme au RGPD, sans parler des cookies, traçages …

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Notifiez-moi des commentaires à venir via email. Vous pouvez aussi vous abonner sans commenter.