- Ajouter ADR-018 (librairies Go) dans TECHNICAL.md - Transformer Shared en menu dépliable dans mkdocs (cohérence avec autres domaines) - Corriger listes markdown (ajout lignes vides avant listes) - Corriger line breaks dans génération BDD (étapes "Et" sur nouvelles lignes) - Ajouter script fix-markdown-lists.sh pour corrections futures Impacte 86 fichiers de documentation et 164 fichiers BDD générés.
17 KiB
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_consentsavec 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 :
- Données précises conservées 24h (recommandation personnalisée)
- Après 24h : conversion en geohash précision 5 (~5km²)
- Coordonnées originales supprimées définitivement
- 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 :
- Demande via paramètres compte
- Génération asynchrone (worker background)
- Email avec lien download (expire 7 jours)
- 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 :
- Utilisateur clique "Supprimer mon compte"
- Compte désactivé immédiatement (login impossible)
- Contenus cachés pendant 30 jours (non diffusés)
- Email confirmation + lien annulation (valide 30j)
- 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)
- 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 :
- H+0 : Détection et confinement
- H+24 : Évaluation gravité (données concernées, utilisateurs impactés)
- H+48 : Notification CNIL si risque pour utilisateurs
- 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 |
|---|---|---|
| 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) |
| 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 :
- Saisie date naissance (JJ/MM/AAAA)
- Si < 13 ans : blocage + message redirection RoadWave Kids
- Si 13-15 ans : workflow consentement parental
- Si ≥ 16 ans : inscription directe
Workflow consentement parental (13-15 ans) :
- Ado saisit email parent
- Email automatique parent avec lien validation (expire 7j)
- Parent clique lien → page dédiée avec résumé données collectées, paramètres contrôle parental, checkbox consentement
- 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 :
- Création compte parent (RoadWave standard)
- Ajout profil enfant dans dashboard parent
- App Kids : login via QR code parent
- 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