← Blog
tutorials

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ť.

Ryveris Team ·
GDPR pre softvérových vývojárov | Čo skutočne potrebujete implementovať

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:

  1. Zbierajte len to, čo potrebujete. Neukladajte dáta “pre istotu.”
  2. Povedzte používateľom, čo robíte s ich údajmi. A získajte ich povolenie, keď je to vyžadované.
  3. Umožnite používateľom pristupovať k ich dátam, exportovať ich a vymazať. Potrebujete na to API endpointy.
  4. Udržiavajte dáta v bezpečí. Šifrovanie, kontrola prístupu, auditné záznamy.
  5. Hlásenie incidentov rýchlo. Máte 72 hodín na oznámenie orgánom po zistení úniku dát.
  6. 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:

  1. Majú DPA? Zmluva o spracovaní údajov je povinná. Väčšina SaaS poskytovateľov ich zverejňuje verejne.
  2. Kde ukladajú dáta? Ak mimo EÚ, overte právny základ prenosu.
  3. K akým dátam majú prístup? Minimalizujte, čo odosielate. Ak služba potrebuje len e-mail, neposielajte celý profil.
  4. Môžete vymazať dáta z ich systémov? Žiadosti o vymazanie používateľov sa musia šíriť všade.
  5. 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átNavrhované uchovávanieDôvod
Údaje používateľského účtuDo vyžiadania vymazaniaPotrebné pre službu
Session logy90 dníBezpečnosť a ladenie
Logy aktivity používateľov1 až 2 rokyProduktová analytika
Tikety podpory3 rokyKvalita služby
Finančné záznamy7 rokovDaňové/právne povinnosti
Tokeny na reset hesla24 hodínBezpečnosť
Neúspešné pokusy o prihlásenie90 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Ú.

GDPRprivacysecuritycomplianceEuropedata protection

Poďme postaviť váš ďalší projekt.

Rezervujte si bezplatný 30-minútový hovor. Preberieme vaše ciele, časový plán a najlepší postup. Bez záväzkov.

Rezervovať úvodný hovor hello@ryveris.com