Реалізація механізму відозву згоди на обробку даних
За GDPR (стаття 7.3) користувач повинен мати можливість відозвати згоду так само легко, як дати її. Якщо згода давалась одним нажатям кнопки, відозв не повинен вимагати 10 кроків.
Точки відозву згоди
- Налаштування акаунту (розділ "Приватність" / "Мої дані")
- Footer-посилання "Управління cookies"
- Email з unsubscribe-посиланням
- Кнопка повторного відкриття cookie-баннера
Реалізація управління в кабінеті
// PrivacySettings.jsx
function PrivacySettings() {
const [consent, setConsent] = useState(null)
const [loading, setLoading] = useState(true)
useEffect(() => {
fetch('/api/my/consent')
.then(r => r.json())
.then(data => { setConsent(data.current); setLoading(false) })
}, [])
const updateConsent = async (category, value) => {
const updated = { ...consent, [category]: value }
await fetch('/api/my/consent', {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ categories: updated })
})
setConsent(updated)
// Застосувати негайно
if (!value && category === 'analytics') {
window['ga-disable-G-XXXXXXXX'] = true
}
}
const revokeAll = async () => {
if (!confirm('Ви впевнені? Це не видалює ваш акаунт, тільки згоду на додаткову обробку.')) return
await fetch('/api/my/consent', { method: 'DELETE' })
setConsent({ necessary: true, analytics: false, marketing: false })
}
if (loading) return <Spinner />
return (
<div className="privacy-settings">
<h2>Управління даними</h2>
{Object.entries({
analytics: 'Аналітика та покращення сервісу',
marketing: 'Персоналізована реклама',
preferences: 'Запам'ятовування переваг'
}).map(([key, label]) => (
<label key={key} className="consent-toggle">
<span>{label}</span>
<input
type="checkbox"
checked={consent?.[key] ?? false}
onChange={e => updateConsent(key, e.target.checked)}
/>
</label>
))}
<button className="btn-danger" onClick={revokeAll}>
Відозвати всі згоди
</button>
<a href="#" onClick={() => window.CookieBot?.renew()}>
Змінити налаштування cookies
</a>
</div>
)
}
Серверна обробка відозву
@app.route('/api/my/consent', methods=['PUT'])
@login_required
def update_consent():
new_categories = request.json['categories']
# Записати в лог
consent_logger.log(
request,
categories=new_categories,
event_type='updated',
user_id=current_user.id
)
# Застосувати зміни негайно
if not new_categories.get('marketing'):
unsubscribe_from_marketing(current_user.id)
remove_from_ad_audiences(current_user.email)
return jsonify({'status': 'updated', 'categories': new_categories})
def unsubscribe_from_marketing(user_id: int):
user = db.get_user(user_id)
# Mailchimp
mailchimp_client.lists.update_list_member_tags(
list_id=MAILCHIMP_LIST_ID,
subscriber_hash=md5(user.email.lower()),
body={'tags': [{'name': 'marketing_opted_out', 'status': 'active'}]}
)
# Відключити рекламні пікселі для цього користувача
db.execute("""
UPDATE users SET marketing_opted_out = true,
marketing_opt_out_at = NOW()
WHERE id = %s
""", (user_id,))
Cookie-баннер: повторне відкриття
// Footer-посилання: "Управління cookies"
document.getElementById('cookie-settings-link').addEventListener('click', (e) => {
e.preventDefault()
// Cookiebot
if (window.CookieBot) {
window.CookieBot.renew()
return
}
// CookieYes
if (window.revisitCkyConsent) {
window.revisitCkyConsent()
return
}
// Кастомний баннер
ConsentBanner.show()
})







