Przejdź do treści
← wszystkie przedmioty

RODO i inżynieria prywatności

Techniczne wdrożenie RODO dla inżynierów: minimalizacja danych, podstawy prawne, privacy by design, usuwanie danych, retencja, DPIA i transfery międzynarodowe.

TEMATY EGZAMINACYJNE W TYM PRZEDMIOCIE
  • Minimalizacja danych (art. 5) jako wymóg projektowy, nie sugestia dla analityków
  • Sześć podstaw prawnych art. 6 i dodatkowy reżim danych szczególnych kategorii z art. 9
  • Privacy by design i by default (art. 25): ustawienia domyślne muszą być najbardziej restrykcyjne
  • Prawo do usunięcia (art. 17) w systemach z backupami, cache'em i logami: crypto-shredding, kaskada do procesorów
  • Kiedy DPIA jest obowiązkowa (art. 35, kryteria WP248) i jak ją przeprowadzić
  • Pseudonimizacja to wciąż dane osobowe; transfery międzynarodowe po Schrems II (SCC, adekwatność, DPF/Schrems III)

1 · Zasady RODO i minimalizacja danych jako ograniczenie projektowe

★ egzamin

RODO (Rozporządzenie 2016/679) nie jest listą życzeń prawników, tylko zbiorem twardych ograniczeń, które muszą znaleźć odzwierciedlenie w schemacie bazy, kontrakcie API i architekturze systemu. Sześć zasad art. 5 ust. 1 to fundament, na którym stoi cała reszta rozporządzenia.

Art. 5 ust. 1
Sześć zasad: (a) zgodność z prawem, rzetelność i przejrzystość, (b) ograniczenie celu, (c) minimalizacja danych, (d) prawidłowość, (e) ograniczenie przechowywania, (f) integralność i poufność. Art. 5 ust. 2 dodaje siódmą: rozliczalność (accountability), administrator musi umieć wykazać zgodność, nie tylko ją deklarować.
Termin kluczowy
Minimalizacja danych (data minimization) - Dane muszą być adekwatne, stosowne oraz ograniczone do tego, co niezbędne do celów, w których są przetwarzane (art. 5 ust. 1 lit. c). To ograniczenie projektowe: pole formularza, które "może się przyda" analitykom za rok, nie ma dziś podstawy prawnej.
Termin kluczowy
Ograniczenie celu (purpose limitation) - Dane zebrane w konkretnym, wyraźnym i prawnie uzasadnionym celu nie mogą być dalej przetwarzane w sposób niezgodny z tym celem (art. 5 ust. 1 lit. b). Dane z formularza rekrutacyjnego nie stają się automatycznie bazą leadów marketingowych.
ZasadaWymógTypowe naruszenie w kodzie
Zgodność z prawem i przejrzystośćPodstawa prawna + jasna informacja dla użytkownikaBrak polityki prywatności linkowanej z formularza
Ograniczenie celuDane używane tylko do zadeklarowanego celuWykorzystanie adresu email z rejestracji do cold mailingu bez zgody
Minimalizacja danychZbierasz tylko to, co niezbędneFormularz zbierający datę urodzenia "na wszelki wypadek"
PrawidłowośćDane aktualne i poprawne, z mechanizmem korektyBrak endpointu do edycji własnych danych
Ograniczenie przechowywaniaRetencja ograniczona czasowoTabela logów bez TTL, rosnąca od lat bez czyszczenia
Integralność i poufnośćBezpieczeństwo techniczne i organizacyjneHasła w plaintext, brak szyfrowania w tranzycie
Pułapka
Najczęstszy błąd inżynierski: "zbierzmy to pole, może się przyda analitykom". To odwrócenie ciężaru dowodu, RODO wymaga uzasadnienia PRZED zebraniem danych, nie po fakcie. Brak jasnego celu w momencie zbierania oznacza brak podstawy prawnej.
Minimalizacja wymuszona na granicy API (Pydantic) python
from pydantic import BaseModel, EmailStr

class SignupRequest(BaseModel):
    """Only fields strictly necessary to create an account.
    Marketing consent is a separate, explicit opt-in field, never inferred."""
    email: EmailStr
    password: str
    marketing_consent: bool = False  # must default to False (privacy by default)

class UserProfile(BaseModel):
    """Internal model can hold more, but API responses use a narrower view."""
    id: str
    email: EmailStr
    created_at: str

class UserProfilePublic(BaseModel):
    """Shape returned to other users - excludes email entirely."""
    id: str
    display_name: str
  • DTO/schema na granicy API ujawnia tylko pola niezbędne odbiorcy, nawet jeśli model wewnętrzny ma więcej danych.
  • Endpoint zwracający profil publiczny nigdy nie serializuje pola email czy numeru telefonu.
  • Formularz frontendowy nie ma pola, którego backend nie potrzebuje, redukcja na wejściu jest tańsza niż redakcja na wyjściu.
  • Code review pyta wprost: jaki jest cel tego pola i kto go realnie używa za 3 miesiące?
