GDPR pre softvérových vývojárov | Čo skutočne potrebujete implementovať
Sprievodca GDPR zameraný na vývojárov. Pokrýva technické požiadavky, vzory spracovania dát a rozhodnutia na úrovni kódu, ktoré musíte urobiť.
GDPR je v platnosti od roku 2018, ale väčšina sprievodcov pre vývojárov sa stále zameriava na právnu teóriu. Tento sprievodca je iný. Pokrýva technické požiadavky, kód, ktorý musíte napísať, a architektonické rozhodnutia, ktoré robia súlad praktickým namiesto bolestivým.
Ak váš softvér ukladá, spracováva alebo sa dotýka osobných údajov ľudí v EÚ, toto sa vás týka. Nezáleží na tom, kde sídli vaša spoločnosť.
Prehľad GDPR pre vývojárov
Preskočte 99 článkov. Tu je, čo GDPR znamená pre váš kód:
- Zbierajte len to, čo potrebujete. Neukladajte dáta “pre istotu.”
- Povedzte používateľom, čo robíte s ich údajmi. A získajte ich povolenie, keď je to vyžadované.
- Umožnite používateľom pristupovať k ich dátam, exportovať ich a vymazať. Potrebujete na to API endpointy.
- Udržiavajte dáta v bezpečí. Šifrovanie, kontrola prístupu, auditné záznamy.
- Hlásenie incidentov rýchlo. Máte 72 hodín na oznámenie orgánom po zistení úniku dát.
- Dokumentujte všetko. Vaše spracovateľské aktivity, bezpečnostné opatrenia, toky dát.
To je praktický súhrn. Zvyšok tohto sprievodcu ukazuje, ako implementovať každú požiadavku.
7 kľúčových technických požiadaviek
1. Správa súhlasov
Súhlas musí byť slobodne udelený, konkrétny, informovaný a jednoznačný. Predoznačené zaškrtávacie políčka sa nepočítajú. Hromadný súhlas (“súhlasím so všetkým”) sa nepočíta. Odvolanie musí byť rovnako jednoduché ako udelenie súhlasu.
Čo vybudovať
Systém súhlasov potrebuje tri komponenty:
- Úložisko záznamov o súhlase. Pre každého používateľa sledujte, s čím súhlasil, kedy a ako.
- Mechanizmus overenia súhlasu. Pred spracovaním dát na konkrétny účel overte, či má používateľ aktívny súhlas.
- Mechanizmus odvolania. Umožnite používateľom odvolať súhlas cez vaše rozhranie a okamžite zastavte spracovanie.
Databázová schéma
CREATE TABLE user_consents (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES users(id),
consent_type VARCHAR(100) NOT NULL,
granted BOOLEAN NOT NULL,
granted_at TIMESTAMPTZ,
revoked_at TIMESTAMPTZ,
ip_address INET,
user_agent TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_user_consents_lookup
ON user_consents (user_id, consent_type, granted);
Ukladajte celú históriu. Nikdy nemažte ani neprepisujte záznamy o súhlase. Keď používateľ odvolá súhlas, vložte nový riadok s granted = false a nastavte revoked_at. Toto vám dáva auditný záznam.
Middleware na overenie súhlasu
Tu je Express middleware, ktorý overí súhlas pred spracovaním požiadavky:
import { Request, Response, NextFunction } from "express";
import { db } from "./database";
interface ConsentRequirement {
type: string;
required: boolean;
}
function requireConsent(consentType: string) {
return async (req: Request, res: Response, next: NextFunction) => {
const userId = req.user?.id;
if (!userId) {
return res.status(401).json({ error: "Authentication required" });
}
const consent = await db.query(
`SELECT granted FROM user_consents
WHERE user_id = $1 AND consent_type = $2
ORDER BY created_at DESC
LIMIT 1`,
[userId, consentType]
);
if (!consent.rows[0]?.granted) {
return res.status(403).json({
error: "Consent required",
consentType,
message: `You must grant "${consentType}" consent to use this feature.`,
consentUrl: `/settings/privacy`,
});
}
next();
};
}
// Usage
app.post(
"/api/newsletter/subscribe",
requireConsent("marketing_emails"),
subscribeHandler
);
app.post(
"/api/analytics/track",
requireConsent("usage_analytics"),
trackHandler
);
2. Prístup k dátam a export (Právo na prístup)
Používatelia majú právo požiadať o kópiu všetkých osobných údajov, ktoré o nich uchovávate. Musíte ich poskytnúť v bežne používanom, strojovo čitateľnom formáte. JSON alebo CSV je v poriadku.
Čo vybudovať
Endpoint, ktorý zhromaždí všetky osobné údaje pre používateľa naprieč každou tabuľkou a službou, a potom ich zabalí do stiahnuteľného súboru.
interface DataExport {
exportedAt: string;
user: {
profile: Record<string, unknown>;
activity: Record<string, unknown>[];
consents: Record<string, unknown>[];
communications: Record<string, unknown>[];
};
}
app.get("/api/me/data-export", authenticate, async (req, res) => {
const userId = req.user.id;
const [profile, activity, consents, communications] = await Promise.all([
db.query("SELECT id, email, name, created_at FROM users WHERE id = $1", [
userId,
]),
db.query(
"SELECT action, metadata, created_at FROM user_activity WHERE user_id = $1 ORDER BY created_at DESC",
[userId]
),
db.query(
"SELECT consent_type, granted, granted_at, revoked_at FROM user_consents WHERE user_id = $1 ORDER BY created_at DESC",
[userId]
),
db.query(
"SELECT type, sent_at, subject FROM communications WHERE user_id = $1 ORDER BY sent_at DESC",
[userId]
),
]);
const exportData: DataExport = {
exportedAt: new Date().toISOString(),
user: {
profile: profile.rows[0],
activity: activity.rows,
consents: consents.rows,
communications: communications.rows,
},
};
res.setHeader("Content-Type", "application/json");
res.setHeader(
"Content-Disposition",
`attachment; filename="data-export-${userId}.json"`
);
res.json(exportData);
});
Tento endpoint musí pokrývať každú tabuľku obsahujúcu údaje používateľov. Dôkladne auditujte svoju schému. Chýbajúca tabuľka znamená neúplný export, čo je zlyhanie súladu.
3. Právo na vymazanie (Právo byť zabudnutý)
Používatelia môžu požiadať o vymazanie všetkých ich osobných údajov. Musíte vyhovieť, pokiaľ nemáte zákonnú povinnosť ich uchovávať (ako daňové záznamy alebo prevencia podvodov).
Čo vybudovať
Endpoint na vymazanie, ktorý odstráni alebo anonymizuje údaje používateľa naprieč všetkými tabuľkami. Toto je ťažšie, než to znie, kvôli cudzím kľúčom a dátam, od ktorých závisia iné systémy.
app.delete("/api/me/account", authenticate, async (req, res) => {
const userId = req.user.id;
const client = await db.getClient();
try {
await client.query("BEGIN");
// Anonymize data that must be retained for business records
await client.query(
`UPDATE orders
SET customer_name = 'deleted', customer_email = 'deleted'
WHERE user_id = $1`,
[userId]
);
// Delete data that can be fully removed
await client.query("DELETE FROM user_activity WHERE user_id = $1", [
userId,
]);
await client.query("DELETE FROM user_consents WHERE user_id = $1", [
userId,
]);
await client.query("DELETE FROM communications WHERE user_id = $1", [
userId,
]);
await client.query("DELETE FROM sessions WHERE user_id = $1", [userId]);
// Anonymize the user record instead of deleting
// This preserves referential integrity
await client.query(
`UPDATE users SET
email = 'deleted-' || id || '@removed.invalid',
name = 'Deleted User',
phone = NULL,
address = NULL,
deleted_at = NOW()
WHERE id = $1`,
[userId]
);
await client.query("COMMIT");
// Trigger deletion in external systems
await Promise.allSettled([
emailService.deleteSubscriber(userId),
analyticsService.deleteUser(userId),
searchIndex.removeUser(userId),
]);
res.json({ message: "Account and personal data deleted" });
} catch (error) {
await client.query("ROLLBACK");
throw error;
} finally {
client.release();
}
});
Kľúčové rozhodnutia:
- Vymazať vs. anonymizovať. Záznamy potrebné pre účtovníctvo (objednávky, faktúry) by sa mali anonymizovať. Všetko ostatné vymažte.
- Externé systémy. Dáta odoslané službám tretích strán sa musia vymazať aj tam.
- Načasovanie. GDPR hovorí “bez zbytočného odkladu.” Dokončite vymazanie do 30 dní. Pre väčšinu systémov to robte okamžite.
4. Minimalizácia dát
Zbierajte a ukladajte len dáta, ktoré skutočne potrebujete na stanovený účel. Ak pýtate telefónne číslo, ale používateľom nikdy nevoláte, nemali by ste ho zbierať.
Praktické pravidlá
- Auditujte každé pole formulára. Pre každé pole sa opýtajte: “Ktorá konkrétna funkcia sa pokazí, ak ho odstránime?” Ak je odpoveď žiadna, odstráňte ho.
- Nastavte doby uchovávania. Neuchovávajte dáta navždy. Definujte, ako dlho je každý typ dát potrebný, a potom ich automaticky vymažte.
- Minimalizujte logovanie. Odstraňte osobné údaje zo záznamov v logoch. Logujte ID používateľov, nie mená alebo e-maily.
-- Automatic data retention with PostgreSQL
-- Run this as a scheduled job (e.g., pg_cron)
DELETE FROM user_activity
WHERE created_at < NOW() - INTERVAL '2 years';
DELETE FROM session_logs
WHERE created_at < NOW() - INTERVAL '90 days';
DELETE FROM password_reset_tokens
WHERE created_at < NOW() - INTERVAL '24 hours';
5. Šifrovanie
GDPR vyžaduje “primerané technické opatrenia” na ochranu osobných údajov. Šifrovanie je najdôležitejšie.
V pokoji
- Šifrujte disk databázy. Všetci hlavní poskytovatelia cloudu to podporujú. Zapnite to a overte.
- Pre vysoko citlivé polia (rodné čísla, zdravotné údaje) pridajte šifrovanie na úrovni aplikácie.
- Šifrujte zálohy. Nešifrovaná záloha je incident čakajúci na príležitosť.
Pri prenose
- TLS všade. Každé spojenie medzi službami, databázami a používateľmi. Bez výnimiek.
- Vynúťte HTTPS. Presmerujte HTTP. Nastavte HSTS hlavičky.
- Používajte TLS pre databázové pripojenia. PostgreSQL to natívne podporuje.
// PostgreSQL connection with TLS
import { Pool } from "pg";
const pool = new Pool({
host: process.env.DB_HOST,
port: 5432,
database: process.env.DB_NAME,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
ssl: {
rejectUnauthorized: true,
ca: fs.readFileSync("/path/to/server-ca.pem").toString(),
},
});
6. Oznámenie o úniku dát
Ak sú osobné údaje kompromitované, musíte informovať príslušný úrad na ochranu údajov do 72 hodín. Ak únik predstavuje vysoké riziko pre jednotlivcov, musíte informovať aj dotknutých používateľov.
Čo vybudovať
- Auditné logovanie. Sledujte každý prístup k osobným údajom. Kto pristupoval, kedy a odkiaľ.
- Detekcia anomálií. Upozornite na nezvyčajné prístupové vzory (hromadné exporty dát, prístup z nových IP, prístup mimo pracovných hodín).
- Plán reakcie na incidenty. Zdokumentujte, kto čo robí, keď sa zistí únik. Toto nie je kód. Je to kontrolný zoznam, ktorý váš tím precvičuje.
CREATE TABLE data_access_log (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL,
accessed_by UUID NOT NULL,
access_type VARCHAR(50) NOT NULL,
resource_type VARCHAR(100) NOT NULL,
resource_id UUID,
ip_address INET,
user_agent TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_data_access_log_user
ON data_access_log (user_id, created_at);
CREATE INDEX idx_data_access_log_accessor
ON data_access_log (accessed_by, created_at);
7. Privacy by Design
GDPR hovorí, že ochrana súkromia by mala byť zabudovaná do systémov od začiatku, nie pripevnená dodatočne. V praxi to znamená, že súkromie je predvolené nastavenie.
- Predvolene súkromné. Nové funkcie by mali zbierať minimálne dáta a vyžadovať opt-in pre čokoľvek nad rámec základnej funkcie.
- Nastavenia predvolené na najsúkromnejšiu možnosť. Používatelia, ktorí sa nikdy nedotknú svojich nastavení, by mali mať najvyššiu ochranu súkromia.
- Oddeľte záujmy. Nemiešajte analytické dáta s funkčnými dátami. Nepoužívajte opakovane autentifikačné tokeny na sledovanie.
Anonymizácia vs. pseudonymizácia
Toto nie je to isté a rozdiel je dôležitý.
- Pseudonymizácia nahradzuje identifikačné informácie reverzibilným tokenom. Príklad: hashovanie e-mailových adries. Ak máte hashovaciu funkciu a pôvodný e-mail, dokážete osobu opätovne identifikovať. GDPR sa stále vzťahuje, pretože opätovná identifikácia je možná.
- Anonymizácia odstraňuje identifikačné informácie trvalo. Príklad: agregovaná analytika (“1 247 používateľov navštívilo cenovú stránku”) bez možnosti identifikovať, ktorí používatelia. GDPR sa nevzťahuje na skutočne anonymizované dáta.
Skutočná anonymizácia je ťažká. Ak váš “anonymný” dataset obsahuje časovú pečiatku, mesto a typ zariadenia, táto kombinácia môže jedinečne identifikovať niekoho. Buďte konzervatívni.
Súhlas s cookies
Ak vaša webová stránka používa cookies nad rámec toho, čo je striktne nevyhnutné, potrebujete súhlas pred ich nastavením.
Vyžaduje súhlas: analytické cookies, reklamné pixely, widgety sociálnych sietí, akýkoľvek sledovací skript tretej strany.
Nevyžaduje súhlas: session cookies, cookies nákupného košíka, CSRF tokeny, samotný cookie na uloženie preferencie súhlasu.
Váš banner na súhlas by mal blokovať neesenciálne cookies, kým nie je udelený súhlas, ponúkať granulárne voľby a urobiť “odmietnuť všetko” rovnako jednoduché ako “prijať všetko.” Nebudujte to od nuly. Nástroje ako Cookiebot zvládajú zložitosť. Kľúčové pravidlo: žiadne sledovacie skripty sa nespúšťajú pred udelením súhlasu.
Spracovatelia dát tretích strán
Každá služba tretej strany spracovávajúca údaje vašich používateľov je podľa GDPR “spracovateľ dát.” Vy ste zodpovední za ich súlad.
Čo overiť
Pred integráciou akejkoľvek služby tretej strany, ktorá sa dotýka osobných údajov:
- Majú DPA? Zmluva o spracovaní údajov je povinná. Väčšina SaaS poskytovateľov ich zverejňuje verejne.
- Kde ukladajú dáta? Ak mimo EÚ, overte právny základ prenosu.
- K akým dátam majú prístup? Minimalizujte, čo odosielate. Ak služba potrebuje len e-mail, neposielajte celý profil.
- Môžete vymazať dáta z ich systémov? Žiadosti o vymazanie používateľov sa musia šíriť všade.
- Ako zvládajú úniky dát? Ich DPA by mala špecifikovať termíny oznamovania.
Bežní spracovatelia tretích strán na preskúmanie
- E-mailové služby (Resend, SendGrid, Mailchimp)
- Analytika (Google Analytics, Mixpanel, Amplitude)
- Sledovanie chýb (Sentry, Bugsnag)
- Spracovanie platieb (Stripe, Adyen)
- Cloud hosting (AWS, Google Cloud, Vercel)
- Nástroje zákazníckej podpory (Intercom, Zendesk)
- AI API (OpenAI, Anthropic, Google AI)
Udržiavajte zoznam všetkých spracovateľov. Kontrolujte ho štvrťročne.
Politiky uchovávania dát
Neuchovávajte osobné údaje dlhšie, ako je potrebné. Definujte doby uchovávania pre každý typ dát.
| Typ dát | Navrhované uchovávanie | Dôvod |
|---|---|---|
| Údaje používateľského účtu | Do vyžiadania vymazania | Potrebné pre službu |
| Session logy | 90 dní | Bezpečnosť a ladenie |
| Logy aktivity používateľov | 1 až 2 roky | Produktová analytika |
| Tikety podpory | 3 roky | Kvalita služby |
| Finančné záznamy | 7 rokov | Daňové/právne povinnosti |
| Tokeny na reset hesla | 24 hodín | Bezpečnosť |
| Neúspešné pokusy o prihlásenie | 90 dní | Bezpečnostný monitoring |
Implementujte automatizované úlohy čistenia. Nespoliehajte sa na to, že si niekto zapamätá spustiť skript.
GDPR kontrolný zoznam pre vývojárov
Použite toto ako východiskový bod pri budovaní alebo auditovaní systému.
Zber dát
- Každé pole formulára má stanovený účel
- Nezbierajú sa žiadne zbytočné dáta
- Politika ochrany osobných údajov je prelinkovaná z každého bodu zberu dát
- Súhlas je zozbieraný pred spracovaním (kde je to vyžadované)
- Záznamy o súhlase sú uložené s časovými pečiatkami
Ukladanie dát
- Šifrovanie databázy v pokoji je zapnuté
- TLS je vynútené pre všetky pripojenia
- Citlivé polia majú šifrovanie na úrovni aplikácie
- Zálohy sú šifrované
- Prístup k produkčným dátam je obmedzený a logovaný
Práva používateľov
- Endpoint na export dát existuje a pokrýva všetky tabuľky
- Endpoint na vymazanie účtu existuje a zvláda všetky dáta
- Používatelia si môžu zobraziť a odvolať súhlas vo svojich nastaveniach
- Vymazanie sa propaguje do služieb tretích strán
- Všetky žiadosti o práva používateľov sú zodpovedané do 30 dní
Cookies a sledovanie
- Banner na súhlas s cookies je implementovaný
- Neesenciálne cookies sú blokované pred súhlasom
- Voľby súhlasu sú granulárne (nie všetko-alebo-nič)
- “Odmietnuť všetko” je rovnako výrazné ako “Prijať všetko”
Tretie strany
- Všetci spracovatelia dát sú zdokumentovaní
- DPA sú podpísané s každým spracovateľom
- Dáta odosielané tretím stranám sú minimalizované
- Vymazanie dát od tretích strán je možné
Bezpečnosť
- Auditné logy sledujú prístup k osobným údajom
- Upozornenia na anomálie sú nakonfigurované
- Plán reakcie na incidenty je zdokumentovaný
- Proces oznamovania úniku dát je definovaný (72-hodinový termín)
Uchovávanie
- Doby uchovávania sú definované pre všetky typy dát
- Automatizované úlohy čistenia sú naplánované
- Expirované dáta sa skutočne mažú (overte to)
Záverečné myšlienky
Súlad s GDPR nie je jednorazový projekt. Je to sada praktík vpletených do toho, ako budujete softvér. Technická práca je priamočiara: úložisko súhlasov, export dát, endpointy na vymazanie, šifrovanie, auditné logovanie. Štandardné inžinierstvo.
Ťažká časť je byť dôkladný. Je jednoduché zabudnúť na ten log súbor, tú analytickú udalosť alebo tú integráciu tretej strany ukladajúcu e-maily používateľov. Pravidelne auditujte. Testujte svoj endpoint na vymazanie. Overte, že vaše exporty sú úplné. Zabudujte ochranu súkromia do svojho procesu od začiatku.
Potrebujete pomoc s budovaním softvéru v súlade s GDPR alebo auditovaním vašich existujúcich systémov? Ozvite sa nám. Budujeme aplikácie s dôrazom na súkromie pre európske firmy a spoločnosti obsluhujúce používateľov z EÚ.