Перейти к содержанию
Инструкция

Уведомление о cookies на сайт

Как добавить на сайт уведомление о cookies с учётом 152-ФЗ: согласие на обработку персональных данных, ссылка на политику, доступный баннер и подключение Яндекс.Метрики только после согласия. Готовый код без устаревших зависимостей.

Обновлено 22 июля 8 минут чтения 1 просмотр

Плашка «мы используем cookies» из 2016 года – это уже не про красоту, а про закон. В России обработку данных пользователей регулирует Федеральный закон №152-ФЗ «О персональных данных», а с 2025 года штрафы за нарушения в этой сфере заметно выросли. Cookies и идентификаторы систем аналитики (Яндекс.Метрика, счётчики) во многих случаях трактуются как персональные данные, поэтому уведомление должно не просто «висеть», а выполнять три задачи: информировать, вести на политику обработки ПДн и фиксировать согласие. Ниже – как сделать это правильно и без устаревших зависимостей.

Что требует 152-ФЗ и практика Роскомнадзора

Важно понимать разницу с европейским GDPR: российское законодательство не требует «предварительного» блокирующего согласия на все cookies так жёстко, как ЕС. Но есть обязательные вещи, которые проверяет Роскомнадзор:

  • Политика обработки персональных данных – отдельный документ, опубликованный на сайте и доступный с любой страницы (обычно ссылка в футере). Это прямое требование 152-ФЗ для оператора, собирающего данные.
  • Информирование пользователя о том, что сайт использует cookies и системы аналитики, и куда идут данные.
  • Согласие на обработку ПДн – для форм (заявки, обратная связь) это отдельный чекбокс со ссылкой на политику; для аналитических cookies практикой стало согласие через баннер.
  • Учёт трансграничной передачи – если данные уходят на зарубежные серверы, это отдельно отражают в политике и уведомляют РКН. Для сайтов на российских сервисах аналитики это обычно неактуально.

Практический вывод: баннер должен ссылаться на реальную страницу политики (не заглушку), а трекеры желательно подключать после согласия – это соответствует принципу минимизации и снижает риски.

В исходной версии заметки подключалась библиотека js-cookie версии 2.1.2 с публичного CDN и вручную писались функции addClass/removeClass. В 2026 это лишнее и небезопасно:

  • внешний CDN – это сторонний домен, точка отказа и дополнительный запрос; современные браузеры отлично работают с document.cookie и classList без библиотек;
  • манипуляции классами через регулярные выражения заменяются нативным element.classList.toggle();
  • ключевой момент: счётчик Метрики в старом коде грузился сразу при загрузке страницы – то есть до согласия. Правильнее инициализировать его только после нажатия кнопки.

Разметка баннера: доступная и без зависимостей

Используем семантические атрибуты доступности: role="dialog", aria-live и настоящую кнопку <button> вместо ссылки-заглушки <a href=""> (пустой href перезагружает страницу). Блок кладём в футер сайта:

<div class="cookie-notice" id="cookieNotice" role="dialog"
     aria-live="polite" aria-label="Уведомление об использовании cookies" hidden>
  <p>Мы используем cookies и Яндекс.Метрику, чтобы сайт работал и был удобнее.
     Оставаясь на сайте, вы соглашаетесь с
     <a href="/privacy/">политикой обработки персональных данных</a>.</p>
  <button type="button" id="cookieAccept">Принять</button>
</div>

Скрипт: согласие и отложенная загрузка Метрики

Логика простая: если согласие уже сохранено – сразу инициализируем счётчик; если нет – показываем баннер и грузим Метрику только по клику. Вместо ХХХХХХ подставьте номер своего счётчика.