Mnemonik
Sześć zasad art. 5 do zapamiętania: Zgodność z prawem, Ograniczenie celu, Minimalizacja, Prawidłowość, Integralność/poufność, Przechowywanie ograniczone. Siódma, rozliczalność, jest metazasadą: dowodzisz przestrzegania pozostałych sześciu.
Art. 5 ust. 2 (accountability)
Administrator musi być w stanie wykazać zgodność z zasadami RODO: rejestr czynności przetwarzania (art. 30), DPIA tam gdzie wymagane, polityki wewnętrzne, dowody zgody. Brak dokumentacji to samodzielne naruszenie, niezależne od tego, czy faktycznie doszło do wycieku.
  1. 1 Zdefiniuj cel przed projektowaniem schematu Każde pole w modelu danych ma udokumentowany cel biznesowy i podstawę prawną.
  2. 2 Zredukuj zakres na granicy API DTO wejściowe/wyjściowe ograniczają pola do potrzebnych danemu operacji.
  3. 3 Przypisz właściciela polu wrażliwemu Kto odpowiada za to pole, kto ma dostęp, kiedy jest usuwane.
  4. 4 Zweryfikuj w code review Nowe pole to pytanie o cel, podstawę prawną i okres retencji, nie tylko o typ danych.

2 · Podstawy prawne przetwarzania danych (art. 6 i 9)

★ egzamin

Każde przetwarzanie danych osobowych musi opierać się na jednej z sześciu podstaw prawnych z art. 6 ust. 1. Brak wybranej podstawy nie oznacza "przetwarzania na zasadach ogólnych", oznacza przetwarzanie niezgodne z prawem od pierwszej linijki kodu.

Podstawa (art. 6 ust. 1)Kiedy stosowaćPrzykład
lit. a) zgodaBrak innej podstawy, np. marketing emailNewsletter po dobrowolnym opt-in
lit. b) wykonanie umowyDane niezbędne do realizacji umowy z osobąAdres dostawy przy zamówieniu
lit. c) obowiązek prawnyPrzepis nakazuje przetwarzanieDane do faktury VAT, procedury KYC/AML
lit. d) żywotne interesyOchrona życia/zdrowia, gdy zgoda niemożliwaUdostępnienie danych medycznych w nagłym wypadku
lit. e) zadanie publiczneWykonywanie władzy publicznejRejestry administracji publicznej
lit. f) prawnie uzasadniony interesInteres administratora ważący więcej niż prawa osoby, po LIAZapobieganie oszustwom, podstawowa analityka bezpieczeństwa
Termin kluczowy
Zgoda (consent, art. 4 pkt 11 i art. 7) - Musi być dobrowolna, konkretna, świadoma i jednoznaczna, wyrażona przez wyraźne działanie potwierdzające. Wycofanie zgody musi być równie łatwe jak jej wyrażenie (art. 7 ust. 3). Zgoda związana z zaakceptowaniem regulaminu w jednym kroku zwykle nie jest dobrowolna.
Pułapka
Domyślnie zaznaczony checkbox zgody marketingowej to klasyczny błąd: EDPB oraz orzecznictwo TSUE (m.in. sprawa Planet49, C-673/17, dotycząca podobnego mechanizmu przy cookies) traktują brak aktywnego działania użytkownika jako brak ważnej zgody.
Art. 9
Szczególne kategorie danych (zdrowie, pochodzenie rasowe/etniczne, poglądy polityczne, przekonania religijne, dane biometryczne do celów identyfikacji, dane genetyczne, orientacja seksualna) są domyślnie zakazane do przetwarzania i wymagają dodatkowo jednej z przesłanek art. 9 ust. 2, niezależnie od podstawy z art. 6.
Termin kluczowy
Legitimate Interest Assessment (LIA) - Trzyczęściowy test ważenia interesu: (1) cel jest uzasadniony, (2) przetwarzanie jest konieczne do jego osiągnięcia, (3) interes administratora nie jest przeważony przez prawa i wolności osoby. Wynik testu trzeba udokumentować, to część rozliczalności, nie tylko wewnętrzna dyskusja.
Rekord zgody jako dowód dla rozliczalności (art. 5 ust. 2, art. 7 ust. 1) python
from dataclasses import dataclass
from datetime import datetime, timezone

@dataclass(frozen=True)
class ConsentRecord:
    """Immutable proof of consent, kept for accountability (Art. 5(2), Art. 7(1))."""
    user_id: str
    purpose: str                 # e.g. "marketing_email", never a bundled "all purposes"
    policy_version: str          # ties consent to the exact text the user saw
    given_at: datetime
    withdrawn_at: datetime | None = None

    def is_active(self) -> bool:
        return self.withdrawn_at is None

def record_consent(user_id: str, purpose: str, policy_version: str) -> ConsentRecord:
    return ConsentRecord(
        user_id=user_id,
        purpose=purpose,
        policy_version=policy_version,
        given_at=datetime.now(timezone.utc),
    )

Zgoda (consent)

  • Wymaga aktywnego opt-in użytkownika
  • Musi być odwoływalna w każdej chwili
  • Dobra podstawa dla marketingu i funkcji nieistotnych dla usługi
  • Słaba podstawa gdy istnieje nierównowaga sił (np. pracodawca-pracownik)

