## 13. Conformité RGPD ### 13.1 Gestion du consentement **Décision** : Tarteaucitron.js + PostgreSQL backend **Implémentation web** : - ✅ Tarteaucitron.js (opensource, self-hosted) - ✅ Banner RGPD français, customisable - ✅ Granularité : fonctionnel / analytique / marketing **Implémentation backend** : - Table `user_consents` avec versioning - Champs : user_id, consent_type, version, accepted, timestamp - Historique complet conservé (preuve légale) **Consentements requis** : - **Géolocalisation précise** : obligatoire (banner + permission OS) - **Analytics** : optionnel (Matomo) - **Notifications push** : optionnel (permission OS) **Justification** : - Opensource, 0€, conformité RGPD garantie - Historique backend = preuve légale en cas de contrôle - Granularité conforme recommandations CNIL --- ### 13.2 Anonymisation des données GPS **Décision** : Geohash après 24h **Processus** : 1. Données précises conservées **24h** (recommandation personnalisée) 2. Après 24h : conversion en geohash précision 5 (~5km²) 3. Coordonnées originales supprimées définitivement 4. Job quotidien automatique via cron **Exceptions** : - ✅ Historique personnel visible (liste trajets) : conservation intégrale tant que compte actif - ❌ Analytics globales : uniquement geohash anonyme **Justification** : - Vraie anonymisation RGPD (CNIL compliant) - Permet analytics agrégées (heatmaps trafic) - PostGIS natif, 0€ --- ### 13.3 Export des données (portabilité) **Décision** : JSON + HTML + ZIP, génération asynchrone **Format export** : Archive ZIP contenant JSON (machine-readable), HTML (human-readable), fichiers audio, README **Données exportées** : - Profil utilisateur (email, pseudo, date inscription, bio) - Historique d'écoute (titres, dates, durées) - Contenus créés (audio + métadonnées) - Abonnements et likes - Centres d'intérêt (jauges) - Historique consentements **Processus** : 1. Demande via paramètres compte 2. Génération asynchrone (worker background) 3. Email avec lien download (expire **7 jours**) 4. Délai : **48h maximum** (conformité RGPD) **Limite** : - Maximum **1 export/mois** (anti-abus) **Justification** : - Conformité article 20 RGPD (portabilité) - Double format (human + machine) - Worker asynchrone évite timeout --- ### 13.4 Suppression du compte **Décision** : Grace period 30j + anonymisation contenus **Processus** : 1. Utilisateur clique "Supprimer mon compte" 2. Compte désactivé immédiatement (login impossible) 3. Contenus cachés pendant 30 jours (non diffusés) 4. Email confirmation + lien annulation (valide 30j) 5. Après 30j sans annulation : suppression effective **Suppression effective** : - ✅ Compte utilisateur supprimé (données personnelles) - ✅ Historique d'écoute supprimé - ✅ GPS historique supprimé - ✅ Sessions et tokens révoqués - ⚠️ Contenus créés **anonymisés** (créateur = "Utilisateur supprimé") - ⚠️ Likes et abonnements supprimés (mais compteurs préservés) **Contenus conservés anonymement** : - Audio files (CDN) - Métadonnées (titre, description, tags, géolocalisation) - Statistiques d'écoute **Justification** : - Grace period évite suppressions impulsives - Anonymisation contenus = intérêt légitime communauté - Conforme RGPD si créateur = donnée supprimée --- ### 13.5 Mode dégradé (sans GPS précis) **Décision** : GeoIP par défaut, GPS optionnel **Niveaux de précision** : | Niveau | Technologie | Contenus accessibles | Consentement | |--------|-------------|---------------------|--------------| | **Pays** | Aucune géoloc | Contenus nationaux uniquement | ❌ Non requis | | **Ville** | GeoIP (IP2Location) | Contenus régionaux/ville | ❌ Non requis | | **Précis** | GPS | Tous contenus (hyperlocaux inclus) | ✅ Requis | **Implémentation** : - Démarrage app : GeoIP automatique (IP → ville) - Banner in-app : "Activez la géolocalisation pour découvrir du contenu près de chez vous" - Upgrade volontaire vers GPS **API GeoIP** : - IP2Location Lite (gratuit, self-hosted, voir [ADR-019](../../../adr/019-geolocalisation-ip.md)) - Update DB mensuelle automatique - Précision ~80% au niveau ville **Justification** : - RGPD : pas de consentement requis pour GeoIP (pas de donnée personnelle) - UX dégradée acceptable (contenus disponibles) - Progressive disclosure (upgrade optionnel) --- ### 13.6 Durée de conservation des données **Décision** : 5 ans inactivité → purge automatique **Règles** : | Type de compte | Seuil inactivité | Action | |----------------|------------------|--------| | **Auditeur uniquement** | 5 ans sans connexion | Suppression automatique | | **Créateur avec contenus actifs** | Jamais (tant qu'écoutes) | Conservation indéfinie | | **Créateur inactif** | 5 ans sans connexion + 2 ans sans écoute | Suppression automatique | **Notifications avant suppression** : - Email + push : **90 jours** avant - Email + push : **30 jours** avant - Email + push : **7 jours** avant - Toute connexion = reset compteur inactivité **Contenu conservé** : - Contenus créés par comptes supprimés (anonymisés) : conservation indéfinie **Justification** : - Conformité principe minimisation RGPD - 5 ans = équilibre raisonnable (standard industrie) - Exception créateurs actifs = intérêt légitime plateforme --- ### 13.7 Cookies et trackers web **Décision** : Matomo self-hosted, zéro cookie tiers **Cookies utilisés** : | Cookie | Type | Durée | Finalité | Consentement | |--------|------|-------|----------|--------------| | `session` | Technique | 30j | Authentification | ❌ Non requis | | `refresh_token` | Technique | 30j | Session persistante | ❌ Non requis | | `_pk_id` | Analytique | 13 mois | Matomo (IP anonyme) | ✅ Requis | **Analytics : Matomo self-hosted** : - Hébergé sur nos serveurs (Docker) - IP anonymisées automatiquement (2 derniers octets) - Pas de cookie si consentement refusé - Alternative : Plausible (SaaS EU, 9€/mois) **Trackers interdits** : - ❌ Google Analytics - ❌ Facebook Pixel - ❌ Hotjar, Mixpanel, etc. **Justification** : - Souveraineté données (pas de transfert US) - Conformité RGPD max (CNIL compatible) - Matomo = opensource, 0€ infra --- ### 13.8 Registre des traitements **Décision** : Document Markdown versionné Git (MVP) **Emplacement** : - `docs/rgpd/registre-traitements.md` - Versionné Git (historique modifications) **Contenu obligatoire par traitement** : - Nom et finalité du traitement - Catégories de données collectées - Base légale (consentement / contrat / intérêt légitime) - Durée de conservation - Destinataires (sous-traitants, CDN, etc.) - Transferts hors UE (aucun prévu) **Responsable** : - DPO / Fondateur - Review trimestrielle obligatoire - Update immédiate si nouveau traitement **Migration future** : - Si > 100K utilisateurs : interface admin PostgreSQL **Justification** : - Obligation RGPD Article 30 - Markdown = simple, versionné, auditable - 0€ --- ### 13.9 Notification violations de données (breach) **Décision** : Monitoring + alertes + runbook **Détection automatique** : | Événement | Outil | Alerte | |-----------|-------|--------| | Erreurs backend critiques | Sentry | Discord/Slack immédiat | | Pic requêtes anormal | Grafana | Email équipe | | Accès non autorisé DB | PostgreSQL logs | SMS fondateur | | Authentification suspecte | Zitadel alerts | Email équipe | **Procédure breach** : - Runbook : `docs/rgpd/procedure-breach.md` - Checklist 72h CNIL : 1. H+0 : Détection et confinement 2. H+24 : Évaluation gravité (données concernées, utilisateurs impactés) 3. H+48 : Notification CNIL si risque pour utilisateurs 4. H+72 : Notification utilisateurs si risque élevé **Contact CNIL** : - Email pré-rédigé (template) - Formulaire en ligne (account CNIL créé) **Justification** : - Obligation RGPD Article 33 (notification 72h) - Monitoring proactif évite découverte tardive - Sentry gratuit < 5K events/mois --- ### 13.10 DPO (Délégué à la Protection des Données) **Décision** : Fondateur = DPO temporaire (MVP) **Raison légale** : - Non obligatoire si : - < 250 employés - Pas de traitement à grande échelle de données sensibles - RoadWave : données localisation = sensible MAIS échelle MVP **Formation** : - CNIL : formation gratuite en ligne (4h) - Certification CNIL "Atelier RGPD" (gratuit) **Contact** : - Email : dpo@roadwave.fr - Publié dans CGU et mentions légales - Délai réponse : **1 mois** (RGPD) **Migration future** : - Si > 100K utilisateurs : DPO externe mutualisé (~200€/mois) - Ou recrutement DPO interne si > 10 employés **Justification** : - Conforme RGPD (non obligatoire en phase MVP) - 0€, contrôle total - Bonne pratique : avoir un contact identifié --- ### 13.11 Droit de rectification **Décision** : Interface self-service + validation immédiate **Données rectifiables** : - Email (avec re-vérification) - Pseudo (unique, disponibilité vérifiée) - Bio / description - Centres d'intérêt (jauges) - Photo de profil **Processus** : - Changements immédiats (sauf email) - Email : lien vérification → validation sous 24h - Historique modifications conservé (audit trail) **Limitations** : - Pseudo : max 1 changement/30j (anti-squat) **Justification** : Conformité Article 16 RGPD, self-service 0€ --- ### 13.12 Droit d'opposition **Décision** : Opt-out granulaire, effet immédiat | Traitement | Toggle | Effet | |------------|--------|-------| | **Marketing email** | Paramètres | Stop emails promo | | **Notifications push** | Paramètres | Stop push marketing | | **Analytics** | Banner RGPD | Exclusion Matomo | | **Recommandations personnalisées** | "Mode anonyme" | Reco génériques uniquement | **Mode anonyme** : - Désactive algorithme (jauges ignorées) - Recommandations = top contenus zone géo uniquement - Historique non utilisé **Justification** : Conformité Article 21 RGPD --- ### 13.13 Droit à la limitation du traitement **Décision** : "Geler mon compte" temporaire **Effets** : - Compte gelé, contenus cachés, profil invisible - Connexion lecture seule OK - Réactivation à tout moment **Justification** : Conformité Article 18 RGPD --- ### 13.14 Politique de confidentialité **Décision** : Page web + popup in-app + versioning Git **Emplacement** : - Web : `roadwave.fr/confidentialite` - App : page dédiée paramètres - Popup première connexion (scroll requis) **Contenu** : Identité responsable, finalités, base légale, destinataires, durées, droits, transferts UE **Versioning** : Git + DB `privacy_policy_versions`, popup si changement majeur **Justification** : Conformité Articles 13-14 RGPD --- ### 13.15 Minimisation des données **Décision** : Collecte strictement nécessaire | Donnée | Finalité | Optionnel | |--------|----------|-----------| | Email | Authentification | ❌ | | Pseudo | Identité publique | ❌ | | GPS précis | Reco hyperlocales | ✅ (GeoIP fallback) | | Jauges intérêt | Reco thématiques | ✅ | | Date naissance | Vérifier âge minimum | ❌ (année seule) | **Non collecté** : nom/prénom réels, adresse postale (sauf créateurs payés), téléphone (sauf 2FA optionnel) **Justification** : Conformité Article 5.1.c RGPD --- ### 13.16 Sécurité des données **Décision** : Chiffrement multi-niveaux | Couche | Implémentation | |--------|----------------| | Transport | TLS 1.3 ([ADR-006](../../../adr/006-chiffrement.md)) | | DB | PostgreSQL encryption at rest AES-256 | | Tokens | JWT RS256 + rotation 90j | | CDN | Signed URLs expirables | | Backups | AES-256 + offsite | **Mesures orga** : Whitelist IP, Vault secrets, logs anonymisés, 2FA admins, pentest annuel **Justification** : Conformité Article 32 RGPD --- ### 13.17 Transferts hors UE **Décision** : Hébergement 100% France/UE | Service | Localisation | Transfert UE | |---------|--------------|--------------| | Hébergement | OVH France | ❌ | | Database | OVH France | ❌ | | CDN | Bunny.net EU | ❌ | | Matomo | Self-hosted France | ❌ | **Si CDN global futur** : Clauses Contractuelles Types (CCE) 2021 **Justification** : Conformité Articles 44-50 RGPD, souveraineté données --- ### 13.18 Profilage et décisions automatisées **Décision** : Transparence + droit opposition | Traitement | Impact | Intervention humaine | Opposition | |------------|--------|---------------------|------------| | Recommandations | Faible | ❌ | ✅ (mode anonyme) | | Modération auto | Élevé | ✅ (review 24h) | ✅ (appeal) | **Transparence** : Page "Comment fonctionne l'algo ?", explications simplifiées **Justification** : Conformité Article 22 RGPD --- ### 13.19 Gestion des mineurs **Décision** : 13 ans minimum + consentement parental 13-15 ans + RoadWave Kids #### App principale (RoadWave) **Âge minimum** : **13 ans** (alignement YouTube/TikTok) **Processus inscription** : 1. Saisie date naissance (JJ/MM/AAAA) 2. **Si < 13 ans** : blocage + message redirection RoadWave Kids 3. **Si 13-15 ans** : workflow consentement parental 4. **Si ≥ 16 ans** : inscription directe **Workflow consentement parental (13-15 ans)** : 1. Ado saisit email parent 2. Email automatique parent avec lien validation (expire 7j) 3. Parent clique lien → page dédiée avec résumé données collectées, paramètres contrôle parental, checkbox consentement 4. Validation parent → compte ado activé avec restrictions **Restrictions 13-15 ans** : - ✅ Écoute contenus autorisés - ✅ Création contenus (modération renforcée) - ⚠️ GPS précis : consentement parental explicite requis - ⚠️ Messagerie privée : désactivée par défaut - ⚠️ Contenus sensibles : filtrés (pas de contenu +16) - ⚠️ Profil public limité (pas d'affichage ville précise) **Contrôles parentaux** : - Dashboard parent : `roadwave.fr/parent/[child_id]` - Visualisation historique écoute - Activation/désactivation GPS précis - Activation/désactivation messagerie - Révocation consentement à tout moment - Notification hebdomadaire activité **Vérification légère identité parent** : - Email parent ≠ email ado (vérification domaine) - Lien expiration 7 jours - Pas de vérification identité forte (MVP) #### RoadWave Kids (< 13 ans) **App dédiée** : Version séparée avec contrôles renforcés **Caractéristiques** : - ❌ Pas de GPS précis (GeoIP ville uniquement) - ❌ Pas de création contenu - ❌ Pas de profil public - ❌ Pas de messagerie - ✅ Contenus présélectionnés (whitelist éditoriale) - ✅ Mode lecture seule - ✅ Contrôle parental obligatoire **Contenus autorisés** : - Contes audio enfants - Guides touristiques famille - Podcasts éducatifs labellisés - Histoires locales patrimoine **Workflow inscription** : 1. Création compte parent (RoadWave standard) 2. Ajout profil enfant dans dashboard parent 3. App Kids : login via QR code parent 4. Pas de compte autonome enfant **Modération** : - 100% contenus présélectionnés par équipe éditoriale - Aucun UGC accessible - Whitelist créateurs vérifiés uniquement **Justification** : - Conformité Article 8 RGPD (13-16 ans selon pays) - 13 ans France = seuil légal avec consentement parental - App Kids = protection renforcée < 13 ans - Alignement marché (YouTube 13+, YouTube Kids) **Roadmap** : - **MVP** : App principale 16+ uniquement (simplicité) - **Phase 2** : Workflow 13-15 ans + consentement parental - **Phase 3** : RoadWave Kids (app séparée) --- ### 13.20 Sous-traitants et DPA **Décision** : DPA systématique, audit annuel | Service | Traitement | Localisation | DPA | Certifications | |---------|------------|--------------|-----|----------------| | OVH | Hébergement | France | ✅ | ISO 27001, HDS | | Bunny.net | CDN | UE | ✅ | ISO 27001 | | Brevo | Emailing | France | ✅ | RGPD certified | | Mangopay | Paiements | Luxembourg | ✅ | PCI-DSS, ACPR | **Obligations DPA** : Traitement selon instructions, confidentialité, sécurité, assistance droits, suppression fin contrat **Gestion** : `docs/rgpd/sous-traitants.md`, review annuelle **Justification** : Conformité Article 28 RGPD --- ### 13.21 Analyse d'impact (DPIA) **Décision** : DPIA obligatoire (GPS + profilage grande échelle) **Raisons** : - Traitement grande échelle données GPS sensibles - Profilage automatisé recommandations - Surveillance zones publiques **Contenu** : Description traitement, finalités, nécessité, risques (tracking, profilage, fuite), mesures atténuation (anonymisation 24h, consentement, chiffrement, mode dégradé) **Fichier** : `docs/rgpd/dpia-geolocalisation.md`, review annuelle **Justification** : Conformité Article 35 RGPD (critères CNIL remplis) --- ### 13.22 Délai de réponse aux demandes **Décision** : 1 mois max, automatisation maximale **Canaux** : Email dpo@roadwave.fr, formulaire in-app, courrier postal | Droit | Délai cible | Automatisation | |-------|-------------|----------------| | Accès (export) | 48h | ✅ Worker | | Rectification | Immédiat | ✅ Self-service | | Suppression | Immédiat | ✅ Self-service | | Opposition | Immédiat | ✅ Toggles | | Limitation | Immédiat | ✅ Gel compte | | Portabilité | 48h | ✅ Export | | Contestation décision | 24h | ⚠️ Manuel | **Vérification identité** : Si email vérifié = aucune vérif supplémentaire **Justification** : Conformité Article 12 RGPD