Sécurité
Cette page détaille les mesures techniques et organisationnelles mises en œuvre pour protéger vos données. Elle complète la Politique de confidentialité et l'Accord de sous-traitance (DPA).
Architecture
Isolation multi-tenant
Chaque entreprise cliente (tenant) est strictement isolée des autres au niveau de la base de données :
- Row Level Security PostgreSQL activée sur toutes les tables contenant
tenant_id. Les policies utilisent une fonctioncurrent_tenant_id()qui lit une variable de session. - Toute requête côté serveur passe par un helper
withTenant(tenantId, ...)qui ouvre une transaction et set la variable session AVANT la requête. Aucune requête cross-tenant possible. - Les helpers d'API (
withTenantApi) cumulent vérification de session + vérification de rôle + scope tenant. C'est le pattern obligatoire pour toute route métier.
Authentification
- NextAuth.js v5 avec SSO Google et magic link à usage unique pour les recrues invitées.
- Pas d'adapter Prisma standard car notre modèle multi-tenant exige une résolution
tenant_id + email(l'email seul n'est pas unique entre tenants). - Tokens JWT signés, rotation à 30 jours.
- Soft delete : un utilisateur supprimé est anonymisé et ne peut plus se reconnecter, sur tous les chemins d'auth (SSO, Credentials, magic link).
Chiffrement
En transit
- TLS 1.3 obligatoire sur toutes les connexions HTTPS.
- HSTS strict.
Au repos
- AES-256 natif sur Supabase et Vercel (disque).
Applicatif (conversations IA)
Les messages échangés avec l'assistant IA Compagnon sont chiffrés au niveau applicatif avant stockage en base de données :
- Algorithme AES-256-GCM avec IV aléatoire 12 bytes et tag d'authentification 16 bytes.
- Clé dérivée par tenant via HKDF-SHA256 sur une clé maître (variable d'environnement, jamais committée).
- Format stocké : base64 d'un payload
[version | iv | authTag | ciphertext]. Le byte de version permet une rotation future sans migration de table. - Rolling read : les anciens messages non chiffrés (legacy) sont lus tels quels jusqu'au backfill complet.
- Conséquence importante : la perte de la clé maître rend les conversations chiffrées irrécupérables. C'est le gage de confidentialité fort que nous garantissons à nos clients.
Audit log
Une table audit_logs immuable trace 14 actions sensibles :
- Création / modification / suppression de recrue
- Résolution d'alerte
- Modification de la persona IA
- Publication / modification de parcours
- Modification des paramètres tenant
- Création / suppression de badge
- Soumission de feedback 360°
- Démarrage de l'offboarding
- Export RGPD (Art.20) avec compteurs par section
- Suppression RGPD (Art.17) avec snapshot email/role AVANT anonymisation
Chaque entrée capture : action, type d'entité, ID, payload minimal, IP, user-agent, timestamp.
Rate limiting
- Chat IA : 50 messages par heure et par utilisateur (fenêtre glissante sur la table
chat_messages). Pas de Redis externe — la BDD assure naturellement la limite avec un index(conversation_id, created_at). - Génération de parcours IA : limité par le quota Premium du plan.
Backups et reprise
- PITR (Point-In-Time Recovery) Supabase : 7 jours.
- Snapshots quotidiens.
- Restauration vérifiée trimestriellement.
RGPD
- Article 15 (accès) et Article 20 (portabilité) : export JSON complet en un clic via l'interface RH.
- Article 17 (effacement) : soft delete + anonymisation immédiate des PII. Les données voisines (chat, audit) deviennent anonymes par dérivation. Pas de récupération possible — c'est conforme et c'est voulu.
- Article 33 (notification de violation) : engagement contractuel de notification sous 72 heures (cf. DPA § 6.5).
- Liste exhaustive des sous-traitants avec leurs DPA : /legal/sous-traitants.
Hébergement
- Base de données : Supabase, région EU Central 1 (Frankfurt, Allemagne).
- Application web : Vercel, région EU West (Frankfurt).
- Emails transactionnels : Resend (transit US).
- Les transferts vers les fournisseurs IA (Anthropic, OpenAI — États-Unis) sont encadrés par des clauses contractuelles types et nos clauses additionnelles.
Reporting et contact
Pour signaler une vulnérabilité : security@weloom.ai. Nous nous engageons à accuser réception sous 48 h ouvrées et à coordonner une divulgation responsable.
Pour toute question sécurité ou RGPD : dpo@weloom.ai.