Prawnie uzasadniony interes

  • Nie wymaga zgody użytkownika, ale wymaga LIA
  • Osoba ma prawo wnieść sprzeciw (art. 21)
  • Dobra podstawa dla bezpieczeństwa, zapobiegania nadużyciom, podstawowej analityki
  • Nie działa dla danych szczególnych kategorii (art. 9)
  1. 1 Sprawdź, czy istnieje przepis nakazujący przetwarzanie (obowiązek prawny) zanim sięgniesz po zgodę.
  2. 2 Sprawdź, czy dane są niezbędne do wykonania umowy z tą konkretną osobą.
  3. 3 Jeśli żadna z twardych podstaw nie pasuje, rozważ prawnie uzasadniony interes i udokumentuj LIA.
  4. 4 Zgodę traktuj jako podstawę ostatniego wyboru dla marketingu, ponieważ jest najłatwiejsza do wycofania i najtrudniejsza do utrzymania w audycie.
Digital Omnibus (projekt, listopad 2025)
Komisja Europejska zaproponowała doprecyzowanie prawnie uzasadnionego interesu jako podstawy dla trenowania modeli AI. To wciąż projekt legislacyjny w trakcie procesu, nie obowiązujące prawo, traktuj jako kierunek zmian, nie jako aktualną podstawę do wdrożenia.

3 · Privacy by design i privacy by default w praktyce inżynierskiej (art. 25)

★ egzamin

Art. 25 przenosi RODO z warstwy polityki do warstwy architektury: uwzględnianie ochrony danych w fazie projektowania i domyślna ochrona danych to wymogi wobec systemu, nie deklaracje w dokumencie.

Art. 25 ust. 1
Administrator wdraża odpowiednie środki techniczne i organizacyjne (np. pseudonimizację) zarówno przy projektowaniu sposobów przetwarzania, jak i w czasie samego przetwarzania, uwzględniając stan wiedzy technicznej, koszt wdrożenia oraz ryzyko dla praw osób.
Art. 25 ust. 2
Domyślnie przetwarzane mają być tylko dane niezbędne dla każdego konkretnego celu: ilość zbieranych danych, zakres przetwarzania, okres przechowywania i dostępność muszą być domyślnie najbardziej restrykcyjne, użytkownik rozszerza je świadomym działaniem, nie odwrotnie.
Termin kluczowy
Privacy by design - Ochrona prywatności jako wymaganie niefunkcjonalne obecne od pierwszego szkicu architektury: modelu danych, przepływu danych między usługami, wyboru trzecich dostawców, aż po plan usuwania danych.
Termin kluczowy
Privacy by default - Konkretna realizacja privacy by design na poziomie ustawień: profil prywatny domyślnie, lokalizacja wyłączona domyślnie, udostępnianie danych stronom trzecim wyłączone domyślnie.
Pułapka
Wzorzec "opt-out zamiast opt-in": funkcja udostępniania danych partnerom włączona domyślnie, z linkiem "zarządzaj preferencjami" schowanym w ustawieniach, narusza wprost art. 25 ust. 2, niezależnie od tego, czy formalnie istnieje przełącznik.
Domyślnie prywatna widoczność wymuszona w migracji schematu (Django) python
# Migration: new visibility field defaults to the most restrictive setting.
# Privacy by default (Art. 25(2)): the user must opt IN to public visibility,
# never opt out of it.
from django.db import migrations, models

class Migration(migrations.Migration):
    dependencies = [("profiles", "0012_alter_profile")]
    operations = [
        migrations.AddField(
            model_name="profile",
            name="is_public",
            field=models.BooleanField(default=False),  # private until user chooses otherwise
        ),
    ]
  • Modelowanie danych: pole wrażliwe ma domyślną wartość najbardziej restrykcyjną, nie "null" interpretowane jako publiczne.
  • Warstwa API: endpoint bez jawnie podanych parametrów zwraca minimalny zestaw danych, rozszerzenie wymaga explicit query param.
  • Integracje trzecie: nowy webhook czy SDK analityczny przechodzi przegląd danych, zanim trafi na produkcję, nie po.
  • Kontrola dostępu: RBAC/ABAC domyślnie odmawia dostępu (deny by default), uprawnienia nadawane wprost, nigdy przez brak reguły.
Mnemonik
Test na privacy by default: czy nowy użytkownik, który nic nie kliknął, ma najbardziej prywatne możliwe ustawienia? Jeśli odpowiedź brzmi "nie, ale może to zmienić w ustawieniach", system już narusza art. 25 ust. 2.
  1. 1 Data flow diagram Zmapuj przepływ danych nowej funkcji: skąd, dokąd, przez kogo, w tym procesorów trzecich.
  2. 2 Przegląd minimalizacji Dla każdego pola: czy jest niezbędne do konkretnego celu tej funkcji?
  3. 3 Audyt ustawień domyślnych Każdy nowy przełącznik/widoczność: wartość domyślna to najbardziej restrykcyjna.
  4. 4 Screening pod DPIA Sprawdź kryteria WP248 (sekcja 7), zdecyduj czy potrzebna pełna DPIA.

4 · Klasyfikacja i obsługa danych osobowych w kodzie

Zanim padnie pytanie "czy to jest RODO", trzeba wiedzieć, czym w ogóle jest dana osobowa w kodzie, który piszesz, i jak ją oznaczyć tak, by dalsze warstwy systemu (logi, cache, eksport do BI) wiedziały, że mają do czynienia z czymś wrażliwym.

