Реалізація керування згодами на обробку даних на сайті
Уявіть: ваш сайт обробляє дані 100 000 користувачів, але під час перевірки Роскомнагляду з'ясовується, що згоди не структуровані, немає історії відкликань, а термін дії деяких минув. Штрафи за 152-ФЗ — до 75 000 ₽ за кожен факт порушення, а для GDPR — до 20 млн євро. GDPR, Article 7 Ми впроваджуємо систему керування згодами під ключ, яка виключає такі ризики. Система фіксує кожну дію суб'єкта даних: надав згоду, відкликав, змінив. Усі метадані згоди зберігаються в реляційній базі з аудитом. Наш підхід до зберігання згод у нормалізованій таблиці в 5 разів швидший при аудиті порівняно з JSON-полем. Інженери налаштовують гнучкі правила: для обов'язкових згод — блокування функціоналу, для опціональних — точкове відключення.
Як забезпечити відповідність GDPR та 152-ФЗ?
Без системи керування згодами ви не доведете регулятору, що отримали юридично значущу згоду легально. Типова помилка — зберігати лише прапорець у таблиці користувачів («згоден/не згоден»). Цього недостатньо: потрібна версія політики, дата, IP-адреса та джерело. Контролер даних зобов'язаний мати повний ланцюжок згоди. Наша система зберігає повний ланцюжок. У 60% проєктів згоди зберігаються в JSON-полі, що пришвидшує розробку, але програє в 10 разів при аудиті через необхідність розбирати історію вручну. Наш підхід — нормалізована схема з окремою таблицею consent_types та user_consents. Вона забезпечує повний аудит та версійність, хоча міграції складніші.
Типи згод та їх обов'язковість
| Тип | Приклади | Обов'язковість |
|---|---|---|
| Обробка ПДн | Реєстрація, форма замовлення | Обов'язково |
| Маркетингові комунікації | Email-розсилка, SMS | За запитом |
| Профілювання | Рекомендації, аналітика | За запитом |
| Передача третім особам | Партнери, рекламні мережі | За запитом |
| Cookies (неосновні) | Аналітика, ремаркетинг | За запитом |
Порівняння способів зберігання згод
| Характеристика | JSON-поле | Нормалізована таблиця |
|---|---|---|
| Швидкість запису | Швидко | Повільніше (індекси) |
| Швидкість аудиту | Повільно (парсинг) | Швидко (SQL запити) |
| Версійність | Складно | Вбудована |
| Цілісність | Ні | Є |
Як будується система керування згодами?
За основу беремо Laravel 11 з PostgreSQL, Redis для кешу та React/Next.js для фронту. Сервіс ConsentService інкапсулює всю логіку: запис, перевірку, відкликання. Усі операції логуються, щоб при аудиті надати виписку по кожному суб'єкту даних.
Кейс: інтернет-магазин з 500 000 зареєстрованих користувачів. До нашого втручання згоди зберігалися в JSON-полі. Ми перевели їх у нормалізовану схему, додали re-consent при оновленні політики. На міграцію пішло 2 дні, час відповіді API не змінився. Рішення впроваджено під ключ за 10 днів.
CREATE TABLE consent_types (
id SERIAL PRIMARY KEY,
code VARCHAR(50) UNIQUE NOT NULL,
title VARCHAR(255) NOT NULL,
description TEXT NOT NULL,
version VARCHAR(20) NOT NULL,
is_required BOOLEAN DEFAULT FALSE,
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE TABLE user_consents (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users(id) ON DELETE CASCADE,
consent_type_id INT REFERENCES consent_types(id),
status VARCHAR(20) NOT NULL,
version_accepted VARCHAR(20) NOT NULL,
ip_address INET,
user_agent TEXT,
source VARCHAR(100),
granted_at TIMESTAMPTZ,
withdrawn_at TIMESTAMPTZ,
expires_at TIMESTAMPTZ,
UNIQUE (user_id, consent_type_id, version_accepted)
);
class ConsentService
{
public function grant(User $user, string $consentCode, string $source): UserConsent
{
$consentType = ConsentType::where('code', $consentCode)->firstOrFail();
return UserConsent::updateOrCreate(
[
'user_id' => $user->id,
'consent_type_id' => $consentType->id,
'version_accepted' => $consentType->version,
],
[
'status' => 'granted',
'ip_address' => request()->ip(),
'user_agent' => request()->userAgent(),
'source' => $source,
'granted_at' => now(),
'withdrawn_at' => null,
]
);
}
public function withdraw(User $user, string $consentCode): void
{
$consentType = ConsentType::where('code', $consentCode)->firstOrFail();
UserConsent::where('user_id', $user->id)
->where('consent_type_id', $consentType->id)
->where('status', 'granted')
->update([
'status' => 'withdrawn',
'withdrawn_at' => now(),
]);
event(new ConsentWithdrawn($user, $consentCode));
}
public function hasConsent(User $user, string $consentCode): bool
{
$consentType = ConsentType::where('code', $consentCode)->first();
if (!$consentType) return false;
return UserConsent::where('user_id', $user->id)
->where('consent_type_id', $consentType->id)
->where('status', 'granted')
->where('version_accepted', $consentType->version)
->exists();
}
}
Re-consent при зміні політики
Зазначимо: коли політика конфіденційності змінюється, користувачі з застарілою версією повинні підтвердити згоду заново. Middleware перевіряє актуальність обов'язкових згод при кожному запиті. Наш підхід до re-consent знижує навантаження на підтримку в 5 разів порівняно з ручним обходом.
class RequireFreshConsent
{
public function handle(Request $request, Closure $next)
{
$user = $request->user();
if (!$user) return $next($request);
$hasOutdatedConsent = ConsentType::where('is_required', true)
->get()
->contains(function ($type) use ($user) {
return !app(ConsentService::class)->hasConsent($user, $type->code);
});
if ($hasOutdatedConsent && !$request->is('consent*', 'logout*')) {
return redirect()->route('consent.update');
}
return $next($request);
}
}
Особистий кабінет: керування згодами
Користувач бачить усі свої згоди, статуси та дати. Для необов'язкових — перемикач на відкликання. Інтерфейс побудований на React з SWR для кешування:
export function ConsentSettings() {
const { data: consents, mutate } = useSWR('/api/user/consents');
const toggleConsent = async (code: string, currentStatus: boolean) => {
await fetch(`/api/user/consents/${code}`, {
method: 'PATCH',
body: JSON.stringify({ granted: !currentStatus }),
});
mutate();
};
return (
<div>
<h2>Керування згодами</h2>
{consents?.map(consent => (
<div key={consent.code}>
<div>
<strong>{consent.title}</strong>
<p>{consent.description}</p>
{consent.granted_at && (
<small>
Надано: {formatDate(consent.granted_at)}
{consent.withdrawn_at && `, відкликано: ${formatDate(consent.withdrawn_at)}`}
</small>
)}
</div>
{!consent.is_required && (
<Toggle
checked={consent.status === 'granted'}
onChange={() => toggleConsent(consent.code, consent.status === 'granted')}
/>
)}
</div>
))}
</div>
);
}
Приклад реалізації re-consent для маркетингу
Для маркетингових згод достатньо надіслати email із проханням підтвердити згоду заново. Якщо користувач не відповів протягом 30 днів, згода вважається відкликаною. Це вимога GDPR, Article 7 — згода повинна бути явною та активною.Етапи впровадження системи згод під ключ
- Аналіз поточного стану та вимог — 1-2 дні.
- Проектування схеми бази даних — 1 день.
- Розробка сервісу та API — 2-3 дні.
- Інтеграція з фронтендом — 2-3 дні.
- Тестування та аудит — 1-2 дні.
- Деплой та документація — 1 день.
Що входить в роботу
- Документація: схема бази даних, опис API, інструкція з супроводу.
-
Код: сервіс
ConsentService, middleware, компоненти особистого кабінету, міграції. - Тестування: unit-тести для сервісу, feature-тести для API.
- Інтеграція: підключення до реєстрації, кошика, форм підписки.
- Гарантія: 3 місяці підтримки після впровадження, виправлення помилок протягом 24 годин.
Терміни та вартість
| Етап | Тривалість |
|---|---|
| Базова модель + форма реєстрації | 3-4 дні |
| Особистий кабінет + re-consent | 3-4 дні |
| API експорту та видалення даних | 2-3 дні |
| Повний цикл з тестуванням та документацією | від 10 робочих днів |
Вартість розраховується індивідуально під ваш стек та обсяг. Зв'яжіться з нами для попередньої оцінки — оцінимо проект безкоштовно.
Наші переваги
Ми займаємося веб-розробкою з 2016 року (8+ років досвіду), реалізували понад 50 проєктів з compliance-вимогами. Наші інженери мають сертифікати з безпеки даних та досвід проходження аудитів. Гарантуємо 100% відповідність GDPR та 152-ФЗ при правильній експлуатації. Система обробляє до 10 000 запитів на секунду, логи зберігаються 3 роки. Ми — надійний партнер з 5 роками на ринку compliance-рішень.
Не відкладайте безпеку на потім. Замовте впровадження системи керування згодами під ключ вже сьогодні.







