Une plateforme construite pour mériter la confiance de ses utilisateurs.
Ce document présente la stratégie de sécurité et la conformité réglementaire de Woodle Career. Il s'adresse aux utilisateurs, partenaires, entreprises clientes, investisseurs et responsables conformité qui doivent évaluer le sérieux d'une plateforme manipulant des données de candidats à l'emploi.
La sécurité est l'un des trois critères structurels qui guident chaque choix d'ingénierie (sobriété, sécurité, autonomie), pas une couche posée après coup. Les sections qui suivent décrivent les garanties techniques, les contrôles d'accès, la conformité RGPD et la gouvernance des incidents.
Plusieurs couches indépendantes : authentification, Row-Level Security au niveau de la base de données, validation d'entrée serveur, headers stricts, rate-limiting. Si une couche cède, les autres tiennent.
Aucune table sensible n'est lisible sans une politique d'accès explicite. Aucun consentement optionnel n'est activé par défaut. Toute écriture publique est rate-limitée et modérée si elle peut devenir publique.
Le candidat décide ce qu'il partage. Les notes Sirius, le journal de candidature et les contenus sensibles restent privés par défaut, même côté B2B éducation (offre Campus).
Migrations versionnées en append-only, tests automatisés (373), E2E sur PostgreSQL réel pour la RLS, registre des incidents tenu à jour. Chaque correctif est traçable dans le code.
| Surface | Mécanisme | Détail |
|---|---|---|
| En transit | TLS 1.2+ | HTTPS forcé sur l'ensemble du périmètre (Vercel CDN + edge), HSTS preload 2 ans avec includeSubDomains. |
| Au repos (DB) | Chiffrement disque AWS | PostgreSQL Supabase sur AWS eu-west-1, volumes chiffrés AES-256 par défaut côté infrastructure. |
| Au repos (Storage) | Chiffrement objet | Bucket privé, URLs signées (15 minutes), policy basée sur auth.uid(). Aucun lien direct vers un fichier brut. |
| Mots de passe | bcrypt | Hash + sel géré par Supabase Auth. Aucun accès au plaintext, même côté équipe Woodle Lab. |
| Secrets API | Variables d'env Vercel | Service role Supabase, clés Stripe, Anthropic, Resend, Upstash. Jamais exposés au client (préfixe NEXT_PUBLIC_ interdit pour les secrets). |
| Webhooks | Signature vérifiée | Stripe : signature stripe-signature validée. Dédup d'event-id pour empêcher le rejeu. |
| Famille d'attaque | Mesure en place | Statut |
|---|---|---|
| Broken Access Control | Row-Level Security PostgreSQL sur 14 tables, helpers SECURITY DEFINER anti-récursion, garde is_coach_of_student. | Testé E2E 33/33 |
| Injection (SQL, NoSQL) | Requêtes paramétrées via Supabase JS, validation Zod, sanitization des filtres de recherche PostgREST. | OK |
| Cross-Site Scripting (XSS) | React auto-escape · Content-Security-Policy stricte · helper safeExternalUrl sur les URLs rendues en href · escapeHtml sur les mails internes. | OK |
| Cross-Site Request Forgery (CSRF) | Cookies SameSite=Lax, en-tête Origin vérifié sur les webhooks, JWT. | OK |
| Server-Side Request Forgery (SSRF) | Aucun fetch côté serveur d'URL utilisateur arbitraire : tous les appels sortants visent des hôtes fixes (Stripe, Anthropic, Resend, agrégateurs d'offres). | OK |
| Mass assignment | Whitelists Zod strictes sur les routes mutantes critiques (candidatures, préférences, consentement). | OK |
| Open redirect | Garde getSafeNext sur l'/auth/callback et le login : seuls les chemins relatifs sont acceptés. | OK |
| Brute force / déni | Rate-limiting Upstash sur les endpoints sensibles (sliding window IP + utilisateur). | OK |
| Upload malveillant | Allowlist MIME, garde anti double-extension, Content-Disposition: attachment forcé pour les non-images. | OK |
| Dépendances vulnérables | npm audit suivi en CI, correctifs non-breaking appliqués. Advisories résiduelles transitives via next (build CSS + traitement d'image) — sans exposition runtime de l'app, planifiées au prochain bump majeur. | Suivi |
| Source | Quoi observer | Réaction |
|---|---|---|
| Sentry | Erreurs serveur/client en temps réel, taux d'erreur par route | Notification email immédiate, investigation sous 4h |
| cron-job.org + GitHub Actions | État des 8 crons quotidiens (6 emails sur cron-job.org + 2 infra sur GH Actions), échec d'envoi d'emails | Notification en cas d'échec, replay manuel possible |
| Stripe Dashboard | Échecs de paiement, webhooks 5xx, fraude potentielle | Revue quotidienne, replay des webhooks en cas d'échec transitoire |
| Resend | Taux de délivrabilité, bounces, plaintes | Suppressions automatiques, alerte si taux de bounce > 5% |
| Supabase | Taille DB, requêtes lentes, connexions actives | Upgrade anticipé avant d'atteindre les limites |
Une procédure formalisée encadre toute violation de données personnelles susceptible d'engendrer un risque pour les droits et libertés des utilisateurs.
Délai de réponse : 1 mois (art. 12.3 RGPD), prolongeable de 2 mois si la demande est complexe.
La politique de confidentialité, les conditions générales et le registre RGPD sont publics, datés et maintenus. Tout audit externe ou question de partenaire est traité par le DPO sous 48h ouvrées : dpo@woodlelab.com.
Pour aller plus loin : Technical Architecture Overview (choix d'ingénierie), End-to-End Test Report (preuves de fonctionnement), Media Deck (vision produit).