GDPR et Event Sourcing : effacer sans supprimer l'histoire
Comment classifier les données, choisir entre Personal Data Store, crypto-shredding et tombstones, et traiter snapshots, projections et logs pour répondre à une demande d'effacement.
Par Elias Varen4 min de lectureMembres
Cet article est de nature architecturale et ne constitue pas un avis juridique. Les contraintes GDPR/RGPD varient selon les contextes ; pour les décisions de conformité, consultez un DPO ou un juriste spécialisé.
Une demande d'effacement arrive, au titre de l'article 17 du RGPD (droit à l'effacement). L'utilisateur veut que ses données disparaissent.
Votre EventStore est append-only, et un événement ne s'y supprime pas. AccountOpened { userId: "alice", email: "alice@example.com", ... } est là depuis trois ans. Il est dans le stream, dans les snapshots, dans les projections matérialisées, et peut-être dans les logs applicatifs.
L'erreur n'est pas de stocker un log immuable. L'erreur est d'y avoir mis des PII sans stratégie d'effacement.
Classifier avant de persister
La première décision se prend avant d'écrire le premier événement, et non le jour où la demande d'effacement arrive.
Pour chaque attribut, on se pose les questions suivantes.
- Est-ce une PII (donnée à caractère personnel) ? Email, nom, numéro de téléphone, adresse IP, identifiant indirect.
- A-t-on vraiment besoin de la persister dans l'EventStore ? Le
userIdest nécessaire, mais le nom complet de l'utilisateur est-il utile dansMoneyWithdrawn? - Quelle est la durée de rétention légitime ? Le RGPD impose la minimisation, c'est-à-dire de ne conserver que ce qui est nécessaire pour la finalité déclarée.
Appliquée à l'Event Sourcing, la minimisation consiste à ne mettre dans l'EventStore que les identifiants nécessaires aux invariants métier. Les données personnelles détaillées vivent ailleurs.
Personal Data Store (PDS) et tokens de référence
La stratégie la plus propre consiste à ne jamais écrire de PII dans l'EventStore. On y stocke à la place un token de référence opaque (pdRef: "pds-ref-a7b2c9d4") qui pointe vers les données dans un store séparé.
// [NON] — PII dans le payload de l'événement
class AccountOpened implements DomainEvent {
constructor(
public readonly accountId: string,
public readonly email: string, // ← PII dans le stream immuable
public readonly fullName: string, // ← PII dans le stream immuable
) {}
}
// [OUI] — référence opaque, PII dans un store séparé
class AccountOpened implements DomainEvent {
constructor(
public readonly accountId: string,
public readonly pdRef: string, // ← token vers le Personal Data Store
) {}
}Le dossier complet : Systèmes event-sourcés
À lire ensuite
Toute la rubrique ArchitectureArchitecture
Event Sourcing : quand il faut refuser le pattern
Ce que l'Event Sourcing rapporte et coûte vraiment, les signaux pour l'adopter ou le refuser, et comment défendre un refus en réunion d'architecture.
7 minLecture libre
Sécurité
Chiffrement applicatif et gestion de clés
Comment construire une hiérarchie de clés par enveloppe dans un système event-sourcé, ce qu'elle protège réellement, et les trois endroits où elle casse : la sauvegarde des clés, le cache et la rotation.
7 minMembres
Architecture
Durable execution : moteur de workflow ou table d'état ?
Un moteur de durable execution et une table d'état résolvent le même problème avec des contraintes opposées, surtout le jour où vous modifiez un workflow dont des instances sont en cours. Les stratégies de versionnement et le critère pour choisir.
7 minMembres