Süti-hozzájárulás kezelése fizetős CMP nélkül

Hogyan kezeljük a süti-hozzájárulást egy Laravel oldalon fizetős harmadik féltől származó CMP nélkül, a whitecube/laravel-cookie-consent csomaggal.

Sokáig egyszerűen nem volt süti-kezelőm az oldalaimon. Aztán jött a Google Consent Mode v2 a sok szöveggel, figyelmeztetésekkel és feltételezett kötelezettségekkel. Mindezt elolvasva azt hittem, hogy feltétlenül szükség van egy hitelesített harmadik fél eszközre. Ezért telepítettem a CookieHub-ot. De visszatekintve rájöttem, hogy inkább csak elárasztottak ezeknek az eszközöknek a marketing szövegei, akiknek minden érdekük abban van, hogy elhitesse: az előfizetésük elengedhetetlen.

A kötelező CMP mítosza

Mindenhol ugyanazt hallottuk: "Google által hitelesített CMP-t kell használnia, különben az Analytics adatai eltűnnek, az Ads kampányai szenvedni fognak…". Az ügynökségek, a szolgáltatók és a SaaS eszközök ezt kihasználva tolták a fizetős előfizetéseiket. És őszintén, egy ideig én is hittem benne.

De egy kicsit mélyebbre ásva rájöttem, hogy ez egy megtévesztő rövidítés. A Google Consent Mode v2 egy hozzájárulás-jelző technológia a Google felé. Nem követeli meg, hogy hitelesített külső platformot használjon. Amit a Google kér, az az, hogy a hozzájárulási jeleket helyesen küldjék el. Semmi sem akadályozza meg technikailag, hogy ezt a saját kezelőjével tegye meg, amíg a megfelelő jelek elküldésre kerülnek.

Röviden: nem jogszabály kötelezi harmadik fél CMP előfizetésére. Teljesen megoldhatja ezt önállóan.

Tiszta megoldást keresve a Laravel projektjeimhez, rátaláltam a whitecube/laravel-cookie-consent csomagra. Tényleg minden szempontt megfelel:

  • 100%-ban GDPR-konform: jogi szakértőkkel tervezve
  • 🎨 Teljesen testreszabható: közzétehető Blade nézetek, szerkeszthető CSS
  • JavaScript nélkül is működik: a hozzájárulás benyújtása egyszerű HTTP kéréseken keresztül történik (natív űrlapok). A JS csak az UX javítására szolgál (aszinkron újratöltés), de a lényeg nélküle is működik
  • 🚀 Nulla harmadik fél CDN függőség: a banner közvetlenül az alkalmazásból van kiszolgálva. Nincs külső kérés, gyorsabb betöltés és jobb Google PageSpeed Insights pontszám
  • 🌍 Többnyelvű: elérhető fordítások, köztük francia is
  • 🔧 Natív Laravel integráció: Service Provider, Facade, Blade direktívák

Ez a csomag a válogatásom része, amit az ilogus.fr építése közben fedeztem fel. Fedezze fel a többi Spatie csomagot, amit használok a cikkemben: Esszenciális Laravel Spatie csomagok.

Telepítés

composer require whitecube/laravel-cookie-consent

Ezután tegye közzé a szükséges fájlokat:

# A Service Provider
php artisan vendor:publish --tag=laravel-cookie-consent-service-provider

# A konfiguráció
php artisan vendor:publish --tag=laravel-cookie-consent-config

# (Opcionális) A nézetek a dizájn testreszabásához
php artisan vendor:publish --tag=laravel-cookie-consent-views

# (Opcionális) A fordítási fájlok
php artisan vendor:publish --tag=laravel-cookie-consent-lang

Laravel 11+ esetén adja hozzá a providert a bootstrap/providers.php fájlban:

return [
    App\Providers\AppServiceProvider::class,
    App\Providers\CookiesServiceProvider::class,
];

A konfigurációim

Az App\Providers\CookiesServiceProvider fájlban csak két kategóriát használok: az alapvető sütiket és a Google Analytics-t. Ez minden, amire szükségem van.

use Whitecube\LaravelCookieConsent\Facades\Cookies;