<script>
(function () {
  var KEY = 'cookie_agreement';
  var notice = document.getElementById('cookieNotice');
  var accept = document.getElementById('cookieAccept');

  function hasConsent() {
    return document.cookie.indexOf(KEY + '=1') !== -1;
  }

  function setConsent() {
    // срок 180 дней, ограничиваем область и защищаем от CSRF-утечки
    var d = new Date();
    d.setTime(d.getTime() + 180 * 24 * 60 * 60 * 1000);
    document.cookie = KEY + '=1; expires=' + d.toUTCString() +
                      '; path=/; SameSite=Lax';
  }

  function initCounter() {
    (function (m, e, t, r, i, k, a) {
      m[i] = m[i] || function () { (m[i].a = m[i].a || []).push(arguments); };
      m[i].l = 1 * new Date();
      k = e.createElement(t); a = e.getElementsByTagName(t)[0];
      k.async = 1; k.src = r; a.parentNode.insertBefore(k, a);
    })(window, document, 'script', 'https://mc.yandex.ru/metrika/tag.js', 'ym');
    ym(XXXXXX, 'init', { clickmap: true, webvisor: false });
  }

  if (hasConsent()) {
    initCounter();
  } else {
    notice.hidden = false;
    accept.addEventListener('click', function () {
      setConsent();
      notice.hidden = true;
      initCounter();
    });
  }
})();
</script>

Обратите внимание на флаг SameSite=Lax – он ограничивает отправку cookie в межсайтовых запросах и стал стандартом безопасности. На HTTPS-сайте к нему добавляют Secure.

Типичные ошибки

  • Ссылка на несуществующую политику. Баннер ведёт на cookie.php, которого нет, – с точки зрения 152-ФЗ обязанность не выполнена. Сначала опубликуйте политику, потом ставьте баннер.
  • Трекер грузится до согласия. Инициализируйте Метрику после клика, а не при загрузке страницы.
  • Пустой href="" на кнопке. Это перезагружает страницу и сбрасывает состояние – используйте <button type="button">.
  • Баннер перекрывает контент на мобильных. Проверьте, что плашка не мешает нажать важные кнопки, и её можно закрыть.
  • Забыли про формы. Согласие на обработку ПДн в формах – это отдельный обязательный чекбокс, баннер cookies его не заменяет.

Если вы хотите выводить баннер по-разному на разных страницах (например, скрывать на самой странице политики) – пригодится приём из гайда «Вывод блоков только на определённых страницах». А тем, кто дорабатывает вывод текущего года и дат в подвале с политикой, будут полезны «Вывод текущего года на PHP» и «Сменить формат даты в CMS Битрикс».

Частые вопросы

Обязательно ли в России ставить баннер о cookies, как в Европе?

Жёсткого требования блокирующего согласия на все cookies, как в GDPR, в РФ нет. Но 152-ФЗ обязывает опубликовать политику обработки персональных данных и информировать пользователя. Cookies систем аналитики часто трактуются как ПДн, поэтому баннер со ссылкой на политику – рекомендуемая практика.

Считаются ли cookies персональными данными?

Сами по себе технические cookies – нет, но идентификаторы систем аналитики (Яндекс.Метрика и подобные) в связке с другими данными могут трактоваться как персональные данные. Поэтому их сбор отражают в политике и информируют пользователя.

Нужно ли грузить Яндекс.Метрику до согласия пользователя?

Нет. Правильнее инициализировать счётчик только после нажатия кнопки согласия – это соответствует принципу минимизации обработки данных и снижает юридические риски.

Заменяет ли баннер cookies согласие на обработку данных в формах?

Нет. Для форм заявок и обратной связи нужен отдельный чекбокс согласия на обработку персональных данных со ссылкой на политику. Баннер cookies и согласие в форме – это разные вещи.

Зачем нужен атрибут SameSite=Lax у cookie согласия?

SameSite=Lax ограничивает отправку cookie в межсайтовых запросах, снижая риск CSRF-атак. Это современный стандарт безопасности; на HTTPS к нему добавляют флаг Secure.

Валентина Меланина

Хотите обсудить свой проект?

Помогу с разработкой, аналитикой и AI-видимостью вашего сайта

Если у вас есть задача — от внедрения разметки и аналитики до полной переработки сайта — напишите, обсудим объём и подход.