GDPR izstradatajiem | Kas jums patiesi ir jaievies
Izstradatajiem orientets celvedis par GDPR atbilstibu. Aptver tehniskas prasibas, datu apstrades modellus un koda limena lemumus, kas jums jasperiemm.
GDPR ir speka kopss 2018. gada, bet lielaka dala izstradataju celvezu joprojam koncentreejas uz juridisko teoriju. Sis celvedis ir citads. Tas aptver tehniskas prasibas, kodu, kas jums jarakstaa, un arhitekturas lemumus, kas padara atbilstibu praktisku, nevis sapeju.
Ja jusu programmatura glaba, apstrada vai pieskaras ES cilveku personas datiem, tas attiecas uz jums. Nav nozmes, kur atrodas jusu uznemums.
GDPR parskats izstradatajiem
Izlaidiet 99 pantus. Luk, ko GDPR nozime jusu koda bazei:
- Veaciet tikai to, kas nepieciesams. Neglabajiet datus “katram gadijumam.”
- Pastaastiet lietotajiem, ko darat ar vinu datiem. Un sanemiet vinu atlauuju, kad nepieciesams.
- Lauujiet lietotajiem piekluut, eksportet un dzest savus datus. Jums ir vajadzigi API galapunkti tam.
- Uzturiet datu drosibu. Sifrresana, pieejas kontroles, audita zurnaali.
- Zinojiet par parkapumiem atri. Jums ir 72 stundas, lai pazinotu iestades pec parkaapuma atklasanas.
- Dokumenteejiet visu. Jusu apstrades darbibas, jusu drosiibas pasaakumus, jusu datu plusmas.
Tas ir praktiskais kopsavilkums. Parejs sis celvedis parada, ka ieviest katru prasiibu.
7 galvenas tehniskas prasibas
1. Piiekrisanas parvaldiba
Piiekrisanai jabut brivi sniegtai, specifiskai, informetai un nepaarprotamai. Iepriekss atzimetas ailes nav deriigas. Apvienota piekkrisana (“piektistt visam”) nav deriiga. Atsaauuksanai jabut tikpat vieglai ka pieekrisanas sniegsanai.
Ko buvet
Pieekrisanas sistemai ir nepieciesami triss komponenti:
- Piiekrisanas ierakstu glabaatuve. Katram lietotajam izsekojiet, kam vins piekrita, kad un ka.
- Piiekrisanas parbaudes mehanisms. Pirms datu apstrades noteektam merkim parrbaudiet, vai lietotajam ir aktiva piiekrisana.
- Atsaaukssanas mehanisms. Lauujiet lietotajiem atsaukt piiekrisanu caur jusu saskarni un nekavejoties priekstat apstrradi.
Datu bazes shema
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);
Glabajiet pilnu vesturi. Nekad nedzessiet un neparrakstiet piiekrisanas ierakstus. Kad lietotajs atsauc piiekrisanu, ievietojiet jaunu rindu ar granted = false un iestatiet revoked_at. Tas sniedz audita taku.
Piiekrisanas parbaudes starpslaanis
Luk, Express starpslaanis, kas paarbauda piiekrisanu pirms pieprasijuma apstrades:
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. Datu piiekluuve un eksports (piiekluuves tiesibas)
Lietotajiem ir tiesibas pieprasit visu personas datu kopiju, ko jus par viniem glabaajat. Jums tie jasniedz plaasi lietota, massinlasama formata. JSON vai CSV deriis lieliski.
Ko buvet
Galapunktu, kas sapulce visus personas datus par lietotaju no katras tabulas un pakalpojuma, pec tam iepako tos lejuppieladejama faila.
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);
});
Sim galapunktam jaaptver katra tabula, kas satur lietotaja datus. Rupigi parrbaudiet savu shemu. Trukstosa tabula nozime nepilnigu eksportu, kas ir atbilstibas paarkkaaapums.
3. Tiesibas uz dzessanu (tiesibas but aizmirstam)
Lietotaji var pieprasit, lai jus dzessetu visus vinu personas datus. Jums ir jaatbilst, ja vien jums nav juridiska pienakuma tos saglabat (piemeram, nodoklu ieraksti vai krasanas noversana).
Ko buvet
Dzessanas galapunktu, kas nonem vai anonimize lietotaja datus visas tabulas. Tas ir grutaak neka izskattas arpuss atslegu ierobezojumu un datu del, no kuriem ir atkariigas citas sistemas.
app.delete("/api/me/account", authenticate, async (req, res) => {
const userId = req.user.id;
const client = await db.getClient();
try {
await client.query("BEGIN");
// Anonimizet datus, kas jasaglaba biznesa ierakstiem
await client.query(
`UPDATE orders
SET customer_name = 'deleted', customer_email = 'deleted'
WHERE user_id = $1`,
[userId]
);
// Dzest datus, ko var pilniba nonemt
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]);
// Anonimizet lietotaja ierakstu, nevis dzest
// Tas saglaba atsaucu integritati
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");
// Aktivizet dzesanu arejjas sistemas
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();
}
});
Galvenie lemumi:
- Dzest vs. anonimizet. Ieraksti, kas vajadzigi gramatvedibai (pasutijumi, reekini), jabut anonimizeti. Dzesiet visu pareejo.
- Arejas sistemas. Dati, kas nosutiti tresa puses pakalpojumiem, ir jadzees ari tur.
- Laiks. GDPR saka “bez nepamatotas kavesanas.” Pabeidziet dzesanu 30 dienu laika. Lielkajai dalai sistemu dariet to nekavejoties.
4. Datu minimizzacija
Vapaciet un glabajiet tikai tos datus, kas jums patiesi ir nepieciessami noteiktam merkkim. Ja jus jautajat talruna numuru, bet nekad nezvanat lietotajiem, jums to nevajadzetu vakt.
Praktiskas regulas
- Parrbaudiet katru veidlapas lauku. Katram laukam jautaajiet: “Kaada konkreta funkcija sabojaajas, ja mes to nonemsim?” Ja atbilde ir nekaada, nonemiet to.
- Iestatiet saglaabasanas periodus. Neglabajiet datus muzigi. Definejiet, cik ilgi katrs datu tips ir vajadzigs, un tad automatiski dzesiet.
- Minimizzejiet registresanu. Nonemiet personas datus no zurnala ierakstiem. Registrejiet lietotaaju ID, nevis vardus vai e-pastus.
-- Automatiska datu saglabsana ar PostgreSQL
-- Palaist ka ieplnotu uzdevumu (piem., 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. Sifrresana
GDPR prasa “atbilstosus tehniskus pasaakumus” personas datu aizsardzibai. Sifresana ir vissvarigaka.
Miera stavokli
- Sifrejiet datu bazes disku. Visi lielaakie maakonu pakalpojumu sniedzeji to atbalsta. Ieslegiet un parbaudiet.
- Loti jutigiem laukiem (personu kodi, veselibas dati) pievienojiet lietojumprogrammas limena sifrreesanu papildus.
- Sifrejiet rezerves kopijas. Nesifreetaa rezerves kopija ir gaidoss parkaapums.
Transita
- TLS visur. Katrs savienojums starp pakalpojumiem, datu bazem un lietotajiem. Bez iznemumiem.
- Piespiediet HTTPS. Novirziet HTTP. Iestatiet HSTS galvenes.
- Izmantojiet TLS datu bazes savienojumiem. PostgreSQL to atbalsta nativi.
// PostgreSQL savienojums ar 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. Parkapuma pazinojums
Ja personas dati ir kompromiteti, jums ir japazino attiieciga Datu aizsardzibas iestade 72 stundu laika. Ja parkapums rada augstu risku personam, jums ir japazino ari skarttie lietotaji.
Ko buvet
- Audita registresana. Izsekojiet katru pieeju personas datiem. Kas pieklluva, kad un no kurienes.
- Anomaliju atklasana. Brdiniet par neparastiem pieejas modelieem (lielapjoma datu eksporti, pieeja no jaunam IP adresem, pieeja arpus darba laika).
- Incidentu reagesanas plans. Dokumentejiet, kas ko dara, kad tiek atklats parkapums. Tas nav kods. Ta ir kontrolsaraksts, ko jusu komanda ietrenee.
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. Privatums pec noklusejuma
GDPR noteic, ka privatumam jabut iebuveetam sistemas no sakuma, nevis pieskruvetam pec tam. Prakse tas nozime padarit privatumu par noklusejumu.
- Noklusejums ir privats. Jaunam funkcijam jabut minimaalai datu vapacksanai un japrasa pieteekssanas visam, kas parsnieedz pamatfunkciju.
- Iestatijumi nokluseti uz vispriivaatako opciju. Lietotajiem, kas nekad nepieskaras saviem iestatijumiem, jabut vislielaakajai privatuma aizsardzibai.
- Nodaliet jautajumus. Nejauciet analitikas datus ar funkcionaalajiem datiem. Neizmantojiet autentifikaciijas tokenus izsekosanai.
Anonimizacija vs. pseidonimizacija
Tie nav viens un tas pats, un atskiribai ir nozime.
- Pseidonimizacija aizstaj identificejosu informaciju ar atgriezenisku tokenu. Piemers: e-pasta adresu hesessana. Ja jums ir hess funkcija un sakotnejais e-pasts, jus varat atkal identificet personu. GDPR joprojam attiecas, jo atkalidentifiikacija ir iespejama.
- Anonimizacija neatgriezeniski nonem identificejosu informaciju. Piemers: apkopotaa analitika (“1 247 lietotaji apmekleeja cenradza lapu”) bez iespejas identificet, kuri lietotaji. GDPR neattiecas uz patiesi anonimizeetiem datiem.
Patiesa anonimizacija ir gruta. Ja jusu “anonimaja” datu kopa ietver laika zimoogu, pilsetu un ierrices tipu, si kombinacija var unikali identificet kadu. Esiet konservatiivi.
Sikdatnu piekrissana
Ja jusu vietne izmanto sikdatnes arpus strikti nepieciiesamajam, jums ir vajadziga pieekrisana pirms to iestatisanas.
Prasa pieekrisanu: analitikas sikdatnes, reklaamas pikseli, socialo mediju logriki, jebkurs tresa puses izsekosanas skripts.
Neprasa piiekrisanu: sesijas sikdatnes, iepirksanas groza sikdatnes, CSRF tokeni, pati sikdatnu pieekrisanas preferensu sikdatne.
Jusu piiekrisanas bannerim jabbblooke nebuttiskas sikdatnes, liidz pieekrisana ir sniegta, japiedava detalizetas izveles un “noraidit visas” japadara tikpat vienkaarsi ka “piienemmt visas.” Nebuuuvejiet to no nulles. Riki ka Cookiebot apstrada sarezggitibu. Galvenais noteikums: neviens izsekosanas skripts nedarbojas pirms pieekrisanas sniegsanas.
Tresa puses datu apstraddtaaji
Katrs tresa puses pakalpojums, kas apstrada jusu lietotaaju datus, ir “datu apstradatajs” saskkana ar GDPR. Jus esat atbildiigs par vinu atbilstibu.
Ko parrbaudit
Pirms jebkura tresa puses pakalpojuma integrrresanas, kas pieskaras personas datiem:
- Vai viiniiem ir DPA? Datu apstrades ligums ir obligats. Lielaka dala SaaS pakalpojumu sniedzeeju publicee savus publiski.
- Kur vini glaba datus? Ja arpus ES, parbaudiet juridisko pamatu parsutisanai.
- Kaadiem datiem vini piekluust? Minimizejiet to, ko sutat. Ja pakalpojumam ir vajadzigs tikai e-pasts, nesuutiet pilnu profilu.
- Vai jus varat dzest datus no vinu sistemam? Lietotaju dzessanas pieprasijumiem jabut izplatiitiem visur.
- Ka vini apstrada parkaapumus? Vinu DPA jabut noteiktiem pazinojumu termiiniem.
Bieezi parrskatami tresa puses apstradataaji
- E-pasta pakalpojumi (Resend, SendGrid, Mailchimp)
- Analitika (Google Analytics, Mixpanel, Amplitude)
- Kludu izsekosana (Sentry, Bugsnag)
- Maksajumu apstrade (Stripe, Adyen)
- Makonu mitinasana (AWS, Google Cloud, Vercel)
- Klientu atbalsta riki (Intercom, Zendesk)
- AI API (OpenAI, Anthropic, Google AI)
Uzturiet sarakstu ar visiem apstradatajiem. Parrskatiet to reizi ceturksni.
Datu saglababsanas politikas
Neglabajiet personas datus ilgaak neka nepieciesams. Definejiet saglabassanas periodus katram datu tipam.
| Datu tips | Ieteikamaais saglabassanas periods | Iemesls |
|---|---|---|
| Lietotaja konta dati | Lidz dzesanas pieprasijumam | Nepieciesams pakalpojumam |
| Sesiju zurnali | 90 dienas | Drosiba un atklludossana |
| Lietotaju aktiviitaates zurnali | 1-2 gadi | Produkta analitika |
| Atbalsta pieteikumi | 3 gadi | Pakalpojumu kvalitate |
| Finansu ieraksti | 7 gadi | Nodoklu/juridiskie pienakumi |
| Paroles atiestatissanas tokeni | 24 stundas | Drosiba |
| Neveiksmigi pieteeksanas meginiajumi | 90 dienas | Drosiibas monitorings |
Ieviesiet automatizeetuss tiriisanas uzdevumus. Nepaaiieties uz to, ka kads atcereesies palaist skriptu.
GDPR kontrolsaraksts izstradatajiem
Izmantojiet so ka sakuma punktu, buuveejot vai auditejot sistemu.
Datu vapacksana
- Katram veidlapas laukam ir noteikts merkis
- Netiek vapakti nevajadzigi dati
- Privattuma politika ir saistita ar katru datu vapacksanas punktu
- Piiekrisana tiek savakta pirms apstrades (ja nepieciesams)
- Piiekrisanas ieraksti tiek glabati ar laikspiedooliem
Datu glabassana
- Datu bazes sifrresana miera stavokli ir ieslegta
- TLS ir piespieests visiem savienojumiem
- Jutiiigiem laukiem ir lietojumprogrammas limena siffreesana
- Rezerves kopijas ir sifreetas
- Pieeja produkcijas datiem ir ierobezota un registreta
Lietotaju tiesibas
- Datu eksporta galapunkts eksiste un aptver visas tabulas
- Konta dzessanas galapunkts eksiste un apstrada visus datus
- Lietotaji var apskatit un atsaukt pieekrisanu savos iestatijumos
- Dzesana izplatias uz tresa puses pakalpojumiem
- Visi lietotaju tiesibu pieprasijumi tiek atbildeti 30 dienu laika
Sikdatnes un izsekosana
- Sikdatnu pieekrisanas baneris ir ieviests
- Nebuttiskas sikdatnes ir bloketas pirms piiekrisanas
- Piiekrisanas izveles ir detalizetas (ne viss vai nekas)
- “Noraidit visas” ir tikpat izteikta ka “Pienemmt visas”
Tresaas puses
- Visi datu apstraddataji ir dokumenteeti
- DPA ir parakstiti ar katru apstradaataju
- Dati, kas nosutiti tresajam pusem, ir minimizeeti
- Datu dzesana no tresajam pusem ir iesspejama
Drosiba
- Audita zurnali izseko pieeju personas datiem
- Anomaaaliju brdinajumi ir konfigureeeti
- Incidentu reagesanas plans ir dokumenteets
- Parkapuma pazinojuma process ir defineets (72 stundu termins)
Saglababsana
- Saglababsanas periodi ir defineti visiem datu tipiem
- Automatizieti tiriisanas uzdevumi ir ieplanoti
- Nobeigusies dati patiesi tiek dzesti (parbaudiet to)
Nobeiguma pardomas
GDPR atbilstiba nav vienreizejs projekts. Ta ir praksu kopa, kas ieausta taja, ka jus buveejat programmaturu. Tehniskais darbs ir tiessts: piiekrisanas glabassana, datu eksports, dzessanas galapunkti, sifresana, audita registresana. Standarta inzeniierija.
Gruttaa dala ir ruppigums. Ir viegli aizmirst par to zurnaaala failu, to analitikas notikumu vai to tresa puses integraciju, kas glaba lietotaju e-pastus. Regulari veiciet auditu. Testejiet savu dzessanas galapunktu. Parbaudiet, vai jusu eksporti ir pilnigi. Iebuvejiet privatumu sava procesa no paassa sakuma.
Vajadziga palidziba GDPR atbilstosass programmaturas buve vai esosu sistemu audita? Sazinieties ar mums. Mes buuvejam privatuma orienteetas lietojumprogrammas Eiropas uznemumiem un uznemumiem, kas apkalpo ES lietotajus.