protected function registerCookies(): void
{
    // Alapvető sütik: a Laravel automatikusan kezeli a session-t és a CSRF-t
    Cookies::essentials()
        ->session()
        ->csrf();

    // Google Analytics: a szkript csak akkor kerül beszúrásra, ha a felhasználó elfogadja
    Cookies::analytics()
        ->google(
            id: config('cookieconsent.google_analytics.id'),
            anonymizeIp: config('cookieconsent.google_analytics.anonymize_ip')
        );
}

Ami igazán elegáns itt: a ->session() és a ->csrf() automatikusan deklarálja a Laravel belső sütijeit (session, XSRF-TOKEN…) anélkül, hogy kézzel kellene felsorolni őket. És a ->google() csak akkor szúrja be az Analytics szkriptet a <head>-be, ha a felhasználó hozzájárult. Nulla követés a hozzájárulás előtt, egyetlen sorban.

Integráció a nézetekben

A fő elrendezésben két direktíva elegendő:

<!DOCTYPE html>
<html lang="hu">
<head>
    <!-- ... -->
    @cookieconsentscripts
</head>
<body>
    <!-- ... -->
    @cookieconsentview
</body>
</html>

A süti-irányelvek oldal

Egy gyakran elhanyagolt pont: a süti-irányelvek oldalnak fel kell sorolnia az összes használt sütit, azok időtartamát és célját. A csomag közvetlenül közzéteszi a providerben deklarált adatokat, ami lehetővé teszi az oldal dinamikus generálását, anélkül, hogy valaha is kézzel kellene karbantartani:

<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>

A reset gomb az oldal alján lehetővé teszi a felhasználó számára, hogy bármikor módosítsa a hozzájárulását. Ez egy GDPR jogi követelmény, amit gyakran elfelejtenek, és itt ez csak egy direktíva.

CSS testreszabás

Nem tettem közzé a Blade nézeteket. Egyszerűen csak a csomag által generált banner id-ját céloztam meg a CSS felülírásához:

/* A banner egy <aside id="cookies-policy"> elemben jelenik meg */
#cookies-policy .cookies__title {
    color: var(--text-primary);
    font-weight: 700;
    line-height: 1.4em;
    margin-bottom: 0.8em;
}

Ez elegendő az oldal dizájnjához való igazításhoz a vendor nézetek módosítása nélkül.

⚠️ Fontos megjegyzés: mikor válik kötelezővé a hitelesített CMP

A fentiek egy konkrét esetre vonatkoznak: egy oldal, amely kizárólag analitikai vagy funkcionális sütiket használ (mint a Google Analytics), programmatikus hirdetés és adatértékesítés nélkül.

Ha hirdetési bannereket jelenít meg olyan hálózatokon keresztül, mint a Google AdSense vagy az Ad Manager, a helyzet más. Ebben az esetben az IAB TCF (Transparency and Consent Framework) hatálya alá tartozik, amely európai szabvány, és hitelesített CMP használatát írja elő a hozzájárulási jelek továbbításához a programmatikus hirdetési lánc teljes egészében. 2026 februárja óta a Google kifejezetten megköveteli ezt a hitelesítést az EEA-ban történő hirdetésközvetítés folytatásához. TCF v2.3 kompatibilis CMP nélkül egyszerűen kizárják a licitálásból.

Összefoglalva:

  • Bemutató oldal / blog / csak analitika → egy olyan megoldás, mint a whitecube/laravel-cookie-consent, elegendő, jogilag és technikailag is
  • Programmatikus hirdetésekkel vagy adatértékesítéssel rendelkező oldal → IAB TCF hitelesített CMP (Cookiebot, Didomi, Axeptio...) kötelező

Konklúzió

Ultra-összetett igények nélküli Laravel projektek esetén ez a csomag egy tiszta, könnyű és gazdaságos megoldás. Nincs szükség a CookieHub vagy más fizetős szolgáltatására, ha teljes kód-ellenőrzése van, egy dinamikusan generált irányelvek oldala, és egy egyszerű Google Analytics integráció.

Egy másik jelentős előny: nincs függőség harmadik fél CDN-től. A banner teljes egészében a saját alkalmazása szolgálja ki, ami közvetlenül gyorsabb betöltést és jobb Google PageSpeed Insights pontszámot eredményez. Egy olyan részlet, amit gyakran elfelejtenek, amikor egy CookieHub vagy Cookiebot szkriptet ragasztanak az oldal aljára.