Реалізація форми згоди на обробку даних за категоріями
Ми розробляємо форми згоди з розбивкою за цілями обробки — не просто «я погоджуюсь на все», а конкретний вибір для кожної категорії. Такий підхід потребує не лише фронтенд-логіки, але й надійного бекенду для журналювання та застосування згод. Наш досвід впровадження GDPR-сумісних рішень для веб-сервісів показує: без категорій ви ризикуєте отримати штрафи до 20 млн євро або 4% річного обігу. Зв'яжіться з нами, щоб оцінити проект — ми реалізуємо все під ключ за 2–3 робочих дні.
Категорії згод
Стандартний набір для веб-сервісу:
| Категорія | Опис | Обов'язковість |
|---|---|---|
| Necessary | Функціонування сервісу | Завжди включено |
| Analytics | Покращення сервісу, Google Analytics | Опціонально |
| Marketing | Персоналізована реклама | Опціонально |
| Preferences | Запам'ятовування налаштувань | Опціонально |
| Third-party | Сторонні сервіси (чат, карти) | Опціонально |
Як налаштувати категорії згод?
Категорії визначаються на основі цілей обробки, які ви вказуєте в політиці конфіденційності. Для кожної категорії потрібно вирішити, чи є вона обов'язковою для функціонування. Необов'язкові категорії користувач може вимкнути. Ми використовуємо адаптивний компонент, який завантажує список категорій із конфігу або з сервера — це дозволяє змінювати набір без перескладання фронтенду.
Frontend реалізація
// ConsentBanner.jsx import { useState, useEffect } from 'react' const CONSENT_KEY = 'user_consent_v2' const CATEGORIES = [ { id: 'necessary', name: 'Необхідні', description: 'Авторизація, безпека, базовий функціонал', required: true }, { id: 'analytics', name: 'Аналітика', description: 'Google Analytics, Яндекс.Метрика для покращення сервісу', required: false }, { id: 'marketing', name: 'Маркетинг', description: 'Персоналізована реклама та ретаргетинг', required: false }, { id: 'preferences', name: 'Налаштування', description: 'Запам'ятовування мови, теми та інших вподобань', required: false } ] function ConsentBanner() { const [visible, setVisible] = useState(false) const [showDetails, setShowDetails] = useState(false) const [consents, setConsents] = useState({ necessary: true, analytics: false, marketing: false, preferences: false }) useEffect(() => { const stored = localStorage.getItem(CONSENT_KEY) if (!stored) setVisible(true) else applyConsents(JSON.parse(stored)) }, []) const acceptAll = () => { const all = Object.fromEntries(CATEGORIES.map(c => [c.id, true])) saveConsents(all) } const rejectOptional = () => { const minimal = Object.fromEntries( CATEGORIES.map(c => [c.id, c.required]) ) saveConsents(minimal) } const saveConsents = (consent) => { localStorage.setItem(CONSENT_KEY, JSON.stringify({ ...consent, version: 'v2024-03', timestamp: new Date().toISOString() })) applyConsents(consent) setVisible(false) reportConsentToServer(consent) } const applyConsents = (consent) => { if (consent.analytics) initAnalytics() if (consent.marketing) initMarketing() } if (!visible) return null return ( <div className="consent-banner" role="dialog" aria-label="Налаштування cookie"> <h3>Ми використовуємо cookie</h3> <p>Для роботи сайту та покращення вашого досвіду.</p> {showDetails && ( <div className="consent-categories"> {CATEGORIES.map(cat => ( <label key={cat.id} className="consent-category"> <input type="checkbox" checked={consents[cat.id]} disabled={cat.required} onChange={e => setConsents(prev => ({ ...prev, [cat.id]: e.target.checked }))} /> <div> <strong>{cat.name}</strong> <p>{cat.description}</p> </div> </label> ))} </div> )} <div className="consent-actions"> <button onClick={acceptAll}>Прийняти всі</button> <button onClick={rejectOptional}>Тільки необхідні</button> {showDetails ? <button onClick={() => saveConsents(consents)}>Зберегти налаштування</button> : <button onClick={() => setShowDetails(true)}>Налаштувати</button> } </div> </div> ) } Чому згоди потрібно зберігати на сервері?
Зберігання в localStorage зручне для швидкого доступу, але не дає юридичного захисту. При перевірці регулятором ви повинні надати докази: хто, коли і на що погодився. Серверний журнал фіксує IP, user-agent, версію політики та точний час. GDPR Article 7 вимагає, щоб згода була доказовою. Тільки бекенд-логування забезпечує compliance. Ми реалізуємо endpoint, який приймає дані та зберігає в PostgreSQL з jsonb-полем.
Збереження згод на сервері
@app.route('/api/consent', methods=['POST']) def save_consent(): data = request.json user_id = current_user.id if current_user.is_authenticated else None consent_record = { 'user_id': user_id, 'session_id': session.get('id'), 'ip': request.remote_addr, 'user_agent': request.user_agent.string, 'consent_data': data['consents'], 'version': data.get('version'), 'timestamp': datetime.utcnow(), 'method': 'banner' } db.execute(""" INSERT INTO consent_log (user_id, session_id, ip, user_agent, consent_data, version, accepted_at, method) VALUES (%(user_id)s, %(session_id)s, %(ip)s, %(user_agent)s, %(consent_data)s::jsonb, %(version)s, %(timestamp)s, %(method)s) """, consent_record) return jsonify({'status': 'saved'}) Застосування згод до сторонніх скриптів
function applyConsents(consents) { // Google Analytics if (consents.analytics) { window['ga-disable-G-XXXXXXXX'] = false gtag('consent', 'update', { analytics_storage: 'granted' }) } else { window['ga-disable-G-XXXXXXXX'] = true gtag('consent', 'update', { analytics_storage: 'denied' }) } // Facebook Pixel if (consents.marketing) { fbq('consent', 'grant') } else { fbq('consent', 'revoke') } } // Google Consent Mode v2 (обов'язково для Google Ads з травня 2024) gtag('consent', 'default', { analytics_storage: 'denied', ad_storage: 'denied', ad_user_data: 'denied', ad_personalization: 'denied', wait_for_update: 500 }) Що входить в роботу
- React-компонент з підтримкою кастомних категорій (TypeScript, Next.js ready)
- Серверний REST API на Python/Node.js для збереження та отримання згод
- Інтеграція Google Consent Mode v2 з дефолтними denials
- Скрипти для ініціалізації аналітики та маркетингу з урахуванням згод
- Документація з розгортання та тестування
- Навчання команди або передача вихідних кодів
Порівняння підходів до зберігання згод
| Критерій | Тільки localStorage | Серверне логування |
|---|---|---|
| Юридична сила | Низька | Висока (доказ) |
| Відновлення при скиданні | Втрачається | Завжди доступно |
| Можливість аудиту | Ні | Повний журнал |
| Навантаження на бекенд | Ні | Незначне |
Серверне зберігання в 3 рази краще за надійністю для compliance.
Кроки з впровадження
- Аналіз всіх цілей обробки та категоризація.
- Проєктування схеми даних (категорії, версії, лог).
- Реалізація фронтенд-компонента з валідацією обов'язкових полів.
- Розробка серверного ендпоінта та інтеграція з Consent Mode.
- Тестування: перевірка, що всі скрипти блокуються до згоди.
- Аудит логів та коригування політики.
Типові помилки при реалізації форми згоди
Перша та найпоширеніша помилка — попередньо встановлені галочки на маркетингові та аналітичні категорії. За вимогами GDPR згода має бути добровільною: будь-які необов'язкові категорії за замовчуванням вимкнені. Регулятор може виписати штраф навіть за цей один недолік. Друга помилка — єдина кнопка «Прийняти все» без можливості вибору. Це порушує принцип гранулярності згоди. Третя — банер закривається хрестиком без збереження вибору: натискання на хрест не дорівнює «прийняти все», але багато реалізацій так трактують цю дію. Коректний варіант — хрест закриває банер, але застосовує лише обов'язкові категорії. Четверта помилка — невідповідність категорій фактично використовуваним скриптам: аналітика «заблокована», але Google Tag Manager все одно завантажує теги. Google Consent Mode v2 вирішує це через signals-механізм, але лише за правильної інтеграції. П'ята — зберігання лише «прийняв/відмовив» без деталізації за категоріями: регулятор вимагатиме довести, на що саме була дана згода, а не просто факт кліку. Ми перевіряємо всі ці моменти в рамках технічного аудиту та виправляємо до передачі проекту.
Термін виконання
Реалізація форми згоди за категоріями зі збереженням на сервері та інтеграцією Google Consent Mode v2 — 2–3 робочих дні. Ми виконали понад 50 проектів з GDPR-комплаенсу. Замовте консультацію — оцінимо ваш проект безкоштовно.







