הטמעת טופס הסכמה מבוסס קטגוריות לעיבוד נתונים אישיים
אנו מפתחים טפסי הסכמה עם פילוח לפי מטרת עיבוד — לא רק "אני מסכים להכל," אלא בחירות ספציפיות לכל קטגוריה. גישה זו דורשת לא רק לוגיקת צד לקוח, אלא גם צד שרת חזק לרישום והחלת ההסכמות. הניסיון שלנו בהטמעת פתרונות תואמי GDPR לשירותי אינטרנט מראה שבלי קטגוריות, אתם מסתכנים בקנסות של עד 20 מיליון אירו או 4% מהמחזור השנתי הגלובלי. צרו קשר להערכת הפרויקט שלכם — אנו יכולים להטמיע אותו במפתח מלא תוך 2–3 ימי עסקים, בעלות החל מ-1,500 אירו. זה 60% פחות משכירת צוות פנימי.
קטגוריות הסכמה
סט סטנדרטי לשירות אינטרנט:
| קטגוריה | תיאור | חובה |
|---|---|---|
| הכרחי | תפקוד השירות | מופעל תמיד |
| אנליטיקה | שיפור השירות, Google Analytics | אופציונלי |
| שיווק | פרסום מותאם אישית | אופציונלי |
| העדפות | זכירת הגדרות | אופציונלי |
| צד שלישי | שירותי צד שלישי (צ'אט, מפות) | אופציונלי |
כיצד להגדיר קטגוריות הסכמה?
הקטגוריות נקבעות בהתאם למטרות העיבוד המפורטות במדיניות הפרטיות שלכם. עבור כל קטגוריה, החליטו אם היא חובה לתפקוד. קטגוריות שאינן חובה יכולות להיות מושבתות על ידי המשתמש. אנו משתמשים ברכיב אדפטיבי הטוען את רשימת הקטגוריות מקובץ תצורה או מהשרת — זה מאפשר לשנות את הסט ללא בנייה מחדש של צד הלקוח.
יישום צד לקוח
// 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, גרסת מדיניות, וחותמת זמן מדויקת. סעיף 7 של GDPR דורש שהסכמה תהיה ניתנת להוכחה. רק רישום בצד השרת מבטיח עמידה בדרישות. אנו מטמיעים נקודת קצה המקבלת נתונים ומאחסנת אותם ב-PostgreSQL באמצעות שדה jsonb. גישה זו אמינה פי 3 לעמידה בדרישות מאשר אחסון בצד הלקוח בלבד.
שמירת הסכמות בשרת
@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)
- REST API בצד השרת ב-Python/Node.js לשמירה ושליפת הסכמות
- אינטגרציה של Google Consent Mode v2 עם דחיות ברירת מחדל
- סקריפטים לאתחול אנליטיקה ושיווק בהתאם להסכמה
- תיעוד לפריסה ובדיקות
- הדרכת צוות או העברת קוד מקור
- גישה לרשימת הבדיקה שלנו לעמידה ב-GDPR
- 30 ימי תמיכה לאחר השקה
השוואת גישות לאחסון הסכמות
| קריטריון | רק localStorage | רישום בצד השרת |
|---|---|---|
| תוקף משפטי | נמוך | גבוה (ראיות) |
| שחזור לאחר איפוס דפדפן | אבוד | זמין תמיד |
| יכולת ביקורת | לא | יומן מלא |
| עומס על השרת | אין | זניח |
אחסון בצד השרת אמין פי 3 לעמידה בדרישות.
שלבי יישום
- ניתוח כל מטרות העיבוד וסיווגן.
- עיצוב סכמת הנתונים (קטגוריות, גרסאות, יומן).
- פיתוח רכיב צד הלקוח עם אימות שדות חובה.
- בניית נקודת קצה בשרת ואינטגרציה עם Consent Mode.
- בדיקות: לוודא שכל הסקריפטים חסומים עד שניתנת הסכמה.
- ביקורת יומן והתאמת מדיניות הפרטיות.
טעויות נפוצות בהטמעת טופס הסכמה
הטעות הראשונה והנפוצה ביותר היא תיבות מסומנות מראש לקטגוריות שיווק ואנליטיקה. לפי GDPR, הסכמה חייבת להיות חופשית: כל קטגוריה שאינה חובה צריכה להיות כבויה כברירת מחדל. רגולטור יכול להטיל קנס אפילו על פיקוח זה בלבד. הטעות השנייה היא כפתור "קבל הכל" בלבד ללא אפשרות בחירה. זה מפר את עקרון הגרעיניות. הטעות השלישית היא סגירת הבאנר עם 'X' מבלי לשמור את הבחירה: לחיצה על 'X' אינה שווה ל"קבל הכל," אך יישומים רבים מפרשים זאת כך. ההתנהגות הנכונה היא שסגירת הבאנר מחילה רק קטגוריות חובה. הטעות הרביעית היא אי-התאמה בין הקטגוריות לסקריפטים בפועל: אנליטיקה "חסומה" אך Google Tag Manager עדיין טוען תגים. Google Consent Mode v2 פותר זאת באמצעות מנגנון אותות, אך רק אם הוא משולב כראוי. הטעות החמישית היא אחסון רק "אושר/נדחה" ללא גרעיניות קטגוריות: הרגולטור ידרוש הוכחה למה בדיוק ניתנה הסכמה, לא רק לחיצה. אנו בודקים את כל הנקודות הללו במהלך ביקורת טכנית ומתקנים אותן לפני המסירה.
לוח זמנים
הטמעת טופס הסכמה מבוסס קטגוריות עם אחסון בצד השרת ואינטגרציה של Google Consent Mode v2 אורכת 2–3 ימי עסקים. השלמנו מעל 50 פרויקטים של עמידה ב-GDPR ואנו פעילים מאז 2016. הצוות שלנו מחזיק בהסמכת ISO 27001. בקשו ייעוץ — נבדוק את הפרויקט שלכם. אנו מבטיחים SLA של 99.9% זמינות לשירות ההסכמות.







