GDPR és adatvédelem
Beépített adatvédelem (Privacy-by-Design)
a qr3.app alapjaiban GDPR-megfelelőnek készült:
- IP-álnevesítés — Az IP-címeket az Edge Worker azonnal HMAC-SHA-256 UTC-napi álnevekké alakítja. Az eredeti IP-cím soha nem kerül tárolásra; az álnév továbbra is személyes adat.
- Adatminimalizálás — Csak a működéshez feltétlenül szükséges adatokat gyűjtjük.
Privacy-API
Adatösszesítés (GDPR 15. cikk)
GET /v1/account/privacy — Visszaadja az összes tárolt adat áttekintését.
curl https://qr3.app/v1/account/privacy \ -H "Authorization: Bearer qr3_sk_..."Response:
{ "data": { "workspace_id": "ws_xxx", "organization_id": "org_xxx", "account": { "name": "Alex Example", "locale": "en", "created_at": "2026-01-15T09:00:00.000Z" }, "stored_data": { "qr_codes": 42, "scan_records": 15000, "dpp_scan_records": 3200, "dashboard_activity_records": 0, "dashboard_document_activity_records": 36, "api_operation_records": 180, "webhook_delivery_records": 640, "api_keys": 2, "webhooks": 1, "dpp_passports": 12, "dpp_documents": 30, "files": 4, "gs1_identifiers": 2, "gs1_verification_requests": 1, "code_comments": 5, "audit_log_entries": 0, "dpp_import_jobs": 1, "workspace_members": 3, "scan_quota_alerts": 1 }, "gdpr_rights": { "access": "GET /v1/account/privacy", "export": "GET /v1/account/export", "erasure": "DELETE /v1/account", "consents": "GET /v1/account/privacy/consents" }, "data_processing": { "ip_storage": "Purpose-separated HMAC-SHA-256 UTC-day IP pseudonym — pseudonymous personal data", "scan_retention": "90 days by default", "usage_retention": "90 UTC days", "webhook_delivery_retention": "90 UTC days", "pii_in_export": true, "erasure": "DELETE /v1/account erases the person's account: organizations they own with all workspaces and data (unless another org admin takes them over), their memberships in other organizations, their login and their Stripe customer. A running subscription ends immediately, without refund.", "backup_retention": "Erased rows stay restorable from the database backups (Cloudflare D1 Time Travel) for up to 30 days, then they are gone.", "billing_records": "Invoices stay with Stripe for the statutory retention period (7 years, § 132 BAO)." } }, "meta": { "request_id": "req_xxx" }}A stored_data a tárolt bejegyzéseket számolja. A scan_records a QR-kódok beolvasásai, a dpp_scan_records a termékútlevelekhez a nyilvános DPP-resolveren keresztül érkező lekérések. Mindkettő tartalmazza az IP-álnevet.
A dashboard_activity_records és a dashboard_document_activity_records azokat a napokat számolja, amelyeken egy tag megnyitotta a dashboardot (két tábla), az api_operation_records a napi kérésszámlálókat API-kulcs, művelet és eredmény szerint, a webhook_delivery_records pedig a webhook-kézbesítési kísérleteket, a törölt webhookokéit is beleértve. Egyik sem tárol IP-címet vagy User-Agentet; a kézbesítési napló viszont tárolja az esemény payloadját és a fogadó válaszának első 1 KB-ját. Mind a négy 90 UTC-nap után törlődik (usage_retention, webhook_delivery_retention).
Az account a kérés mögött álló személyt nevezi meg — a dashboardon a bejelentkezett személyt, egyébként a kulcsot létrehozó személyt — e-mail-címmel, névvel, nyelvvel és létrehozási dátummal; Publishable Key esetén az érték null. A többi számláló a fiók adatait tartalmazó minden további táblát lefed: termékútleveleket, DPP-dokumentumokat, fájlokat, GS1-azonosítókat, megjegyzéseket, auditbejegyzéseket, importfuttatásokat, a workspace tagjait és a szervezet kvótaértesítéseit (scan_quota_alerts). A logikailag törölt sorok is beleszámítanak, mert még tárolva vannak. Az erasure, a backup_retention és a billing_records leírja, mit töröl a DELETE /v1/account, és mi marad meg egy ideig; a pii_in_export értéke true, mert az export megnevezi a személyt (e-mail, név) — az IP-álnevek soha nem hagyják el az adatbázist.
Adatexportálás (GDPR 20. cikk — adathordozhatóság)
GET /v1/account/export — Letölti az összes adatot JSON-fájlként.
curl https://qr3.app/v1/account/export \ -H "Authorization: Bearer qr3_sk_..." \ -o my-data.jsonAz exportálás a következőket tartalmazza:
- Minden QR-kód (beleértve a törölteket is)
- Aggregált beolvasási statisztikák (nyers IP-hashek nélkül)
- Aggregált DPP-lekérések termékútlevelenként (
dpp_scan_aggregates, szintén IP-hashek nélkül) - Használati statisztika aggregátumként (
dashboard_activity_aggregates,api_operation_aggregates): aktív napok és az aktív felhasználók száma dashboard-csatornánként, kérésszámlálók művelet és eredmény szerint — felhasználói és kulcsazonosítók nélkül - Webhook-kézbesítési kísérletek webhookonként és eseménytípusonként (
webhook_delivery_aggregates), payload és válasz nélkül - A kérés mögött álló személyt (
account), a szervezetet (organization; számlázási és értesítési cím csak a szervezeti adminisztrátoroknak) és a workspace-t (workspace) - Termékútleveleket, a DPP-dokumentumok és fájlok metaadatait (magukat a fájlokat nem), GS1-azonosítókat, a hitelesítésükre irányuló kérelmeket és importfuttatásokat (
dpp_passports,dpp_documents,files,gs1_identifiers,gs1_verification_requests,dpp_import_jobs) - Megjegyzéseket szerzőmezők nélkül (
code_comments), auditbejegyzéseket aggregátumként (audit_log_aggregates) és tagokat szerepkörönként (member_aggregates) - API-kulcsokat azonosító és hash nélkül (
api_keys), webhookokat URL és titok nélkül (webhooks), valamint a szervezet kvótaértesítéseit (scan_quota_alerts) - Létrehozási és módosítási időbélyegek
A Publishable Keys (qr3_pk_) 403 választ kap: a fájl minden kód célcímét és jegyzetét tartalmazza.
Fiók törlése (GDPR 17. cikk — az elfeledtetéshez való jog)
DELETE /v1/account — Azonnal és visszavonhatatlanul törli a kérés mögött álló személy fiókját: a dashboardon a bejelentkezett személyét, egyébként a kulcsot létrehozó személyét. Az e-mailben küldött törlési kérelem ugyanehhez a törléshez vezet: az üzemeltető törli a bejelentkezést a Clerknél, majd a qr3 törli a fiókot.
curl -X DELETE https://qr3.app/v1/account \ -H "Authorization: Bearer qr3_sk_..."Mi történik:
- A személy tulajdonában lévő szervezetek törlődnek minden workspace-szel, kóddal, termékútlevéllel, fájllal, statisztikával és naplóval együtt, beleértve a tárhelyen lévő fájljaikat is. Ha egy ilyen szervezetnek van másik aktív szervezeti adminisztrátora, akkor helyette a legrégebbi veszi át a szervezetet az adatokkal és az előfizetéssel együtt.
- Előfizetés: a futó előfizetés azonnal megszűnik, időarányos visszatérítés és végszámla nélkül; ezután a Stripe-ügyfél törlődik. A számlák a törvényes megőrzési időn át a Stripe-nál maradnak (7 év, § 132 BAO).
- Csapatok: a személy tagságai más szervezetekben megszűnnek; ezek a csapatok megtartják az adataikat. A személy megjegyzései többé nem neveznek meg szerzőt, auditbejegyzései elveszítik az IP-álnevet és a user agentet, az ott általa létrehozott API-kulcsokat pedig visszavonják.
- A személy: a bejelentkezés (Clerk) és a felhasználói rekord törlődik.
A válasz 200 status: "completed" értékkel és az organizations_deleted, organizations_transferred, memberships_removed és login_deleted számlálókkal. Nagyon nagy szervezeteknél egy kérés nem elég: ilyenkor a válasz 202 status: "in_progress" értékkel, és a törlés néhány órán belül magától befejeződik.
Írási joggal rendelkező Secret vagy Test Key, illetve dashboard-munkamenet szükséges (bármely szerepkör, mert a saját fiókról van szó). A Publishable Keys és a csak olvasható kulcsok 403 választ kapnak, a személy nélküli kulcs (created_by = 'system') 409-et. A 503 azt jelenti, hogy a telepítésből hiányzik egy titok, amelyre a törlésnek szüksége van; semmi sem törlődött.
Hozzájárulások kezelése
GET /v1/account/privacy/consents — Aktuális hozzájárulások lekérése.
POST /v1/account/privacy/consents — Hozzájárulások frissítése.
# Aktuális hozzájárulások lekérésecurl https://qr3.app/v1/account/privacy/consents \ -H "Authorization: Bearer qr3_sk_..."
# Marketing e-mailek kikapcsolásacurl -X POST https://qr3.app/v1/account/privacy/consents \ -H "Authorization: Bearer qr3_sk_..." \ -H "Content-Type: application/json" \ -d '{ "marketing_emails": false, "analytics": true, "product_updates": true }'Hozzájárulási mezők:
| Mező | Alapértelmezett | Leírás |
|---|---|---|
marketing_emails | false | Hírlevelek és reklám e-mailek |
analytics | true | Aggregált használati statisztikák |
product_updates | true | Termékújdonságok és változásnaplók (changelogok) |
A hozzájárulások módosításához írási jogosultság szükséges: a viewer szerepkör és a Publishable Keys 403 választ kap.
Technikai GDPR-implementáció
IP-álnevesítés (GDPR 25. cikk)
HTTP-kérés → Cloudflare Edge Worker ↓CF-Connecting-IP fejléc → HMAC-SHA-256(IP_HASH_SALT, cél, UTC-nap, IP) ↓ip_hash (napi álnév) → D1-adatbázis ↓Az eredeti IP-cím soha nem kerül tárolásraAz IP_HASH_SALT hosszú élettartamú főtitok; a cél és az UTC-nap automatikusan külön napi álneveket képez. A különböző UTC-napok álnevei nem közvetlenül azonosak, de a titok birtokosa egy ismert IP-jelöltet egy adott napra újra kiszámíthat. Nincs KV-napi só vagy kézi napi rotáció.
Adatmegőrzés (automatizált)
| Csomag | Megőrzés |
|---|---|
| Minden csomag | 90 nap |
A használati statisztika (dashboard-aktivitás, API-használati számlálók) és a webhook-kézbesítési naplók megőrzési ideje szintén 90 UTC-nap: az aktuális UTC-nap és az azt megelőző 89 nap. Ugyanaz a napi cron-feladat törli a régebbi sorokat (purgeOldDashboardActivity, purgeOldApiOperationUsage, purgeOldWebhookDeliveries).
Aladatfeldolgozói DPA
A Cloudflare, Inc. adatfeldolgozóként kezeli az adatokat. A DPA elérhető a cloudflare.com/cloudflare-customer-dpa címen.
A Cloudflare az adatokat az EU-régióra vonatkozó helymeghatározási javaslattal (többek között Frankfurt) dolgozza fel; szerződésben garantált EU-s joghatóság jelenleg nincs lefoglalva. Mivel a Cloudflare, Inc. székhelye az USA-ban található, az adattovábbítás alapjaként a GDPR 46. cikke szerinti általános szerződési feltételek (SCC-k) érvényesek.
Kapcsolat
- Adatvédelmi tisztviselő: [email protected]
- Adatfeldolgozási szerződés (AVV): [email protected] (kérésre)
- Adatvédelmi nyilatkozat: qr3.app/de/legal/datenschutz