Termin kluczowy
Dane osobowe (art. 4 pkt 1) - Wszelkie informacje o zidentyfikowanej lub możliwej do zidentyfikowania osobie fizycznej, bezpośrednio (imię, PESEL) lub pośrednio, przez identyfikator taki jak adres IP, identyfikator online, dane o lokalizacji, cookie ID (motyw 30).
TSUE, Breyer, C-582/14 (2016)
Dynamiczny adres IP jest daną osobową względem dostawcy usługi online, jeśli ma on prawne środki umożliwiające identyfikację użytkownika przy pomocy osoby trzeciej, np. dostawcy internetu na żądanie organów ścigania. W praktyce: traktuj każdy adres IP w logach jako dane osobowe.
Klasa danychPrzykładWymagana kontrola
PubliczneNazwa firmy, cennikBrak specjalnych wymagań
WewnętrzneStatystyki agregowane, brak PIIStandardowa kontrola dostępu
Dane osoboweEmail, IP, historia zamówieńSzyfrowanie w spoczynku, RBAC, logowanie dostępu, retencja
Dane szczególnych kategorii (art. 9)Dane zdrowotne, biometryczneDodatkowa podstawa prawna, szyfrowanie na poziomie pola, ścisła kontrola dostępu, DPIA
Filtr redakcji PII przed wysłaniem logów do zewnętrznego agregatora python
import logging
import re

PII_PATTERNS = {
    "email": re.compile(r"[\w.+-]+@[\w-]+\.[\w.-]+"),
    "ip": re.compile(r"\b\d{1,3}(?:\.\d{1,3}){3}\b"),
}

class RedactPIIFilter(logging.Filter):
    """Strips common PII shapes before a log record leaves the process,
    so third-party log aggregators (Sentry, Datadog) never receive raw PII."""

    def filter(self, record: logging.LogRecord) -> bool:
        msg = record.getMessage()
        for label, pattern in PII_PATTERNS.items():
            msg = pattern.sub(f"[REDACTED_{label.upper()}]", msg)
        record.msg, record.args = msg, ()
        return True

logger = logging.getLogger("app")
logger.addFilter(RedactPIIFilter())
Pułapka
Logowanie pełnego body żądania HTTP "na potrzeby debugowania" i wysyłanie go do Sentry/Datadog czyni ten serwis kolejnym procesorem danych osobowych, zwykle bez umowy powierzenia (art. 28) obejmującej ten konkretny strumień danych. To nieudokumentowane przetwarzanie, nie tylko problem higieny logów.
  • Szyfrowanie w spoczynku (at rest) dla całej bazy plus szyfrowanie na poziomie pola dla danych szczególnych kategorii.
  • RBAC/ABAC z zasadą najmniejszych uprawnień, dostęp do tabeli z PII nie jest domyślny dla każdego mikroserwisu.
  • Tokenizacja numerów kart/dokumentów tam, gdzie pełna wartość nie jest potrzebna w większości przepływów.
  • Maskowanie w interfejsach administracyjnych (ostatnie 4 cyfry, częściowy email), pełna wartość tylko po dodatkowej autoryzacji.
  1. 1 Zinwentaryzuj przepływy danych Skąd dana wchodzi do systemu, przez jakie usługi przechodzi, gdzie ląduje: baza, cache, log, BI, backup.
  2. 2 Oznacz pola w kodzie Metadane lub konwencja nazewnicza wskazująca klasę danych, czytelna dla lintera i serializera.
  3. 3 Zsynchronizuj z rejestrem czynności (art. 30) Inwentarz z kroku 1 to surowiec dla ROPA, nie osobny dokument tworzony ręcznie od zera.
Art. 30
Rejestr czynności przetwarzania jest obowiązkowy dla większości administratorów; wyjątek dla podmiotów poniżej 250 pracowników jest wąski i nie obejmuje przetwarzania systematycznego ani obejmującego dane szczególnych kategorii na dużą skalę, w praktyce niemal każda aplikacja SaaS z użytkownikami musi go prowadzić.

5 · Prawo do usunięcia: dlaczego jest trudne technicznie (art. 17)

★ egzamin

"Usuń moje dane" brzmi jak jedno zapytanie DELETE. W realnym systemie to rozgałęziony problem: baza produkcyjna, indeks wyszukiwania, cache, kolejka zdarzeń, hurtownia danych, logi, backupy i procesorzy trzecy, każdy z innym cyklem życia.

Art. 17 ust. 1
Podstawy żądania usunięcia: dane nie są już niezbędne do celu, wycofano zgodę i brak innej podstawy, osoba wniosła sprzeciw (art. 21) i brak nadrzędnych podstaw, dane były przetwarzane niezgodnie z prawem, usunięcie wymagane przepisem prawa, dane dziecka zebrane w związku z usługami społeczeństwa informacyjnego.
Art. 17 ust. 3
Wyjątki: wolność wypowiedzi i informacji, obowiązek prawny, względy interesu publicznego w zakresie zdrowia publicznego, cele archiwalne/badawcze/statystyczne z zabezpieczeniami art. 89, ustalenie/dochodzenie/obrona roszczeń. Faktura, którą trzeba trzymać kilka lat dla urzędu skarbowego, nie znika na żądanie klienta.
Pułapka
Backup jako "niewidzialna kopia danych" to najczęstsza wymówka techniczna i najczęstszy błąd: RODO nie zwalnia z obowiązku wobec danych w backupie, wymaga jedynie proporcjonalnego podejścia, np. deklarowanego okresu do nadpisania backupu plus techniki takiej jak crypto-shredding zamiast ręcznego przeszukiwania każdej kopii.
Termin kluczowy
Crypto-shredding - Szyfrowanie danych każdego podmiotu unikalnym kluczem; usunięcie polega na trwałym zniszczeniu klucza, nie na fizycznym nadpisaniu danych. Zaszyfrowane, nieczytelne dane pozostające w backupie przestają stanowić praktyczne ryzyko dla osoby, mimo że bajty formalnie tam są.
Crypto-shredding: usunięcie klucza zamiast przeszukiwania backupów python
from cryptography.fernet import Fernet

