Pendant longtemps, je n'avais tout simplement aucun gestionnaire de cookies sur mes sites. Puis est arrivé Google Consent Mode v2 avec son lot de textes, de mises en garde, et d'obligations supposées. En lisant tout ça, j'ai cru comprendre qu'il fallait absolument passer par un outil tiers certifié. J'ai donc installé CookieHub. Sauf que, avec le recul, je me suis rendu compte que j'avais surtout été noyé dans les textes marketing de ces mêmes outils, qui ont tout intérêt à faire croire que leur abonnement est indispensable.
Le mythe du CMP obligatoire
Partout, on entendait la même chose : "Vous devez utiliser une CMP certifiée par Google, sinon vos données Analytics vont disparaître, vos campagnes Ads vont souffrir…". Les agences, les prestataires, les outils SaaS en ont profité pour pousser leurs abonnements payants. Et franchement, pendant un moment, je l'ai cru.
Mais en creusant un peu, j'ai réalisé que c'est un raccourci trompeur. Le Google Consent Mode v2 est une technologie de signalement du consentement vers Google. Il ne vous impose pas d'utiliser une plateforme externe certifiée. Ce que Google demande, c'est que les signaux de consentement soient correctement envoyés. Rien n'interdit techniquement de le faire avec votre propre gestionnaire, du moment que les bons signaux partent.
En clair : vous n'êtes pas légalement obligé d'avoir un abonnement à une CMP tierce. Vous pouvez tout à fait gérer ça vous-même.
La découverte : whitecube/laravel-cookie-consent
En cherchant une solution propre pour mes projets Laravel, je suis tombé sur le package whitecube/laravel-cookie-consent. Il coche vraiment toutes les cases :
- ✅ 100% conforme RGPD : conçu avec des experts juridiques
- 🎨 Entièrement personnalisable : vues Blade publiables, CSS modifiable
- ⚡ Fonctionne sans JavaScript : la soumission du consentement passe par de simples requêtes HTTP (formulaires natifs). Le JS est utilisé en surcouche pour améliorer l'UX (rechargement asynchrone), mais l'essentiel fonctionne sans
- 🚀 Zéro dépendance CDN tiers : la bannière est servie directement par votre application. Aucune requête externe, un chargement plus rapide, et un meilleur score Google PageSpeed Insights
- 🌍 Multilingue : traductions disponibles dont le français
- 🔧 Intégration native Laravel : Service Provider, Facade, directives Blade
Ce package fait partie de ma sélection d'outils découverts lors de la construction d'ilogus.fr. Découvrez les autres packages Spatie que j'utilise dans mon article : Les packages Laravel Spatie indispensables.
Installation
composer require whitecube/laravel-cookie-consent
Ensuite, publiez les fichiers nécessaires :
# Le Service Provider
php artisan vendor:publish --tag=laravel-cookie-consent-service-provider
# La configuration
php artisan vendor:publish --tag=laravel-cookie-consent-config
# (Optionnel) Les vues pour personnaliser le design
php artisan vendor:publish --tag=laravel-cookie-consent-views
# (Optionnel) Les fichiers de traduction
php artisan vendor:publish --tag=laravel-cookie-consent-lang
Pour Laravel 11+, ajoutez le provider dans bootstrap/providers.php :
return [
App\Providers\AppServiceProvider::class,
App\Providers\CookiesServiceProvider::class,
];
Ma configuration
Dans App\Providers\CookiesServiceProvider, j'utilise uniquement deux catégories : les cookies essentiels et Google Analytics. C'est tout ce dont j'ai besoin.
use Whitecube\LaravelCookieConsent\Facades\Cookies;
protected function registerCookies(): void
{
// Cookies essentiels : Laravel gère automatiquement la session et le CSRF
Cookies::essentials()
->session()
->csrf();
// Google Analytics : le script n'est injecté que si l'utilisateur accepte
Cookies::analytics()
->google(
id: config('cookieconsent.google_analytics.id'),
anonymizeIp: config('cookieconsent.google_analytics.anonymize_ip')
);
}
Ce qui est vraiment élégant ici : ->session() et ->csrf() déclarent automatiquement les cookies internes de Laravel (session, XSRF-TOKEN…) sans avoir à les lister à la main. Et ->google() injecte le script Analytics dans le <head> uniquement si l'utilisateur a donné son consentement. Zéro tracking avant accord, en une ligne.
Intégration dans les vues
Dans le layout principal, deux directives suffisent :
<!DOCTYPE html>
<html lang="fr">
<head>
<!-- ... -->
@cookieconsentscripts
</head>
<body>
<!-- ... -->
@cookieconsentview
</body>
</html>

