Exercices — N11 Sécurité & Production
10 exercices pour construire un serveur Express production-ready : sécurité, variables d'environnement, gestion des erreurs.
helmet() — En-têtes de sécurité HTTP
Ajoutez helmet() à une app Express. helmet configure automatiquement
une quinzaine d'en-têtes HTTP de sécurité (CSP, X-Frame-Options, etc.).
Installez avec npm install helmet puis appelez app.use(helmet()).
cors() — Whitelist d'origines autorisées
Configurez cors() avec une whitelist d'origines autorisées.
Passez un objet de configuration avec origin: [...] contenant
les URLs autorisées (ex: 'http://localhost:3000').
Utilisez app.use(cors({ origin: [...] })).
express-rate-limit — Protection DDoS
Configurez express-rate-limit sur toutes les routes :
fenêtre de 15 minutes (windowMs: 15 * 60 * 1000),
maximum 100 requêtes par IP (max: 100).
Appliquez avec app.use(limiter).
dotenv — Variables d'environnement
Chargez les variables d'environnement depuis un fichier .env avec
require('dotenv').config() (en première ligne),
puis utilisez process.env.PORT comme port du serveur.
Créez aussi un fichier .env avec PORT=3011.
asyncHandler — Wrapper pour routes async
Écrivez la fonction asyncHandler qui prend une fonction fn
et retourne un middleware (req, res, next).
Le middleware appelle Promise.resolve(fn(req, res, next)).catch(next)
pour propager automatiquement les erreurs async vers Express.
Error handler production-ready
Écrivez un middleware d'erreur avec 4 paramètres
(err, req, res, next) qui :
retourne le status 500 par défaut,
affiche err.message en développement mais un message générique en production.
Vérifiez process.env.NODE_ENV ou une variable isDev.
.env.example — Template des variables
Créez le contenu d'un fichier .env.example avec au minimum :
PORT, JWT_SECRET et NODE_ENV.
Le fichier .env.example est commité dans git, pas .env.
Ajoutez aussi des variables optionnelles utiles.
Validation des variables d'environnement au démarrage
Vérifiez que toutes les variables requises existent dans process.env
au démarrage. Si une variable est manquante, loggez une erreur et appelez
process.exit(1) pour arrêter immédiatement le processus.
Itérez avec forEach() sur un tableau de noms de variables.
En-têtes de sécurité sans helmet
Créez un middleware qui ajoute manuellement deux en-têtes de sécurité :
X-Content-Type-Options: nosniff (empêche le MIME sniffing)
et X-Frame-Options: DENY (empêche le clickjacking).
Utilisez res.setHeader('Nom', 'Valeur') puis appelez next().
morgan — Logger uniquement en développement
Configurez morgan('dev') pour logger les requêtes HTTP,
mais uniquement en développement.
Utilisez une condition if (process.env.NODE_ENV !== 'production')
avant app.use(morgan('dev')).