class SubjectKeyStore:
    """One encryption key per data subject. "Erasing" a user means deleting
    their key here, not rewriting every backup that contains their ciphertext."""

    def __init__(self) -> None:
        self._keys: dict[str, bytes] = {}

    def key_for(self, user_id: str) -> bytes:
        if user_id not in self._keys:
            self._keys[user_id] = Fernet.generate_key()
        return self._keys[user_id]

    def erase(self, user_id: str) -> None:
        # Deleting the key here makes every ciphertext copy that exists only as
        # bytes elsewhere (a backup, a log, another process) unreadable forever,
        # since nothing can retrieve this key again. Note: key_for() called again
        # for this user_id after erase() would silently mint a brand-new, unrelated
        # key, that is a separate footgun, not an "undo" of the erasure.
        self._keys.pop(user_id, None)

store = SubjectKeyStore()
cipher = Fernet(store.key_for("user-123"))
encrypted = cipher.encrypt(b"sensitive profile data")
store.erase("user-123")
# cipher already captured its own copy of the key bytes at construction time,
# so cipher.decrypt(encrypted) still succeeds here, erase() does not reach into
# live objects. The real guarantee covers ciphertext sitting as bytes elsewhere
# (backups, logs, other processes) that never had a live Fernet built from this key.
  • Baza produkcyjna: DELETE lub anonimizacja rekordu.
  • Indeks wyszukiwania (Elasticsearch/OpenSearch): osobne zadanie reindeksujące lub usuwające dokument.
  • Cache (Redis/Memcached): TTL rozwiązuje część przypadków, ale klucze bez TTL wymagają jawnego czyszczenia.
  • Kolejki zdarzeń (Kafka): retencja tematu ograniczona czasowo, event z PII nie powinien żyć w logu zdarzeń w nieskończoność.
  • Hurtownia danych/BI: pipeline ETL musi honorować to samo żądanie usunięcia, nie tylko system źródłowy.
  • Modele ML: dane treningowe zawierające PII konkretnej osoby to osobny, trudniejszy problem, nie zawsze da się wymazać wpływ na wagi modelu.
  • Procesorzy trzecy: administrator musi powiadomić każdego odbiorcę, któremu dane ujawniono, chyba że jest to niemożliwe lub wymaga niewspółmiernie dużego wysiłku (art. 19).
  1. 1 Weryfikacja tożsamości żądającego Nie usuwaj danych na podstawie samego emaila bez potwierdzenia, że żąda właściwa osoba.
  2. 2 Lokalizacja danych przez ROPA Rejestr czynności przetwarzania (art. 30) wskazuje, gdzie dana kategoria danych w ogóle żyje.
  3. 3 Kaskada do procesorów Powiadomienie procesorów zgodnie z umową powierzenia, art. 28 ust. 3 lit. g: obowiązek usunięcia/zwrotu danych po zakończeniu usługi.
  4. 4 Log samego usunięcia Fakt i czas wykonania żądania trzeba udokumentować, to dowód rozliczalności, nawet po zniknięciu danych źródłowych.
  5. 5 Odpowiedź w terminie Co do zasady miesiąc od żądania (art. 12 ust. 3), przedłużalne o kolejne dwa miesiące przy złożonych lub licznych żądaniach, z uzasadnieniem.
Art. 28 ust. 3 lit. g
Umowa powierzenia przetwarzania musi zobowiązywać procesora do usunięcia lub zwrotu wszystkich danych osobowych po zakończeniu świadczenia usług, chyba że prawo Unii lub państwa członkowskiego nakazuje ich dalsze przechowywanie.

6 · Retencja danych: polityki wymuszane w schemacie i automatyzacji

Zasada ograniczenia przechowywania (art. 5 ust. 1 lit. e) mówi, że dane nie mogą żyć dłużej niż to niezbędne do celu, dla którego są przetwarzane. Wdrożenie tej zasady w kodzie oznacza: retencja to pole w schemacie i zaplanowane zadanie, nie ręczna procedura wykonywana przy okazji.

