Analityka bez cookies w Polsce: Umami, RODO i art. 399 Prawa komunikacji elektronicznej
Brak cookies nie oznacza automatycznie braku zgody. Co mówią RODO i art. 399 Prawa komunikacji elektronicznej oraz trzy stanowiska, których da się bronić.
Analityka bez cookies, taka jak Umami, omija ciasteczka, ale nie omija unijnej zasady dotyczącej odczytu informacji z urządzenia odwiedzającego. W Polsce tę zasadę zapisano w art. 399 Prawa komunikacji elektronicznej i nie ma w niej wyjątku dla analityki. Da się bronić trzech stanowisk: zgoda, brak banera przy pełnej informacji i respektowaniu rezygnacji albo brak analityki w przeglądarce. Ta strona wybrała drugie.
TL;DR
- Dwie zasady: RODO dotyczy danych osobowych, a art. 399, polska wersja zasady z dyrektywy ePrivacy, dotyczy zapisu i odczytu czegokolwiek na urządzeniu, z cookies czy bez.
- Dostęp mimo braku cookies: EROD uznaje skrypt, który każe przeglądarce wysłać dane, za dostęp, a art. 399 nie ma wyjątku dla pomiaru oglądalności.
- Ta strona: bez banera, Umami bez cookies, polityka prywatności, która mówi, co skrypt odczytuje, możliwość rezygnacji i żadnego skryptu przy Do Not Track albo Global Privacy Control.
To nie jest porada prawna. Jestem programistą, który przeczytał źródła dla własnej strony. Jeśli od tej decyzji zależy Twój biznes, zapytaj prawnika.
Jakie dwie zasady tu obowiązują?
RODO dotyczy danych osobowych. Analityka potrzebuje podstawy prawnej. Dla małej strony zwykle jest nią art. 6 ust. 1 lit. f, prawnie uzasadniony interes: przetwarzanie „niezbędne do celów wynikających z prawnie uzasadnionych interesów realizowanych przez administratora”, chyba że przeważają prawa osoby, której dane dotyczą. Art. 21 pozwala w dowolnym momencie wnieść sprzeciw wobec takiego przetwarzania, z przyczyn związanych ze szczególną sytuacją tej osoby.
Dyrektywa o prywatności i łączności elektronicznej (2002/58/WE, potocznie ePrivacy) w art. 5 ust. 3 dotyczy zapisywania informacji na urządzeniu użytkownika i odczytywania ich z niego, niezależnie od tego, czy to dane osobowe. W Polsce wdraża ją Prawo komunikacji elektronicznej (Dz.U. 2024 poz. 1221), obowiązujące od 10 listopada 2024 r. Zasada dotycząca urządzenia to jego art. 399.
„Bez cookies” odpowiada na pytanie o ciasteczka. Art. 399 zadaje szersze.
Co dokładnie mówi art. 399?
Ustęp 1 w skrócie: „Przechowywanie informacji lub uzyskiwanie dostępu do informacji już przechowywanej w telekomunikacyjnym urządzeniu końcowym abonenta lub użytkownika końcowego jest dozwolone” pod trzema warunkami:
- użytkownik zostaje „uprzednio poinformowany w sposób jednoznaczny, łatwy i zrozumiały” o celu i o tym, jak może określić warunki w ustawieniach oprogramowania albo usługi;
- potem „wyrazi na to zgodę”;
- sam zapis lub odczyt nie zmienia konfiguracji urządzenia ani oprogramowania.
Ustęp 3 zdejmuje te warunki, gdy zapis lub dostęp jest konieczny do przesłania komunikatu przez publiczną sieć. Zdejmuje je też przy usłudze „żądanej przez abonenta lub użytkownika końcowego”, czyli takiej, o którą użytkownik sam poprosił. Art. 400 dodaje, że do zgody stosuje się odpowiednio przepisy o ochronie danych osobowych.
Z samego tekstu wynikają trzy rzeczy:
- Przepis wiąże każdego, kto zapisuje albo odczytuje. Nie ma w nim warunku prowadzenia działalności.
- Obejmuje dostęp, a nie tylko zapis.
- Wyjątki to transmisja i usługa, o którą użytkownik poprosił. Pomiar oglądalności do nich nie należy.
Czy skrypt bez cookies „uzyskuje dostęp” do urządzenia?
Europejska Rada Ochrony Danych (EROD) odpowiada, że w typowym przypadku tak. Według jej wytycznych 2/2023 (pkt 33) kod JavaScript, którym podmiot każe przeglądarce wysłać asynchroniczne żądania z danymi, „wyraźnie mieści się” w zakresie art. 5 ust. 3 (tłumaczenie moje).
Tracker Umami ma otwarty kod, więc można sprawdzić, co robi. W obecnej wersji:
- odczytuje szerokość i wysokość ekranu oraz język przeglądarki i wysyła je z każdym zdarzeniem;
- odczytuje jeden klucz w
localStorage,umami.disabled, żeby wiedzieć, czy zrezygnowałeś z pomiaru; - sprawdza ustawienie Do Not Track, jeśli włączysz tę opcję;
- domyślnie wysyła żądania bez poświadczeń i nie zapisuje żadnego ciasteczka.
FAQ Umami mówi to samo: „Umami does not use any cookies in the tracking code”. Cookies więc nie ma, ale w rozumieniu EROD dostęp jest. Dlatego kod trackera znaczy więcej niż jego strona główna: obietnica dostawcy nie jest źródłem prawa.
Te same wytyczne (pkt 56) dodają, że objęcie przepisem „nie oznacza automatycznie”, że trzeba zbierać zgodę (tłumaczenie moje). Czy działa wyjątek, ocenia się w każdym przypadku osobno, a w Polsce wyjątki to art. 399 ust. 3. Analityka słabo się w nich mieści.
Grupa Robocza Art. 29 pisała o tym już w 2012 r. (opinia WP194): analityka własna nie jest ściśle niezbędna do funkcji, o którą użytkownik wyraźnie poprosił. Uznała jednak, że raczej nie stwarza ryzyka dla prywatności, jeśli służy tylko zbiorczym statystykom pierwszej strony. Warunki: jasny opis w polityce prywatności, przyjazny sposób rezygnacji i anonimizacja. Zasugerowała nawet, że prawodawca mógłby dodać trzecie kryterium wyjątku.
Polska ustawa takiego kryterium nie ma. WP194 powstała przed RODO i przed obecną ustawą: przydaje się jako profil ryzyka, ale nie wiąże.
Jak wygląda polska praktyka i jakie są kary?
UODO korzysta na swojej stronie z Plausible Analytics. Jego polityka prywatności mówi, że to narzędzie „nie wykorzystuje plików cookie i nie zbiera danych osobowych”, i nie opisuje żadnego kroku zgody. UODO nie egzekwuje jednak art. 399. Kary za jego naruszenie nakłada Prezes UKE (art. 444 ust. 1 pkt 82 w związku z art. 446).
Górne granice, wprost z ustawy: do 3% przychodu z poprzedniego roku kalendarzowego (art. 446 ust. 1). Jeśli podmiot nie miał przychodu w trzech poprzedzających latach albo jego przychód w tym okresie nie przekroczył 500 000 zł, kara wynosi do 15 000 zł (art. 446 ust. 3). To maksima, a nie cennik.
Jakich stanowisk da się bronić?
| Stanowisko | Co robisz | Ile to kosztuje |
|---|---|---|
| (a) Pytanie o zgodę | Pytasz przed załadowaniem analityki i ładujesz ją dopiero po „tak” | Okno przy pierwszej wizycie; statystyki tylko od osób, które się zgodziły |
| (b) Bez banera, z pełną informacją | Opisujesz analitykę w polityce prywatności, dajesz możliwość rezygnacji i nie mierzysz, gdy przeglądarka wysyła Do Not Track albo Global Privacy Control | Ryzyko szczątkowe przy dosłownym czytaniu art. 399 |
| (c) Bez analityki w przeglądarce | Żadnego skryptu; najwyżej zbiorcze liczby z serwera | Tracisz rozmiary ekranów, języki i kliknięcia |
(a) jest najbezpieczniejsze przy dosłownym czytaniu art. 399, a (b) pasuje do profilu ryzyka z WP194 i do opisanej praktyki. (c) zawęża pytanie, ale go nie usuwa. Serwer i tak dostaje adresy IP, a wytyczne EROD (pkt 55) traktują adres IP wysłany z urządzenia użytkownika jako objęty przepisem.
Co robi ta strona?
Stanowisko (b), rozstrzygane przy każdej wizycie:
- 01 Strona się ładuje Działa tylko mały loader w HTML; skrypt Umami nie jest jeszcze pobierany.
- 02 Sygnały Do Not Track albo Global Privacy Control włączone? Stop: żadnego skryptu.
- 03 Rezygnacja umami.disabled zapisane w tej przeglądarce? Stop.
- 04 Umami Dodawane po zdarzeniu load, liczy tylko własną domenę strony. Bez cookies.
- 05 Zdarzenia Wartości ze stałych list, na przykład który przycisk albo który język. Nic, co wpisano.
Punkt 7 polityki prywatności, we wszystkich trzech językach strony, mówi, co skrypt odczytuje i jak go wyłączyć. Wprost nazywa siebie informacją, której wymaga art. 399 ust. 1. Przełącznik jest na stronie prywatności. Zapisanie jego flagi to coś, o co odwiedzający sam poprosił, czyli przypadek z ust. 3 pkt 2. Przycisk pauzy działa według tej samej zasady: zapamiętuje wybór dopiero po kliknięciu (ruch, który szanuje ludzi).
Jak to podpiąć w Umami?
Do Not Track to jeden atrybut: według dokumentacji Umami data-do-not-track sprawia, że tracker respektuje to ustawienie przeglądarki. Global Privacy Control nie ma w Umami żadnego ustawienia; nie wspominają o nim ani dokumentacja, ani kod trackera. Możesz anulować każde wysłanie w hooku data-before-send (wystarczy zwrócić wartość fałszywą), ale czyściej jest w ogóle nie ładować skryptu. Uproszczona wersja loadera tej strony:
const optedOut = () => {
try {
return !!localStorage.getItem("umami.disabled");
} catch {
return false; // storage zablokowany
}
};
if (!navigator.globalPrivacyControl && navigator.doNotTrack !== "1" && !optedOut()) {
addEventListener("load", () => {
const script = document.createElement("script");
script.src = "https://cloud.umami.is/script.js";
script.dataset.websiteId = "TWOJE-ID-STRONY";
script.dataset.domains = "your-site.com";
script.dataset.doNotTrack = "true";
document.head.append(script);
});
}
Rezygnacja to klucz ze strony „Exclude my own visits” w dokumentacji Umami, pod przełącznikiem, który go zapisuje albo usuwa:
optOutButton.addEventListener("click", () => {
try {
if (localStorage.getItem("umami.disabled")) localStorage.removeItem("umami.disabled");
else localStorage.setItem("umami.disabled", "1");
} catch {
// storage zablokowany: nic się nie zapisze, a loader i tak tego nie odczyta
}
});
Domyślnie
Z GPC Liczy się też serwer Umami. W jego otwartym kodzie identyfikator sesji to skrót (hash) z ID strony, adresu IP, user agenta i soli, która domyślnie zmienia się co miesiąc. Ciasteczek tu nie ma, ale adresy IP są, więc traktuj to jako przetwarzanie danych osobowych w rozumieniu RODO: wskaż podstawę, opisz ją w polityce i uwzględniaj sprzeciwy.
Ograniczenia
- To lektura źródeł przez programistę, nie opinia prawnika. Stanowisko (b) zostawia ryzyko szczątkowe przy dosłownym czytaniu art. 399; jeśli Ci ono nie odpowiada, (a) jest pełnoprawną odpowiedzią.
- Do Not Track i Global Privacy Control przychodzą tylko od części odwiedzających. MDN oznacza
navigator.doNotTrackjako przestarzałe, a jego specyfikację jako porzuconą.navigator.globalPrivacyControljest eksperymentalne i nie działa w części popularnych przeglądarek. - Rezygnacja żyje w jednej przeglądarce. Wyczyszczenie danych strony albo zmiana urządzenia ją kasuje.
- Kontekst zmienia odpowiedź: sklep, aplikacja z kontami czy strona firmy to nie to samo co osobiste portfolio.
Drugie miejsce, w którym dane odwiedzających spotykają tę stronę, to formularz kontaktowy, który wysyła maile bez klucza w przeglądarce. Całą budowę opisałem w studium przypadku, a jeśli chcesz o tym porozmawiać, tu znajdziesz kontakt.
Źródła
- Ustawa z dnia 12 lipca 2024 r. Prawo komunikacji elektronicznej, Dz.U. 2024 poz. 1221 (Sejm ELI API) (otwiera się w nowej karcie) (dostęp: )
- EDPB Guidelines 2/2023 on Technical Scope of Art. 5(3) of ePrivacy Directive, version 2.0 (otwiera się w nowej karcie) (dostęp: )
- Rozporządzenie (UE) 2016/679 (RODO), EUR-Lex (otwiera się w nowej karcie) (dostęp: )
- Article 29 Working Party, Opinion 04/2012 on Cookie Consent Exemption (WP194) (otwiera się w nowej karcie) (dostęp: )
- Umami docs: Tracker configuration (otwiera się w nowej karcie) (dostęp: )
- Umami docs: Exclude my own visits (otwiera się w nowej karcie) (dostęp: )
- Umami docs: FAQ (otwiera się w nowej karcie) (dostęp: )
- Kod trackera Umami (src/tracker/index.ts) (otwiera się w nowej karcie) (dostęp: )
- Kod endpointu zbierającego Umami (src/app/api/send/route.ts) (otwiera się w nowej karcie) (dostęp: )
- Navigator: globalPrivacyControl property (MDN) (otwiera się w nowej karcie) (dostęp: )
- Navigator: doNotTrack property (MDN) (otwiera się w nowej karcie) (dostęp: )
- UODO, Polityka prywatności (otwiera się w nowej karcie) (dostęp: )