Skip to main content
Назад к блогу
5 мин чтения

Куки-баннеры по-правильному (и по закону) — минимум для Словакии/ЕС

Большинство куки-баннеров либо нелегальны (предвыбранные чекбоксы, нет кнопки отказа), либо избыточны (энтерпрайз-платформы согласия для сайта в 5 страниц). Вот минимальный легальный сетап для малых сайтов в ЕС.

security

Куки-баннеры — одна из тех вещей, где большинство реализаций ошибочны в одном из двух направлений: либо нелегальны (предвыбранное согласие, нет кнопки отказа, тёмные паттерны), либо массивный оверкилл (энтерпрайз-платформы управления согласием на портфолио в 5 страниц).

Вот минимальный сетап, соответствующий закону для малых сайтов в ЕС (включая Словакию), основанный на том, что реально важно по GDPR и Директиве ePrivacy.

Когда нужен куки-баннер

Нужен, если ставишь куки, не являющиеся строго необходимыми для работы сайта. Самые частые триггеры:

Не нужен, если используешь только:

Простейший легальный путь: переключись на бескуковую аналитику и пропусти баннер совсем. Plausible и Fathom GDPR-совместимы без согласия. Это то, что я рекомендую для большинства клиентских сайтов — никакого баннера, управления согласием, юридического риска.

Если баннер всё же нужен: юридические требования

По GDPR + Директива ePrivacy (как имплементировано в словацком законодательстве и по всему ЕС):

1. Предварительное согласие на необязательные куки

Нужно получить согласие до установки любых необязательных куки. Это значит: никакого трекинга Google Analytics при загрузке страницы. Скрипт загружается только после клика пользователя на «Принять».

Предвыбранные чекбоксы явно нелегальны по GDPR (решение Planet49, CJEU 2019). Согласие должно быть утвердительным действием — кликом по кнопке, не отсутствием снятия чекбокса.

2. Равная заметность для принятия и отказа

Кнопки «Принять» и «Отклонить» должны быть одинаково легко находимы и кликабельны. Тёмные паттерны — «Отклонить» как крошечная ссылка, а «Принять» как большая зелёная кнопка — нарушают требование GDPR о свободно данном согласии.

Французский CNIL оштрафовал Google на €150М и Facebook на €60М в 2022 именно за это: один клик для принятия и несколько кликов для отказа.

3. Гранулярный контроль по категориям

Пользователи должны иметь возможность давать согласие на конкретные категории (аналитика, маркетинг, предпочтения), а не «всё или ничего». На практике для малого сайта только с аналитикой двух опций достаточно: «Принять аналитику» и «Отклонить всё».

4. Лёгкий отзыв

Пользователи должны иметь возможность отозвать согласие так же легко, как дали. Ссылка в футере («Настройки куки»), открывающая баннер заново — стандартный подход.

5. Задокументированное подтверждение

Нужно доказать, что согласие было дано. Храни запись: временную метку, на что дано согласие, версию текста согласия. Простая строка в БД или localStorage-запись достаточна.

Минимальная реализация

Для малого Next.js-сайта с Google Analytics:

'use client'

import { useState, useEffect } from 'react'

const CONSENT_KEY = 'cookie-consent'

type Consent = 'accepted' | 'rejected' | null

export function CookieBanner() {
  const [consent, setConsent] = useState<Consent>(null)
  const [visible, setVisible] = useState(false)

  useEffect(() => {
    const stored = localStorage.getItem(CONSENT_KEY)
    if (stored === 'accepted' || stored === 'rejected') {
      setConsent(stored)
      if (stored === 'accepted') loadAnalytics()
    } else {
      setVisible(true)
    }
  }, [])

  function accept() {
    localStorage.setItem(CONSENT_KEY, 'accepted')
    setConsent('accepted')
    setVisible(false)
    loadAnalytics()
  }

  function reject() {
    localStorage.setItem(CONSENT_KEY, 'rejected')
    setConsent('rejected')
    setVisible(false)
  }

  if (!visible) return null

  return (
    <div role="dialog" aria-label="Согласие на куки" className="...">
      <p>
        Мы используем куки для аналитики, чтобы улучшить сайт. См.{' '}
        <a href="/privacy">политику конфиденциальности</a>.
      </p>
      <div className="flex gap-3">
        <button onClick={reject} className="...">
          Отклонить
        </button>
        <button onClick={accept} className="...">
          Принять
        </button>
      </div>
    </div>
  )
}

function loadAnalytics() {
  const script = document.createElement('script')
  script.src = `https://www.googletagmanager.com/gtag/js?id=G-XXXXXXX`
  script.async = true
  document.head.appendChild(script)
}

Ключевые моменты:

Ссылка согласия в футере

<button
  onClick={() => {
    localStorage.removeItem(CONSENT_KEY)
    window.location.reload()
  }}
  className="text-sm text-gray-400 hover:text-white"
>
  Настройки куки
</button>

Очищает сохранённое согласие и перезагружает страницу, показывая баннер заново. Просто, легально, никакой энтерпрайз-платформы.

Специфика Словакии

Словакия имплементирует Директиву ePrivacy через Закон об электронных коммуникациях (zákon č. 452/2021). Требования совпадают с EU-стандартом — никаких словацких подводных камней. Регуляторный орган — Úrad na ochranu osobných údajov.

Для малого сервисного бизнеса риск правоприменения низок — регуляторы фокусируются на крупных компаниях. Но соблюдение достаточно просто, чтобы не было причины пропускать. Реализация выше занимает 30 минут.

Чего не стоит использовать

Рекомендация

Для большинства малых сайтов: переключись на бескуковую аналитику (Plausible, Fathom) и пропусти баннер совсем. Никакого юридического риска, UX-трения, стоимости реализации.

Если нужен именно Google Analytics: используй реализацию выше. 30 минут работы, легально, без сторонних платформ.

В любом случае задокументируй в политике конфиденциальности — какие куки ставишь, зачем, и как пользователи могут отказаться.


Хочешь, чтобы сайт был легальным без энтерпрайз-сложности? Напиши — я шиплю GDPR-совместимые сетапы на каждом EU-проекте.