Art. 5 ust. 1 lit. e
Dane osobowe przechowywane w formie umożliwiającej identyfikację osób przez okres nie dłuższy, niż jest to niezbędne do celów, w których są przetwarzane. Wyjątek: dłuższe przechowywanie dla celów archiwalnych w interesie publicznym, badań naukowych/historycznych lub celów statystycznych, pod warunkiem wdrożenia środków ochronnych z art. 89.
Termin kluczowy
Harmonogram retencji (retention schedule) - Dokument i mechanizm techniczny wiążący każdą kategorię danych z konkretnym, uzasadnionym okresem przechowywania, po którym dane są usuwane lub zanonimizowane automatycznie, bez ręcznej interwencji.
Kategoria danychTypowy okres retencjiPodstawa okresu
Logi uwierzytelniania6-12 miesięcyBezpieczeństwo, wykrywanie nadużyć (art. 6 ust. 1 lit. f)
Zgoda marketingowa (dowód)Czas trwania zgody plus okres przedawnienia roszczeńRozliczalność (art. 5 ust. 2)
Faktury/dokumenty księgowe5-10 lat, zależnie od jurysdykcjiObowiązek prawny, prawo podatkowe
Zgłoszenia supportowe2-3 lata od zamknięcia zgłoszeniaUzasadniony interes, jakość obsługi
Dane sesji/koszyka niezalogowanego użytkownikaDni do tygodniMinimalizacja, brak dalszego celu po sesji
Retencja wymuszona w schemacie: kolumna generowana plus zadanie czyszczące sql
-- Column encodes the legal/business retention deadline directly in the schema,
-- so "when can this be deleted" is a query, not a spreadsheet. Computed from
-- closed_at (not created_at), matching the "retention from ticket closure" policy;
-- stays NULL while the ticket is open, so open tickets are never purged below.
ALTER TABLE support_tickets
  ADD COLUMN retention_until date
  GENERATED ALWAYS AS ((closed_at + INTERVAL '3 years')::date) STORED;

-- Scheduled job (e.g. pg_cron or an external cron calling this daily)
-- purges rows past their retention deadline, including soft-deleted ones.
DELETE FROM support_tickets
WHERE retention_until < CURRENT_DATE;
Pułapka
Soft-delete jako "załatwiony temat": ustawienie deleted_at bez faktycznego usunięcia lub anonimizacji danych po określonym czasie oznacza, że dane wciąż istnieją i wciąż podlegają obowiązkowi retencyjnemu, ukrycie w interfejsie to nie usunięcie w rozumieniu RODO.
  • Kolumna/pole retention_until lub TTL natywny silnika bazy: Redis EXPIRE, DynamoDB TTL, S3 Lifecycle Policy.
  • Zaplanowane zadanie (cron, pg_cron, Celery beat, Cloud Scheduler) uruchamiane cyklicznie, nie gdy ktoś się przypomni.
  • Partycjonowanie tabel po dacie umożliwia tanie usuwanie całej partycji zamiast miliona pojedynczych DELETE.
  • Audyt: log samego procesu czyszczenia (co, kiedy, ile rekordów), do wykazania rozliczalności.
  1. 1 Skategoryzuj dane Każda tabela/kolekcja z PII ma przypisaną kategorię z harmonogramu retencji.
  2. 2 Przypisz okres i podstawę Okres retencji wynika z realnego celu lub przepisu prawa, nie z domysłu.
  3. 3 Zakoduj w schemacie Pole z terminem lub TTL silnika bazy, nie komentarz w dokumentacji, który nikt nie czyta.
  4. 4 Zautomatyzuj usuwanie Zadanie cykliczne, monitorowane jak każdy inny krytyczny cron w systemie.
Kolizja: retencja prawna vs żądanie usunięcia
Gdy przepis (np. prawo podatkowe) wymaga przechowywania danych dłużej niż chciałby klient składający żądanie usunięcia, obowiązek prawny (art. 17 ust. 3 lit. b) ma pierwszeństwo nad żądaniem; dane pozostają, ale powinny zostać ograniczone wyłącznie do celu wynikającego z tego przepisu (art. 18, ograniczenie przetwarzania).

7 · DPIA: ocena skutków dla ochrony danych

★ egzamin

DPIA (Data Protection Impact Assessment, ocena skutków dla ochrony danych) to formalny proces wymagany art. 35 RODO, gdy planowane przetwarzanie może powodować wysokie ryzyko dla praw i wolności osób. Dla inżyniera to bramka w procesie projektowania nowej funkcji, nie dokument tworzony po fakcie.

Art. 35 ust. 1
DPIA obowiązkowa, gdy dany rodzaj przetwarzania, w szczególności z użyciem nowych technologii, ze względu na swój charakter, zakres, kontekst i cele, z dużym prawdopodobieństwem może powodować wysokie ryzyko dla praw lub wolności osób fizycznych.
Art. 35 ust. 3 (przykłady wprost)
Systematyczna, kompleksowa ocena czynników osobowych (profilowanie) ze skutkami prawnymi lub podobnie znaczącymi dla osoby; przetwarzanie na dużą skalę danych szczególnych kategorii (art. 9) lub danych o wyrokach skazujących; systematyczne monitorowanie na dużą skalę miejsc dostępnych publicznie.
  1. 1 Ocena/scoring cech osobowych, np. profil kredytowy, ocena wydajności pracownika.
  2. 2 Zautomatyzowane podejmowanie decyzji ze skutkiem prawnym (art. 22).
  3. 3 Systematyczne monitorowanie, np. monitoring pracowników, śledzenie lokalizacji.
  4. 4 Dane szczególnych kategorii lub dane o wyrokach skazujących na dużą skalę.
  5. 5 Przetwarzanie na dużą skalę: liczba osób, zakres geograficzny, czas trwania.
  6. 6 Łączenie lub porównywanie zbiorów danych z różnych źródeł.
  7. 7 Dane osób w sytuacji szczególnej podatności: dzieci, pracownicy, pacjenci.
  8. 8 Innowacyjne użycie technologii, np. nowy model biometryczny.
  9. 9 Przetwarzanie uniemożliwiające osobie wykonanie prawa lub skorzystanie z usługi/umowy.
