sécuriser une api rest node.js express : jwt, helmet et rate limiting
03/10/2025
Alors que les attaques sur les APIs ont augmenté de 91% en 2023 (source OWASP API Security Top 10), sécuriser une API REST Node.js Express n’est plus une option : c’est une nécessité. Dans ce tutoriel, nous allons mettre en place 3 briques clés : l’authentification par JWT, le renforcement des en-têtes HTTP avec Helmet et la limitation de débit avec rate-limiter-flexible. Vous disposerez d’une API robuste et prête pour la production.
sécuriser une api rest node.js express : prérequis et installation
Avant de commencer, assurez-vous d’avoir :
- Node.js >= 18 installé
- npm ou yarn
- Une base de projet Express initialisée
Initialisation rapide du projet :
mkdir secure-api && cd secure-api
npm init -y
npm install express jsonwebtoken helmet rate-limiter-flexible bcryptjs
Pour en savoir plus sur Node.js, consultez cette page : Node.js chez Novane.
Structure minimale d’une API Express
const express = require('express');
const app = express();
app.use(express.json());
app.get('/public', (req, res) => {
res.json({ message: 'Endpoint public' });
});
app.listen(3000, () => console.log('API démarrée sur :3000'));
implémentation de l’authentification par JWT
Le JSON Web Token permet de garantir l’identité du client sans stocker d’état serveur. Voici un exemple de route “login” :
const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');
const SECRET = process.env.JWT_SECRET || 'votre_secret';
app.post('/login', async (req, res) => {
const { email, password } = req.body;
// Exemple : vérification en base
const user = await findUserByEmail(email);
if (!user || !bcrypt.compareSync(password, user.hash)) {
return res.status(401).json({ error: 'Identifiants invalides' });
}
const token = jwt.sign({ sub: user.id }, SECRET, { expiresIn: '1h' });
res.json({ token });
});
// Middleware de protection
function authMiddleware(req, res, next) {
const auth = req.headers.authorization;
if (!auth?.startsWith('Bearer ')) return res.sendStatus(401);
const token = auth.split(' ')[1];
try {
req.user = jwt.verify(token, SECRET);
next();
} catch {
res.sendStatus(403);
}
}
app.get('/protected', authMiddleware, (req, res) => {
res.json({ message: `Bonjour utilisateur #${req.user.sub}` });
});
Erreur fréquente : “jwt malformed” signale souvent une variable d’environnement mal configurée.
renforcer la sécurité HTTP avec Helmet
Helmet configure automatiquement 12 en-têtes HTTP pour lutter contre XSS, clickjacking, MIME sniffing, etc.
const helmet = require('helmet');
app.use(helmet());
// Exemple : CSP plus stricte
app.use(helmet.contentSecurityPolicy({
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'", 'cdnjs.cloudflare.com'],
}
}));
Conseil : activez uniquement les modules nécessaires pour limiter les interférences avec votre frontend.
limiter les requêtes avec rate-limiter-flexible
Le brute-force et les API abuse sont contrés par une limitation de débit.
const { RateLimiterMemory } = require('rate-limiter-flexible');
const rateLimiter = new RateLimiterMemory({
points: 10, // 10 requêtes
duration: 1, // par seconde
});
app.use(async (req, res, next) => {
try {
await rateLimiter.consume(req.ip);
next();
} catch {
res.status(429).json({ error: 'Trop de requêtes, réessayez plus tard' });
}
});
Point de vigilance : testez en condition réelle pour ajuster points/secondes.
bonnes pratiques et conseils avancés
- Stockez
JWT_SECRET
dans un gestionnaire de secrets (AWS Secrets Manager, Azure Key Vault). - Renouvelez les clés tous les 90 jours et implémentez un token blacklist si besoin.
- Activez la journalisation des erreurs (Sentry, Logstash) pour détecter les anomalies.
- Mesurez la latence des middlewares avec
app.use((req,res,next)=>{const t=Date.now();res.on('finish',()=>console.log(Date.now()-t));next();})
. - Intégrez des tests de sécurité automatisés (OWASP ZAP, Postman).
Si votre projet nécessite une architecture web sur-mesure, découvrez notre expertise : services Application Web.
conclusion
En combinant JWT, Helmet et un rate limiter, votre API Express devient beaucoup plus résistante aux attaques courantes. Implémentez ces briques dès le stade de développement pour réduire de 80% les risques de faille (chiffres OWASP 2023). Pour aller plus loin, pensez audit de sécurité et tests de charge.
Besoin d’un accompagnement sur-mesure pour sécuriser vos APIs ? Contactez-nous dès aujourd’hui.