La page politique de cookies
Un point souvent négligé : la page de politique de cookies doit lister tous les cookies utilisés, leur durée, et leur finalité. Le package expose directement les données déclarées dans le provider, ce qui permet de générer cette page dynamiquement, sans jamais avoir à la maintenir à la main :
<div class="legal-content">
<p class="legal-intro">
{{ __('messages.legal_cookies_intro') }}
</p>
@foreach($categories as $category)
<div class="cookie-category">
<h2>{{ $category->title }}</h2>
@if($category->description)
<p class="category-description">{{ $category->description }}</p>
@endif
<div class="cookie-table-wrapper">
<table class="cookie-table">
<thead>
<tr>
<th>{{ __('messages.legal_cookies_table_name') }}</th>
<th>{{ __('messages.legal_cookies_table_purpose') }}</th>
<th>{{ __('messages.legal_cookies_table_duration') }}</th>
</tr>
</thead>
<tbody>
@foreach($category->getCookies() as $cookie)
<tr>
<td><code>{{ $cookie->name }}</code></td>
<td>{{ $cookie->description }}</td>
<td>
{{ \Carbon\Carbon::now()->diffForHumans(\Carbon\Carbon::now()->addMinutes($cookie->duration), true) }}
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
@endforeach
<div class="legal-block">
<h2>{{ __('messages.legal_cookies_management_title') }}</h2>
<p>{!! __('messages.legal_cookies_management_content') !!}</p>
<p>
@cookieconsentbutton(action: 'reset', label: __('messages.legal_cookies_management_button'), attributes: ['class' => 'legal-link'])
</p>
</div>
<div class="legal-notice">
<p><small>{{ __('messages.legal_cookies_notice') }}</small></p>
</div>
</div>
Le bouton reset en bas de page permet à l'utilisateur de modifier son consentement à tout moment. C'est une obligation légale RGPD souvent oubliée, et ici c'est juste une directive.
Personnalisation CSS
Je n'ai pas publié les vues Blade. J'ai simplement ciblé l'id de la bannière générée par le package pour surcharger le CSS :
/* La bannière est rendue dans un <aside id="cookies-policy"> */
#cookies-policy .cookies__title {
color: var(--text-primary);
font-weight: 700;
line-height: 1.4em;
margin-bottom: 0.8em;
}
C'est suffisant pour l'adapter au design du site sans toucher aux vues du vendor.
⚠️ Point d'attention : quand une CMP certifiée devient obligatoire
Tout ce qui précède s'applique à un cas précis : un site qui utilise uniquement des cookies analytiques ou fonctionnels (comme Google Analytics), sans publicité programmatique ni revente de données.
Si vous diffusez des bannières publicitaires via des réseaux comme Google AdSense ou Ad Manager, la situation est différente. Dans ce cas, vous entrez dans le cadre de l'IAB TCF (Transparency and Consent Framework), un standard européen qui impose d'utiliser une CMP certifiée pour transmettre les signaux de consentement à l'ensemble de la chaîne publicitaire programmatique. Depuis février 2026, Google exige explicitement cette certification pour continuer à diffuser des annonces dans l'EEE. Sans CMP compatible TCF v2.3, vous êtes tout simplement exclu des enchères.
En résumé :
- Site vitrine / blog / analytics uniquement → une solution comme
whitecube/laravel-cookie-consentsuffit, légalement et techniquement - Site avec publicité programmatique ou revente de données → une CMP certifiée IAB TCF (Cookiebot, Didomi, Axeptio...) est obligatoire
Ce que j'en retiens
Pour des projets Laravel sans besoins ultra-complexes, ce package est une solution propre, légère et économique. Plus besoin de payer CookieHub ou autre quand vous avez le contrôle total du code, une page de politique générée dynamiquement, et une intégration Google Analytics en une ligne.
Autre bénéfice non négligeable : aucune dépendance vers un CDN tiers. La bannière est entièrement servie par votre propre application, ce qui se traduit directement par un chargement plus rapide et un meilleur score Google PageSpeed Insights. Un détail qu'on oublie souvent quand on colle un script CookieHub ou Cookiebot en bas de page.