Cookie-баннер по 152-ФЗ в 2026 году должен быть реализован по модели opt-in: cookies не устанавливаются до явного согласия пользователя, отдельные кнопки «Принять все» и «Только необходимые», без предустановленных галочек, с гранулярным согласием по категориям (технические / аналитические / маркетинговые) и обязательным серверным логированием выбора. Нарушение требований — штраф до 700 000 ₽ по ч.2 ст.13.11 КоАП РФ, а автоматизированный мониторинг РКН (АС МПДн), работающий с 2025 года, может выявлять такие нарушения по жалобам и в приоритетных отраслях.
Проверьте cookie-баннер на своём сайте — за 30 секунд ←
Чем opt-in отличается от opt-out и почему opt-out нелегален
Opt-in (требование 152-ФЗ): cookies аналитики и маркетинга не загружаются до того, как пользователь активно нажмёт «Принять». Чекбоксы по умолчанию пустые. Есть отдельная кнопка «Отклонить» или «Только необходимые».
Opt-out (распространённый в США/ЕС-pre-GDPR): cookies уже работают с первого визита, пользователь может сам отключить в настройках. По 152-ФЗ — прямое нарушение, потому что обработка ПДн (cookies приравнены к ПДн по ст.3 152-ФЗ) ведётся до получения согласия.
С 30 мая 2025 года ужесточена ответственность по 13.11 КоАП — минимальный штраф за обработку без согласия для юрлиц составляет 300 000 ₽, максимальный — 700 000 ₽. Повторное нарушение — до 1 500 000 ₽.
Обязательные элементы cookie-баннера по 152-ФЗ
| Элемент | Требование | Норма |
|---|---|---|
| Видимость при первом визите | Не позже 5 сек после загрузки | Принцип «прозрачности» ст.9 152-ФЗ |
| Информирование о составе cookies | Какие категории, какие цели | Ст.9 ч.4 152-ФЗ |
| Кнопка «Принять все» | Активная, явно выделена | ст.9 ч.1 — «активное действие» |
| Кнопка «Отклонить» / «Только необходимые» | Равная по доступности с «Принять» | Разъяснения РКН 2025 |
| Гранулярные категории | Минимум 3: тех/анал/маркет | ст.9 ч.4 — «конкретность» цели |
| Пустые чекбоксы по умолчанию | Кроме «Технических» (обязательны) | ст.9 ч.1 — «активное действие» |
| Ссылка на политику обработки ПДн | Видимая в баннере | ст.18.1 152-ФЗ |
| Серверный лог согласия | Хранение на практике не менее 3 лет | Рекомендация (доказательство согласия) |
| Возможность отзыва | Доступ к настройкам после первого выбора | ст.9 ч.2 152-ФЗ |
Запрещённые элементы:
- ❌ Предустановленная галочка согласия — главное нарушение
- ❌ Только кнопка «Принять» без альтернативы
- ❌ Тёмные паттерны: маленькая «Отклонить» рядом с большой «Принять»
- ❌ Cookies без баннера в первые секунды (загрузка GA до согласия)
- ❌ «Согласие выражается продолжением просмотра» — давно нелегально
- ❌ Гранулярные настройки спрятаны за 3 кликами
Гранулярное согласие: какие категории нужны
Технические (Necessary) — обязательные для работы сайта. Согласия не требуют, отключить нельзя. Примеры: сессионная авторизация, корзина в e-commerce, anti-CSRF токен, выбор языка, тёмная тема.
Аналитические (Analytics) — счётчики посещаемости. Согласие обязательно. Примеры: Яндекс.Метрика, Google Analytics (требует отдельного уведомления о трансгран-передаче), Top.Mail.Ru, Plausible, Matomo.
Маркетинговые (Marketing) — ремаркетинг, рекламные пиксели. Согласие обязательно. Примеры: ВК-пиксель, Top.Mail.Ru target, Я.Аудитории, Google Ads tag, Meta Pixel (с особым риском — иностранный).
Внешние сервисы (Embeds) — если на сайте есть встроенные YouTube/RuTube видео, виджеты соцсетей, чаты типа Jivo/Carrot Quest. Технически они тоже cookies стороннего сервиса, требуют отдельной категории.
Для каждой категории — отдельный чекбокс. Пользователь может принять только то, на что согласен.
Готовый JS-сниппет cookie-баннера opt-in
Ниже — production-ready сниппет на чистом JavaScript (без зависимостей), который мы используем в Комплекте документов 152-ФЗ. Замените плейсхолдеры на свои значения.
<!-- РКН-compliant cookie banner с категориями (granular consent).
Встройте перед </body>. Не загружает аналитику/маркетинг до согласия. -->
<style>
.rkn-cb{position:fixed;left:16px;right:16px;bottom:16px;z-index:99999;
background:#fff;border:1px solid #e3e3e3;border-radius:12px;padding:18px 20px;
box-shadow:0 8px 24px rgba(0,0,0,.15);font:14px/1.45 system-ui,sans-serif;
display:none;color:#222;max-width:720px;margin:0 auto}
.rkn-cb.show{display:block}
.rkn-cb__top{display:flex;flex-wrap:wrap;gap:14px;align-items:flex-start}
.rkn-cb__text{margin:0;flex:1 1 280px;min-width:0}
.rkn-cb__btns{display:flex;flex-wrap:wrap;gap:8px}
.rkn-cb button{padding:10px 16px;border-radius:8px;border:0;cursor:pointer;
font:600 13px/1 system-ui,sans-serif;white-space:nowrap}
.rkn-cb__accept{background:#1d6cf3;color:#fff}
.rkn-cb__minimal{background:#f1f1f1;color:#222}
.rkn-cb__toggle{background:transparent;color:#0a66c2;padding:10px 4px;text-decoration:underline}
.rkn-cb__details{display:none;margin-top:14px;padding-top:14px;border-top:1px solid #eee}
.rkn-cb__details.open{display:block}
</style>
<div class="rkn-cb" id="rknCookieBanner" role="dialog" aria-label="Согласие на cookies">
<div class="rkn-cb__top">
<p class="rkn-cb__text">Сайт использует cookies. Технические — обязательные.
Аналитические и маркетинговые — только с вашего согласия.
<a href="/privacy/" target="_blank">Политика обработки ПДн</a>.</p>
<div class="rkn-cb__btns">
<button type="button" class="rkn-cb__accept" data-action="accept-all">Принять все</button>
<button type="button" class="rkn-cb__minimal" data-action="minimal">Только необходимые</button>
<button type="button" class="rkn-cb__toggle" data-action="toggle">Настроить ▾</button>
</div>
</div>
<div class="rkn-cb__details" id="rknCookieDetails">
<label><input type="checkbox" id="rkn-cb-tech" checked disabled> Технические (обязательные)</label><br>
<label><input type="checkbox" id="rkn-cb-analytics"> Аналитические (Я.Метрика и т.п.)</label><br>
<label><input type="checkbox" id="rkn-cb-marketing"> Маркетинговые (ремаркетинг, реклама)</label><br>
<button type="button" class="rkn-cb__accept" data-action="save">Сохранить выбор</button>
</div>
</div>
<script>
(function(){
var KEY='rkn_consent_v2', VERSION='2026-05-19';
var CONSENT_LOG_URL='/api/consent-log'; // ваш endpoint для серверного лога
var el=document.getElementById('rknCookieBanner');
var det=document.getElementById('rknCookieDetails');
var cbA=document.getElementById('rkn-cb-analytics');
var cbM=document.getElementById('rkn-cb-marketing');
var saved=null;
try{saved=JSON.parse(localStorage.getItem(KEY)||'null')}catch(e){}
function loadAnalytics(){ /* подключить Я.Метрику здесь */ }
function loadMarketing(){ /* подключить пиксели здесь */ }
function apply(c){ if(c.analytics)loadAnalytics(); if(c.marketing)loadMarketing(); }
function save(c){
var rec={v:VERSION,technical:true,analytics:!!c.analytics,marketing:!!c.marketing,
at:new Date().toISOString(),ua:navigator.userAgent};
try{localStorage.setItem(KEY,JSON.stringify(rec))}catch(e){}
if(CONSENT_LOG_URL && navigator.sendBeacon){
navigator.sendBeacon(CONSENT_LOG_URL, new Blob([JSON.stringify(rec)],{type:'application/json'}));
}
el.classList.remove('show'); apply(rec);
}
if(saved && saved.v===VERSION){apply(saved); return}
setTimeout(function(){el.classList.add('show')},400);
el.addEventListener('click',function(e){
var act=e.target.getAttribute('data-action'); if(!act)return;
if(act==='toggle'){det.classList.toggle('open');return}
if(act==='accept-all'){save({analytics:true,marketing:true});return}
if(act==='minimal'){save({analytics:false,marketing:false});return}
if(act==='save'){save({analytics:cbA.checked,marketing:cbM.checked});return}
});
})();
</script>
Что нужно дополнить:
- Endpoint для серверного лога (
/api/consent-log) — простой POST-обработчик, который пишет в БД timestamp + user-agent + категории. Хранение 3 года. loadAnalytics()— код подгрузки Я.Метрики (mc.yandex.ru/metrika/tag.js).loadMarketing()— код подгрузки маркетинговых пикселей.- Версия политики — поднимайте
VERSIONпри каждом изменении политики: пользователь увидит баннер заново.
Серверный лог согласия — почему обязателен
При споре с РКН (предписание или иск субъекта ПДн) оператор должен доказать, что получил согласие конкретного пользователя в конкретный момент. localStorage браузера — не доказательство: пользователь стёр, поменял устройство, использовал инкогнито.
Доказательством является серверный лог с полями:
- timestamp — точная дата и время до миллисекунд
- ip_hash — хешированный IP (не сам IP — это уменьшает массив ПДн)
- user_agent — браузер и устройство
- consent_record — JSON с категориями согласия
- policy_version — версия политики на момент согласия
- consent_hash — SHA-256 от всех полей для контроля целостности
Хранить рекомендуется на практике не менее 3 лет с момента прекращения обработки. При наличии лога — спор с РКН закрывается быстро.
Что в баннере может попадать под автоматизированный мониторинг
Автоматизированный мониторинг РКН (АС МПДн), а также проверки по жалобам субъектов, могут выявлять:
- Запросы к Я.Метрике, GA, маркетинговым пикселям до клика по баннеру — если есть, значит cookies устанавливаются без согласия → нарушение
- HTML-разметку баннера — наличие
checkedатрибута на чекбоксах согласия → нарушение - Доступность кнопки «Отклонить» — если её нет или она спрятана → нарушение
- Размер и контраст кнопок — если «Отклонить» в 3 раза меньше «Принять» → потенциальное нарушение (тёмный паттерн)
- Trackers без category-gating — если код Яндекс.Метрики выполняется до клика → нарушение
Бесплатная проверка на эти 5 пунктов автоматически ←