WP248 / EDPB
Wytyczne dawnej Grupy Roboczej Art. 29 (WP248, utrzymane przez EDPB) rekomendują: spełnienie dwóch lub więcej z dziewięciu kryteriów zwykle oznacza obowiązek DPIA, spełnienie jednego wymaga dodatkowej analizy przypadku.
Termin kluczowy
DPIA - Proces obejmujący systematyczny opis operacji przetwarzania i ich celów, ocenę niezbędności i proporcjonalności, ocenę ryzyka dla praw i wolności osób oraz środki planowane w celu zaradzenia ryzyku, w tym zabezpieczenia i środki bezpieczeństwa (art. 35 ust. 7).
Pułapka
DPIA jako jednorazowy dokument w archiwum prawnym, nigdy nie aktualizowany, to najczęstszy błąd organizacyjny. DPIA jest żywym dokumentem: istotna zmiana w przetwarzaniu, np. nowe źródło danych, nowy podwykonawca, zmiana algorytmu scoringu, wymaga aktualizacji, nie tylko wzmianki w changelogu.
Lekki heurystyczny check w CI: nowe pole "wrażliwe" wymaga linku do DPIA python
"""Simple heuristic CI check: flags new fields that look like special-category
data (Art. 9) so they get a linked DPIA before merging, not after launch."""
import subprocess

SENSITIVE_MARKERS = ("health_", "biometric_", "genetic_", "religion_", "orientation_")

def new_fields_in_diff(base_ref: str = "origin/main") -> list[str]:
    diff = subprocess.run(
        ["git", "diff", base_ref, "--unified=0", "--", "*/models.py"],
        capture_output=True, text=True, check=True,
    ).stdout
    return [line for line in diff.splitlines() if line.startswith("+") and
            any(marker in line for marker in SENSITIVE_MARKERS)]

if new_fields_in_diff():
    raise SystemExit(
        "New special-category field detected: link a DPIA ticket before merging (Art. 35)."
    )
  1. 1 Opisz przetwarzanie Cel, zakres danych, kategorie osób, odbiorcy, okres przechowywania.
  2. 2 Oceń niezbędność i proporcjonalność Czy cel da się osiągnąć mniejszym zakresem danych lub mniej inwazyjną metodą?
  3. 3 Oceń ryzyko dla osób Prawdopodobieństwo i dotkliwość skutków dla praw i wolności, nie tylko ryzyko biznesowe/reputacyjne administratora.
  4. 4 Zaplanuj środki zaradcze Techniczne: szyfrowanie, pseudonimizacja, kontrola dostępu; organizacyjne: szkolenia, procedury.
  5. 5 Skonsultuj z IOD/DPO Inspektor Ochrony Danych opiniuje DPIA przed wdrożeniem (art. 35 ust. 2).
  6. 6 Konsultacja z organem nadzorczym Jeśli po środkach zaradczych ryzyko rezydualne pozostaje wysokie, wymagana uprzednia konsultacja z organem nadzorczym (art. 36).
UODO (Polska)
Prezes Urzędu Ochrony Danych Osobowych publikuje, zgodnie z art. 35 ust. 4, wykaz rodzajów operacji przetwarzania podlegających obowiązkowi DPIA w Polsce; warto go traktować jako punkt startowy analizy, nie jako listę wyczerpującą wszystkie przypadki.

8 · Anonimizacja, pseudonimizacja i transfery międzynarodowe po Schrems II

★ egzamin

Dwa różne mechanizmy często mylone w praktyce inżynierskiej: anonimizacja wyprowadza dane spod RODO, pseudonimizacja nie. Ta sama pomyłka pojawia się przy transferach danych poza EOG: "zaszyfrowaliśmy więc jest bezpiecznie" nie jest odpowiedzią na pytanie prawne o podstawę transferu.

Termin kluczowy
Anonimizacja - Nieodwracalny proces, po którym dane nie pozwalają, żadnym rozsądnie dostępnym środkiem, zidentyfikować osoby. Motyw 26 RODO: rozporządzenie nie ma zastosowania do informacji anonimowych. Prawdziwa anonimizacja jest technicznie trudna, agregacja czy usunięcie samego imienia zwykle nie wystarcza przy małych zbiorach lub bogatych zestawach cech, ryzyko re-identyfikacji przez powiązanie zbiorów.
Termin kluczowy
Pseudonimizacja (art. 4 pkt 5) - Przetworzenie danych tak, by nie można ich było przypisać konkretnej osobie bez użycia dodatkowych informacji, pod warunkiem że te dodatkowe informacje są przechowywane osobno i zabezpieczone. Dane pozostają danymi osobowymi, dopóki dodatkowa informacja istnieje gdziekolwiek.
EDPB, Wytyczne 01/2025 o pseudonimizacji
EDPB potwierdza wprost: dane pseudonimizowane, które można powiązać z osobą przy użyciu dodatkowej informacji, pozostają informacją o osobie możliwej do zidentyfikowania i dalej podlegają RODO w całości, pseudonimizacja obniża ryzyko i bywa wymienionym w art. 25 i art. 32 środkiem bezpieczeństwa, ale nie jest furtką wyjścia poza rozporządzenie.
Pułapka
"Zahashowaliśmy emaila, więc dane są zanonimizowane" to jeden z najczęstszych błędów: prosty hash bez sekretu jest odwracalny przez atak słownikowy lub tęczowe tablice, zwłaszcza dla danych o niskiej entropii jak adres email. To wciąż pseudonimizacja, i to często słaba, nigdy anonimizacja.
Naiwna pseudonimizacja (hash) kontra poprawna (HMAC z sekretem) python
import hashlib
import hmac
import os

