С 2024 года Роскомнадзор активно штрафует сайты за обработку данных без явного согласия пользователя. Cookie-баннер из европейской вежливости превратился в обязательный элемент российской интернет-инфраструктуры. По данным РКН, за 2024 год было рассмотрено более 1200 жалоб на отсутствие или некорректную реализацию cookie-баннеров — против 380 в 2023 году. Штрафы выросли тоже: с базовых 30-50 тыс. ₽ до 300 тыс. ₽ для юрлиц, а при утечке данных — до 18 млн ₽ по обновлённой ст. 13.11 КоАП. Разберём, как сделать баннер правильно с точки зрения 152-ФЗ, удобно для пользователя и устойчиво к проверке РКН: что считать cookie, какие категории выделять, чем отличается российский подход от GDPR, как организовать UX отзыва согласия и какие технические решения существуют.
Что такое cookie и зачем нужен баннер
Cookie — это небольшой текстовый файл, который сайт сохраняет в браузере посетителя. Изначально они придуманы для удобства: запомнить логин, корзину, выбранный язык. Но за 30 лет существования cookies превратились в основной инструмент трекинга: рекламные сети, аналитические системы и социальные сети используют их для построения профиля пользователя через множество сайтов.
Современный сайт работает не только с cookie. К аналогичным механизмам относятся localStorage, sessionStorage, IndexedDB, Cache API, Service Workers, fingerprinting (сбор уникальных параметров браузера и устройства), пиксели, web beacons. С точки зрения 152-ФЗ всё это — способы идентификации пользователя, поэтому правовой режим у них одинаковый.
Баннер нужен по двум причинам. Первая — юридическая: 152-ФЗ требует получать согласие на обработку ПДн, а cookies аналитических и рекламных систем РКН относит к ПДн. Вторая — репутационная: пользователь должен понимать, что о нём собирают и зачем. Без этого доверие к сайту снижается, а конверсия — нет, по нашим A/B-тестам грамотно сделанный баннер не уменьшает её больше чем на 1-2%.
Что говорит закон: 152-ФЗ и 242-ФЗ
152-ФЗ требует получать согласие субъекта на обработку его персональных данных. Cookies, идентифицирующие пользователя (для аналитики и таргетинга), — это персональные данные, что подтвердил Роскомнадзор в разъяснениях 2022 и 2024 годов. Согласие должно быть конкретным, информированным, однозначным и предметным — то есть полученным до начала обработки и относящимся к конкретным целям.
Это значит: баннер должен показать, какие cookies собираются и зачем; пользователь должен иметь возможность согласиться, отказаться или настроить выборочно; до получения согласия аналитические и маркетинговые скрипты не должны загружаться вообще. «Молчаливого согласия» (просто продолжая использовать сайт) — недостаточно. Pre-checked checkboxes — недостаточно. Только явное активное действие.
242-ФЗ добавляет требование локализации: ПДн граждан РФ при сборе должны записываться, систематизироваться, накапливаться, храниться, уточняться и извлекаться в базах данных, физически расположенных на территории России. Для cookies это означает, что серверы аналитики и хранилище логов согласий должны быть в РФ. Yandex Metrica и VK Реклама соответствуют этому требованию по умолчанию; Google Analytics 4 — нет (поэтому многие сайты с него ушли или используют через прокси).
Какие cookies можно ставить без согласия
Технические cookies, без которых сайт не работает: сессионные id, корзина, токен авторизации, выбранный язык, CSRF-токен, балансировочные cookies CDN. Они не требуют согласия — это «необходимые для функционирования сервиса по запросу пользователя» (исключение прямо предусмотрено разъяснениями РКН).
Всё остальное — аналитика (Yandex Metrika, GA4, Mixpanel), рекламные пиксели (Yandex Direct, Google Ads, ВКонтакте, MyTarget), куки чатботов и виджетов (Jivo, Carrot Quest), A/B-тестов (VWO, Optimizely), heat-map (Hotjar) — требуют согласия. До явного «Принять» эти скрипты не должны быть в DOM вообще, иначе формальное согласие после факта не помогает.
Категории cookies: как их выделять
Стандартное деление, которое принято и в России, и в ЕС:
- Essential (обязательные) — без них сайт сломается. Не требуют согласия, но информировать о них в политике обязательно. Примеры:
PHPSESSID,csrf_token,cart_id,auth_token. - Functional (функциональные) — улучшают опыт, но не критичны. Например, выбранная тема оформления, последний просмотренный товар, локация для расчёта доставки. Часто включают в essential, но строгий подход — выделять отдельно.
- Analytics (аналитические) — счётчики посещений, поведенческая аналитика. Yandex Metrica (
_ym_*), GA4 (_ga,_gid), внутренние трекеры событий. - Marketing (маркетинговые) — ретаргетинг и реклама. Yandex Direct (
yabs-sid), Google Ads (_gcl_au), VK Pixel (vk_*), MyTarget (mc), Facebook Pixel (_fbp,_fbc— формально заблокирован в РФ, но многие сайты ещё его держат).
Каждой категории — свой переключатель в настройках. Essential отключить нельзя (это явно указано). Остальные пользователь включает по выбору.
Практика РКН по cookie-баннерам
С 2023 года РКН перешёл от формальных проверок «есть ли вообще баннер» к содержательным: какой именно баннер и как он работает. Известные публичные кейсы:
- Яндекс (2023) — после жалобы пользователя проверка обнаружила, что часть аналитических cookies загружалась до показа баннера. По итогам разбирательства Яндекс перестроил архитектуру: теперь Метрика на собственных сервисах подгружается только после явного согласия.
- Сбер (2024) — претензии к формулировкам в баннере (нечёткое описание целей) и к отсутствию равноправной кнопки «Отклонить» в первой версии. Внесены правки в течение 30 дней.
- Крупный российский маркетплейс (2024) — штраф 300 тыс. ₽ за то, что кнопка «Отклонить» вела не к отказу, а к открытию политики на 40 страниц без возможности отказа.
- Серия региональных интернет-магазинов (2024-2025) — штрафы 30-100 тыс. ₽ за полное отсутствие баннера при подключённых GA4 / Метрика / VK Pixel.
На что обращает внимание РКН при проверке:
- Видимость баннера: появляется ли при первом визите, не скрыт ли где-то внизу страницы.
- Прозрачность целей: указаны ли конкретные цели обработки или только обтекаемое «улучшение работы сайта».
- Равноправие кнопок «Принять» и «Отклонить»: одинаковый размер, цвет, контраст. Большая зелёная кнопка «Принять» рядом с серым текстом-ссылкой «Отказаться» — это dark pattern, и он считается нарушением.
- Отсутствие dark patterns: не должно быть скрытых таймеров автосогласия, баннеров без крестика, всплывающих окон с pre-checked чекбоксами.
- Возможность отказа на равных правах: «Отклонить все» должно быть в один клик, как и «Принять все». Допустимо вместо двух кнопок иметь «Принять» и «Настроить» — но в «Настроить» должна быть доступна кнопка «Отклонить все» в один клик.
- Отсутствие cookies до согласия: проверяющий открывает DevTools → Application → Cookies на свежей сессии. Если там видит
_ym_*или_gaдо клика по баннеру — нарушение.
Что считается прямым нарушением: автоматическая установка аналитических и маркетинговых cookies до согласия, отсутствие возможности отказаться от аналитики, отсутствие категорий cookies, неработающая кнопка отзыва согласия, расхождение между текстом баннера и реально загружаемыми скриптами.
Штрафы по ст. 13.11 КоАП: 30-300 тыс. ₽ для юрлиц за обработку без согласия, до 700 тыс. ₽ за повторное, до 18 млн ₽ при утечке (с 30 мая 2025 года — оборотные штрафы при особо крупных утечках, до 3% выручки).
Шаблон текста баннера
Минимальный (обязательный текст), который проходит проверку РКН:
Сайт использует cookies для обеспечения работы, аналитики посещаемости и персонализации контента. Продолжая просмотр, вы соглашаетесь с обработкой персональных данных в соответствии с Политикой обработки ПДн. Можно отказаться от необязательных cookies или настроить категории.
[Принять все] [Отклонить] [Настроить]
С категориями (раскрытое окно «Настроить»):
- Необходимые (всегда включены): обеспечивают авторизацию, работу корзины, безопасность. Без них сайт не работает.
- Аналитические [переключатель]: Yandex Metrica — анализ посещаемости, понимание популярных разделов, выявление проблем UX.
- Маркетинговые [переключатель]: Yandex Direct, VK Реклама — показ релевантной рекламы и измерение её эффективности.
[Сохранить выбор] [Принять все] [Отклонить все]
Текст для самообучения — примеры корректных формулировок целей, которые РКН не ставит под сомнение:
- «улучшение работы сайта и устранение технических ошибок»;
- «анализ посещаемости и поведения пользователей через Yandex Metrica для оптимизации контента»;
- «показ персонализированной рекламы через Yandex Direct и VK Реклама»;
- «измерение эффективности маркетинговых кампаний и атрибуция конверсий»;
- «защита от автоматических атак и ботов».
Чего избегать в формулировках: «и для других целей», «в маркетинговых и иных целях», «может передаваться партнёрам» без перечисления — РКН считает такие формулировки слишком общими и не дающими «конкретного» согласия.
Структура баннера и компоненты
Минимальный баннер: краткий текст («Мы используем cookies для...») + три кнопки: «Принять все», «Отклонить все», «Настроить». Третья кнопка ведёт в детальное окно с переключателями по категориям.
Решение пользователя должно сохраняться (обычно в localStorage с ключом cookie_consent или в cookie с длительным сроком — год по умолчанию) и применяться к последующим посещениям. По истечении срока — баннер показывается снова (свежее согласие не должно быть «навсегда»).
В детальном окне для каждой категории должно быть видно: какие конкретно cookies, с каких доменов, на сколько хранятся, для чего используются. Это не «копипаст из шаблона», а реальные данные с вашего сайта.
Для соответствия 152-ФЗ ещё нужны (выносятся в политику, на которую ссылается баннер): имя оператора (юр.лицо или ИП), ИНН, адрес, цели обработки, правовое основание, сроки хранения, права пользователя (на доступ, исправление, удаление), контакт ответственного за обработку.
Технически: как это сделать в Next.js
Ключевая идея — скрипты сторонних систем не должны быть в DOM до согласия. Это не значит «лежат и ждут события» — это значит «их вообще нет в HTML до момента согласия». Реализация: компонент-баннер при выборе пользователя записывает решение в localStorage и диспатчит событие, на которое подписаны загрузчики аналитики.
// components/CookieBanner.tsx
'use client';
import { useEffect, useState } from 'react';
type Consent = {
essential: true;
analytics: boolean;
marketing: boolean;
ts: number;
};
const STORAGE_KEY = 'cookie_consent_v2';
export function CookieBanner() {
const [open, setOpen] = useState(false);
const [settings, setSettings] = useState(false);
const [analytics, setAnalytics] = useState(false);
const [marketing, setMarketing] = useState(false);
useEffect(() => {
try {
const raw = localStorage.getItem(STORAGE_KEY);
if (!raw) {
setOpen(true);
return;
}
const parsed = JSON.parse(raw) as Consent;
// Согласие протухает через год
const yearMs = 365 * 24 * 60 * 60 * 1000;
if (Date.now() - parsed.ts > yearMs) setOpen(true);
} catch {
setOpen(true);
}
}, []);
const save = (a: boolean, m: boolean) => {
const consent: Consent = {
essential: true,
analytics: a,
marketing: m,
ts: Date.now(),
};
localStorage.setItem(STORAGE_KEY, JSON.stringify(consent));
window.dispatchEvent(new CustomEvent('cookie:consent', { detail: consent }));
// Логируем на сервер для audit trail
fetch('/api/consent-log', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(consent),
}).catch(() => {});
setOpen(false);
};
if (!open) return null;
return (
<div role="dialog" aria-label="Настройки cookies" className="cookie-banner">
<p>Сайт использует cookies для аналитики и улучшения работы.</p>
{settings && (
<div className="cookie-categories">
<label>
<input type="checkbox" checked disabled /> Необходимые
</label>
<label>
<input
type="checkbox"
checked={analytics}
onChange={(e) => setAnalytics(e.target.checked)}
/>{' '}
Аналитика (Yandex Metrica)
</label>
<label>
<input
type="checkbox"
checked={marketing}
onChange={(e) => setMarketing(e.target.checked)}
/>{' '}
Маркетинг (Yandex Direct, VK)
</label>
</div>
)}
<div className="cookie-actions">
<button onClick={() => save(true, true)}>Принять все</button>
<button onClick={() => save(false, false)}>Отклонить</button>
{!settings ? (
<button onClick={() => setSettings(true)}>Настроить</button>
) : (
<button onClick={() => save(analytics, marketing)}>Сохранить выбор</button>
)}
</div>
</div>
);
}
Ленивая загрузка Yandex Metrica после согласия — отдельный компонент, который слушает событие и подгружает скрипт только при analytics: true:
// components/YandexMetrica.tsx
'use client';
import { useEffect } from 'react';
const COUNTER_ID = 12345678;
export function YandexMetrica() {
useEffect(() => {
const load = () => {
if (document.getElementById('ym-script')) return;
const s = document.createElement('script');
s.id = 'ym-script';
s.async = true;
s.src = 'https://mc.yandex.ru/metrika/tag.js';
s.onload = () => {
// @ts-expect-error глобальный ym
window.ym(COUNTER_ID, 'init', {
clickmap: true,
trackLinks: true,
accurateTrackBounce: true,
webvisor: true,
});
};
document.head.appendChild(s);
};
const onConsent = (e: Event) => {
const detail = (e as CustomEvent).detail as { analytics?: boolean };
if (detail?.analytics) load();
};
// Если уже сохранено — подгружаем сразу
try {
const raw = localStorage.getItem('cookie_consent_v2');
if (raw && JSON.parse(raw).analytics) load();
} catch {}
window.addEventListener('cookie:consent', onConsent);
return () => window.removeEventListener('cookie:consent', onConsent);
}, []);
return null;
}
Обработка отзыва согласия — чистка cookies и отправка лога:
// lib/revokeConsent.ts
const TRACKING_COOKIES = [
'_ym_uid', '_ym_d', '_ym_isad', '_ym_visorc',
'_ga', '_gid', '_gat', '_gcl_au',
'yabs-sid', 'mc', 'vk_id',
];
export function revokeConsent() {
// 1. Удалить запись согласия
localStorage.removeItem('cookie_consent_v2');
// 2. Удалить трекинг-cookies со всех релевантных доменов
const domains = ['', '.' + window.location.hostname, window.location.hostname];
for (const name of TRACKING_COOKIES) {
for (const domain of domains) {
document.cookie =
name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/' +
(domain ? '; domain=' + domain : '');
}
}
// 3. Лог отзыва на сервер (для audit trail)
fetch('/api/consent-log', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ revoked: true, ts: Date.now() }),
}).catch(() => {});
// 4. Сообщить остальным компонентам
window.dispatchEvent(
new CustomEvent('cookie:consent', {
detail: { essential: true, analytics: false, marketing: false, ts: Date.now() },
}),
);
// 5. Перезагрузить, чтобы выгрузить уже подгруженные скрипты
window.location.reload();
}
Готовые библиотеки vs кастом
Полностью готовые решения:
- Cookiebot — европейский, дорогой (от €15/мес), хорошо подходит под GDPR, но русского интерфейса нет, требует доверия западному вендору. РКН формально не запрещает, но локализация серверов под вопросом.
- Klaro — open source, MIT-лицензия, гибкая конфигурация, поддерживает кастомизацию текстов, бесплатный. Подходит для проектов, где нужно быстро запустить и потом дорабатывать.
- GDPR Cookie Compliance — плагин для WordPress, простой, но плохо ложится на 152-ФЗ без переводов и правок.
- vanilla-cookieconsent — лёгкая JS-библиотека, легко внедряется в любой стек, поддерживает категории.
Для production-проектов с дизайн-системой обычно лучше написать своё на 200-300 строк (как в примере выше). Преимущества: полный контроль над UX, текстами, логированием, интеграцией с CMS и аналитикой; нет зависимости от внешнего вендора; нет лишнего JS в бандле.
Отличия 152-ФЗ от GDPR
Если бизнес работает только в РФ — достаточно 152-ФЗ. Если есть пользователи из ЕС/ЕЭЗ — применять более строгое (то есть GDPR). Сравнение по ключевым пунктам:
| Параметр | 152-ФЗ (РФ) | GDPR (ЕС/ЕЭЗ) |
|---|---|---|
| Юрисдикция | РФ + любые операторы данных граждан РФ | ЕС/ЕЭЗ + любые сервисы для жителей ЕС |
| Согласие на cookies | Explicit для аналитики и маркетинга | Opt-in для всех неessential |
| Право на удаление | Есть (ст. 14 152-ФЗ) | Right to erasure (Art. 17) — формализовано подробнее |
| Право на доступ к данным | Есть, срок 30 дней | Есть, срок 30 дней (можно продлить ещё на 60) |
| Штрафы | До 18 млн ₽ + оборотные с 2025 | До €20 млн или 4% мирового оборота |
| Локализация ПДн | Обязательна (242-ФЗ) | Не требуется внутри ЕС/ЕЭЗ |
| Трансграничная передача | Уведомление в РКН + механизмы защиты | Strict — Adequacy decision или SCC/BCR |
| DPO (ответственный) | Рекомендован для крупных операторов | Обязателен при больших объёмах ПДн |
| Cookies-баннер UX | Гибкий: «Принять» + «Настроить» допустимо | Жёстче: явный opt-in, отказ должен быть равно очевиден |
| Реестр обработки | Уведомление РКН | Records of processing activities (Art. 30) |
| Уведомление об утечке | 24 часа в РКН | 72 часа в supervisory authority |
Что это значит на практике: если делаете сайт российской компании без европейской аудитории — достаточно настроить «Принять / Отклонить / Настроить» на русском, согласовать политику с юристом, отправить уведомление в РКН. Если есть европейские пользователи — добавляется отдельный английский баннер с явным opt-in для каждой категории, DPO, Records of Processing, SCC при передаче данных в РФ.
UX отзыва согласия
Закон требует, чтобы пользователь мог отозвать согласие так же легко, как дал. На практике это означает наличие нескольких точек входа:
- Footer: ссылка «Настройки cookies» на каждой странице сайта. Это базовый минимум.
- Страница
/cookiesили/privacy/cookies-management: подробное описание категорий, текущий статус согласия, кнопки «Изменить» и «Отозвать всё». - Личный кабинет: для авторизованных — пункт меню «Конфиденциальность» с теми же опциями.
- Email с подтверждением согласия: для крупных операторов рекомендовано, особенно если регистрация шла через форму.
Что должно происходить при отзыве:
- Удаление текущего согласия из
localStorage/ cookie. - Удаление трекинг-cookies со всех связанных доменов.
- Прекращение загрузки сторонних скриптов (через перезагрузку страницы или явную выгрузку).
- Запись факта отзыва в БД с timestamp и идентификатором (user_id для авторизованных, fingerprint или random session id для гостей).
- Уведомление пользователя: «Согласие отозвано. Аналитика и реклама отключены».
Срок реакции на отзыв по 152-ФЗ — 10 рабочих дней на полное прекращение обработки. Для cookies это происходит мгновенно (на стороне пользователя), но если данные уже попали в Yandex Metrica или CRM — оператор обязан их удалить или анонимизировать в течение 10 дней.
Audit trail — отдельная таблица в БД, куда логируется:
- timestamp согласия и отзыва;
- категории, на которые согласился пользователь;
- user_id (если авторизован) или session fingerprint (анонимный, без сбора идентифицирующих данных);
- IP в анонимизированном виде (только подсеть
/24); - User-Agent (для статистики, без идентификации).
При проверке РКН эти логи — главное доказательство, что процедура соблюдена. Без них даже корректно работающий баннер сложно защитить юридически.
Доступность (a11y): фокус по Tab должен попадать сначала на кнопку «Отклонить» (или хотя бы равноправно с «Принять» — не ниже неё), баннер должен быть оформлен как role="dialog" с aria-label и aria-describedby, контраст текста и кнопок — не ниже AA (4.5:1), а лучше AAA (7:1) для основных действий. Screen reader должен зачитывать содержимое баннера как диалог, а не как обычный текст внизу страницы.
Cross-domain и поддомены
Если сайт работает на нескольких поддоменах (например, shop.example.ru, blog.example.ru, account.example.ru) — пользователь не должен видеть баннер на каждом поддомене заново. Решения:
- Общий cookie на родительском домене: устанавливать
cookie_consentсdomain=.example.ru. Тогда все поддомены видят его. - Centralized API: при первом визите любого поддомена — запрос к
consent.example.ru/api/state, который возвращает текущее состояние из общей БД. - Postmessage iframe: невидимый iframe с центрального домена, читающий localStorage и передающий состояние через
window.postMessage.
Для отдельных доменов (example.ru и example-blog.com) согласие нельзя шарить юридически — это разные операторы (по факту разные правовые сущности). Каждый домен — свой баннер и своё согласие.
Что не делать
Не делайте баннер, который нельзя закрыть без согласия. Это «вынужденное согласие», которое суд не признаёт и которое РКН квалифицирует как нарушение. Кнопка «Отклонить» должна быть равнозначной «Принять» по визуальному весу.
Не делайте таймер «через 5 секунд закроется и согласие будет принято автоматически». Это прямо противоречит требованию активного действия. Известны случаи, когда РКН выписывал штраф именно за такую механику.
Не маскируйте кнопку «Отклонить» серым цветом на сером фоне, пока «Принять» — яркая зелёная. Это dark pattern, и проверяющий сразу его увидит. Минимальное приличие: одинаковый размер шрифта, одинаковый padding, контрастный фон у обеих кнопок.
Не загружайте Yandex Metrica или Google Tag Manager «заранее, чтобы быстрее» — это автоматически нарушает 152-ФЗ. Все трекеры подгружаются строго после согласия, через cookie:consent event или аналогичный механизм.
Не используйте «implied consent» («продолжая использовать сайт, вы соглашаетесь») как единственный механизм — это работало в 2018 году, сейчас не работает.
Как обрабатывать «Отклонить»
Если пользователь нажал «Отклонить» — никакая аналитика и реклама не работают. Сайт всё равно функционирует: формы отправляются, корзина работает, авторизация — нормально. Просто без счётчика посещений и ретаргетинга.
В реальности доля «отклонивших» — 5-15%, в зависимости от аудитории и UX баннера. Это терпимая потеря данных, особенно с учётом server-side трекинга для критичных конверсий, который не зависит от cookies. Server-side события (заказ оформлен, форма отправлена) можно отправлять напрямую с сервера в Measurement Protocol GA4 или Yandex Metrica API — без cookies на клиенте, по client_id, который оператор формирует сам и юридически считается не cookie-based.
Запись согласия и audit trail
Закон требует возможности отзыва согласия в любой момент. Это значит: пользователь должен иметь способ изменить выбор, и после отзыва — данные должны перестать собираться.
Хорошим тоном считается логировать факт согласия (timestamp, IP без личных данных, выбранные категории) — на случай проверки. Это не персональные данные, а доказательство соблюдения процедуры. Минимальная схема таблицы consent_log:
id— uuid;user_id— null для гостей, заполняется для авторизованных;session_id— анонимный fingerprint;categories— jsonb с{essential, analytics, marketing};action—'granted' | 'updated' | 'revoked';ip_subnet—192.168.1.0/24(без последнего октета);user_agent— обрезанный до 200 символов;created_at— timestamp.
Хранить такие логи рекомендуется минимум 3 года (срок исковой давности по гражданским делам), оптимально — 5 лет.
Итого
Cookie-баннер сегодня — обязательный элемент любого сайта с аналитикой или рекламой в России. Минимум: понятный текст с указанием конкретных целей; равноправные кнопки «Принять» / «Отклонить» / «Настроить»; реальные категории, отражающие то, что у вас на сайте; отложенная загрузка скриптов после явного согласия; возможность изменить решение из футера и страницы /cookies; audit trail в БД на случай проверки. Делается за 1-2 рабочих дня на готовом стеке, снимает риск штрафа от Роскомнадзора, который растёт каждый год, и повышает доверие пользователей. Если работаете и на Европу — добавляете GDPR-режим: явный opt-in, DPO, отдельный английский баннер.
Частые вопросы
Что говорит 152-ФЗ о cookies на сайте?
152-ФЗ требует получать согласие субъекта на обработку его персональных данных. Cookies, идентифицирующие пользователя (например, для аналитики и таргетинга), — это персональные данные, разъяснил Роскомнадзор. Согласие должно быть конкретным, информированным и однозначным. Это значит: баннер должен показать, какие cookies собираются и зачем; пользователь должен иметь возможность согласиться, отказаться или настроить выборочно; до получения согласия аналитические скрипты не работают. «Молчаливого согласия» недостаточно, pre-checked checkboxes недостаточно — только явное активное действие.
Какие cookies можно ставить без согласия пользователя?
Технические cookies, без которых сайт не работает: сессионные id, корзина, токен авторизации, выбранный язык, CSRF-токен. Они не требуют согласия — это «необходимые для функционирования сервиса по запросу пользователя». Всё остальное — аналитика (Yandex Metrika, GA4), рекламные пиксели (Yandex Direct, Google Ads, ВКонтакте, MyTarget), куки чатботов и виджетов, A/B-тестов, heat-map — требуют явного согласия. До клика по «Принять» эти скрипты не должны быть в DOM вообще, иначе формальное согласие после факта не помогает.
Какие штрафы за отсутствие или некорректный cookie-баннер?
По обновлённой ст. 13.11 КоАП: 30-300 тыс. ₽ для юрлиц за обработку без согласия, до 700 тыс. ₽ за повторное нарушение, до 18 млн ₽ при утечке данных. С 30 мая 2025 года введены оборотные штрафы при особо крупных утечках — до 3% выручки. РКН рассматривает 1200+ жалоб в год именно по cookies, и проверки стали содержательными: проверяющий открывает DevTools и смотрит, какие cookies реально устанавливаются до клика.
Чем 152-ФЗ отличается от GDPR в части cookies?
GDPR строже: явный opt-in для всех неessential cookies, штрафы до €20 млн или 4% мирового оборота, обязательный DPO при больших объёмах, 72 часа на уведомление об утечке. 152-ФЗ более гибкий: допустима связка «Принять / Настроить» без обязательного «Отклонить» на первом экране (но в настройках отказ должен быть в один клик), штрафы до 18 млн ₽, локализация ПДн в РФ обязательна (242-ФЗ — этого нет в GDPR). Если работаете на оба рынка — применяйте более строгое, то есть GDPR.
Как технически реализовать cookie-баннер в Next.js?
Компонент CookieBanner появляется на первом визите, читает localStorage.cookie_consent_v2. Если консент отсутствует или старше года — показывает баннер. После выбора пользователя записывает решение в localStorage и диспатчит CustomEvent cookie:consent с категориями. Скрипты Yandex Metrika и других трекеров загружаются отдельным компонентом, который слушает это событие и подгружает скрипт через document.createElement('script') только при analytics: true. До этого момента скрипта в DOM нет вообще.
Как организовать UX отзыва согласия?
Закон требует возможности отзыва согласия так же легко, как оно было дано. Минимум: ссылка «Настройки cookies» в футере на каждой странице. Дополнительно: страница /cookies или /privacy/cookies-management с подробностями, пункт меню в личном кабинете. При отзыве: удалить запись из localStorage, удалить трекинг-cookies со всех доменов, отправить лог на сервер, перезагрузить страницу для выгрузки уже подгруженных скриптов. Срок реакции по 152-ФЗ — 10 рабочих дней на полное прекращение обработки.
Каких dark patterns избегать в cookie-баннере?
Не делайте баннер, который нельзя закрыть без согласия — это «вынужденное согласие», которое не признаётся. Кнопка «Отклонить» должна быть равнозначной «Принять» по размеру, цвету, контрасту. Не делайте таймер автосогласия. Не маскируйте «Отклонить» серым на сером, пока «Принять» — яркая зелёная. Не используйте pre-checked чекбоксы для аналитики и маркетинга. Не загружайте трекеры до согласия «чтобы быстрее». РКН все эти приёмы знает и квалифицирует как нарушение ст. 13.11 КоАП.