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 fonction current_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.