def naive_pseudonymize(email: str) -> str:
    # WRONG: a plain hash of a low-entropy value (email) is reversible via
    # a rainbow table or simple dictionary attack. Still personal data,
    # and easily re-identifiable by anyone, not just the controller.
    return hashlib.sha256(email.encode()).hexdigest()

SECRET_KEY = os.environ["PSEUDONYMIZATION_KEY"].encode()

def proper_pseudonymize(email: str) -> str:
    # Correct: HMAC with a server-side secret kept separate from the output.
    # Re-identification requires the secret key (Art. 4(5) "additional information
    # kept separately"), which is what makes this pseudonymization, not encryption
    # or anonymization, and why the result is STILL personal data under GDPR.
    return hmac.new(SECRET_KEY, email.encode(), hashlib.sha256).hexdigest()
Schrems II, TSUE C-311/18 (2020)
Trybunał unieważnił Privacy Shield jako mechanizm transferu danych UE-USA, uznając, że amerykańskie prawo nadzoru, m.in. FISA 702, nie zapewnia poziomu ochrony zasadniczo równoważnego unijnemu. Utrzymał ważność standardowych klauzul umownych (SCC), ale nałożył na strony obowiązek weryfikacji, czy w konkretnym przypadku transferu SCC faktycznie zapewniają skuteczną ochronę, tzw. transfer impact assessment.
Mechanizm transferu (rozdz. V RODO)PodstawaUwaga praktyczna
Decyzja o adekwatności (art. 45)Komisja Europejska uznaje kraj/organizację za zapewniające adekwatny poziom ochronyLista obejmuje m.in. Wielką Brytanię (odnowiona grudzień 2025), Japonię, Koreę Płd., Brazylię (od stycznia 2026), USA wyłącznie dla podmiotów certyfikowanych w Data Privacy Framework
Standardowe klauzule umowne, SCC (art. 46)Wzorzec klauzul z 2021 r., moduły kontroler-kontroler, kontroler-procesor itd.Wymaga transfer impact assessment po Schrems II, czasem środków dodatkowych: szyfrowanie end-to-end, minimalizacja zakresu transferu
Wiążące reguły korporacyjne, BCR (art. 47)Wewnątrzgrupowa polityka zatwierdzona przez organ nadzorczyKosztowne i czasochłonne wdrożenie, sensowne dla dużych grup kapitałowych z regularnymi transferami wewnętrznymi
EU-US Data Privacy Framework, stan na 2026
DPF (od lipca 2023) jest obecnie kwestionowany nowym wyzwaniem prawnym zgłoszonym przez noyb/Maxa Schremsa, tzw. Schrems III, dotyczącym niezależności nadzoru nad transferami po decyzji amerykańskiego Sądu Najwyższego w sprawie Trump v. Slaughter. Decyzja o adekwatności DPF pozostaje formalnie w mocy do czasu ewentualnego uchylenia przez Komisję lub wyroku TSUE, ale kierunek ryzyka warty jest monitorowania przy projektowaniu nowych integracji z dostawcami amerykańskimi.
  1. 1 Zmapuj przepływy danych poza EOG Który procesor/subprocesor fizycznie przetwarza dane poza Europejskim Obszarem Gospodarczym?
  2. 2 Zweryfikuj mechanizm transferu Adekwatność, SCC czy BCR, i czy dokumentacja jest aktualna.
  3. 3 Przeprowadź transfer impact assessment Ocena prawa i praktyki kraju odbiorcy pod kątem dostępu władz publicznych do danych.
  4. 4 Wdróż środki dodatkowe, jeśli potrzebne Szyfrowanie z kluczem niedostępnym dla odbiorcy, pseudonimizacja przed transferem, minimalizacja zakresu.
Digital Omnibus, projekt listopad 2025
Pakiet obejmuje też propozycje dotyczące zarządzania zgodą na cookies w ramach RODO oraz wyższe progi i dłuższe terminy zgłaszania naruszeń ochrony danych; stan na dziś to projekt w toku procesu legislacyjnego, realistyczny scenariusz przyjęcia nie wcześniej niż druga połowa 2026, możliwe że 2027, nie wdrażaj tych zmian jako obowiązujące, dopóki nie wejdą w życie.
Fiszki - aktywne przypominanie

Sprawdź się - testowanie to nauka

24 pytań w losowej kolejności. Twoje wyniki zapisują się lokalnie.

Rozpocznij quiz
Zbudowane przez Tenzan Logic