Le Cross-Origin Resource Sharing (CORS) est le mécanisme de défense des navigateurs contre le vol de données entre domaines. Configurez votre API pour n'autoriser strictement que les origines légitimes de votre frontend.
Politique de sécurité native du navigateur bloquant par défaut les requêtes entre domaines distincts.
Bannir origin: '*' en production et restreindre aux seuls domaines de confiance.
Obligation d'activer credentials: true pour permettre le passage des cookies de session.
Gestion obligatoire de la méthode HTTP OPTIONS émise par le navigateur avant les requêtes complexes.
import express from 'express';
import cors, { CorsOptions } from 'cors';
const app = express();
// 1. Liste blanche des domaines autorisés à interroger l'API en production
const whitelist = [
'https://mon-site.com',
'https://www.mon-site.com',
'https://admin.mon-site.com'
];
const corsOptions: CorsOptions = {
origin: (origin, callback) => {
// Autoriser les requêtes sans origine (comme les applications mobiles ou curl)
if (!origin || whitelist.indexOf(origin) !== -1) {
callback(null, true);
} else {
callback(new Error('Bloqué par la politique CORS en production'));
}
},
credentials: true, // Autorise l'envoi des cookies sécurisés et headers d'authentification
methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'],
allowedHeaders: ['Content-Type', 'Authorization', 'X-Requested-With'],
maxAge: 86400 // Met en cache le résultat du preflight pendant 24h
};
// 2. Appliquer le middleware CORS à toutes les routes API
app.use(cors(corsOptions));curl ou utilisez Postman, le CORS ne s'applique pas. Le CORS existe pour empêcher un site pirate malveillant.com sur lequel l'internaute surfe d'émettre une requête AJAX discrète vers votre-banque.com/api/virement en utilisant les cookies stockés dans son navigateur. Les spécifications W3C interdisent formellement d'utiliser * si credentials: true est activé. Le navigateur rejettera immédiatement la réponse. Vous devez impérativement renvoyer l'origine exacte du client dans l'en-tête de réponse.
| En-tête HTTP | Rôle | Exemple de Valeur en Production |
|---|---|---|
| Access-Control-Allow-Origin | Définit quel domaine a le droit de lire la réponse | https://mon-site.com (Jamais * en prod sécurisée) |
| Access-Control-Allow-Credentials | Autorise le passage des cookies et jetons d'authentification | true |
| Access-Control-Allow-Methods | Liste les verbes HTTP autorisés pour cette route | GET, POST, PUT, DELETE, OPTIONS |
| Access-Control-Allow-Headers | Liste les en-têtes personnalisés acceptés | Content-Type, Authorization |
| Access-Control-Max-Age | Durée de mise en cache du preflight OPTIONS en secondes | 86400 (24 heures) |