Реализация формы согласия на обработку персональных данных по категориям
Мы разрабатываем формы согласия с разбивкой по целям обработки — не просто «я согласен на всё», а конкретный выбор для каждой категории. Такой подход требует не только фронтенд-логики, но и надёжного бэкенда для журналирования и применения согласий. Наш опыт внедрения 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-комплаенсу, работаем с 2016 года. Закажите консультацию — оценим ваш проект бесплатно.







