CORS (Cross-Origin Resource Sharing)
Mécanisme de sécurité permettant aux serveurs web de contrôler quelles origines peuvent accéder à leurs ressources via des requêtes HTTP cross-domain.
Mis à jour le 11 janvier 2026
CORS (Cross-Origin Resource Sharing) est un standard de sécurité du W3C qui permet aux serveurs de spécifier quelles origines externes sont autorisées à accéder à leurs ressources. Ce mécanisme repose sur des en-têtes HTTP spécifiques et constitue un assouplissement contrôlé de la Same-Origin Policy des navigateurs, permettant aux applications web modernes de fonctionner en architecture distribuée tout en maintenant un niveau de sécurité approprié.
Fondements du CORS
- Protocole basé sur des en-têtes HTTP définis dans la spécification W3C pour autoriser ou bloquer les requêtes cross-origin
- Système de preflight utilisant la méthode OPTIONS pour valider les requêtes complexes avant leur exécution effective
- Protection contre les attaques CSRF et les accès non autorisés aux APIs par des domaines malveillants
- Distinction entre requêtes simples et requêtes nécessitant une validation préalable selon les critères définis par la spécification
Avantages du CORS
- Sécurité renforcée permettant un contrôle granulaire des accès cross-domain par origine, méthode et en-têtes
- Architecture microservices facilitée avec des APIs accessibles depuis différents domaines de manière contrôlée
- Flexibilité du développement frontend permettant aux SPAs de consommer des APIs hébergées sur différents domaines
- Transparence pour les développeurs avec des messages d'erreur clairs dans les consoles navigateurs en cas de blocage
- Standard universel supporté par tous les navigateurs modernes garantissant la compatibilité cross-browser
Exemple concret de configuration
// Configuration CORS avec Express.js
import express from 'express';
import cors from 'cors';
const app = express();
// Configuration CORS basique
const corsOptions: cors.CorsOptions = {
origin: (origin, callback) => {
const allowedOrigins = [
'https://app.example.com',
'https://admin.example.com'
];
if (!origin || allowedOrigins.includes(origin)) {
callback(null, true);
} else {
callback(new Error('Not allowed by CORS'));
}
},
methods: ['GET', 'POST', 'PUT', 'DELETE'],
allowedHeaders: ['Content-Type', 'Authorization'],
exposedHeaders: ['X-Total-Count', 'X-Page-Number'],
credentials: true,
maxAge: 86400 // 24 heures de cache pour preflight
};
app.use(cors(corsOptions));
// Route protégée
app.get('/api/users', (req, res) => {
res.json({ users: [] });
});
// Gestion manuelle pour routes spécifiques
app.options('/api/admin/*', cors({
origin: 'https://admin.example.com',
methods: ['GET', 'POST', 'DELETE']
}));Mise en œuvre du CORS
- Identifier les origines légitimes devant accéder à vos ressources et éviter l'utilisation de wildcards (*) en production
- Configurer les en-têtes Access-Control-Allow-Origin, Access-Control-Allow-Methods et Access-Control-Allow-Headers
- Définir Access-Control-Max-Age pour optimiser les performances en mettant en cache les réponses preflight
- Activer Access-Control-Allow-Credentials uniquement si nécessaire et jamais avec origin wildcard
- Implémenter une gestion appropriée des requêtes OPTIONS pour les preflight checks
- Tester la configuration avec différents scénarios incluant requêtes simples et complexes
- Monitorer les erreurs CORS en production pour détecter les problèmes de configuration ou tentatives d'accès non autorisées
Conseil de sécurité
Ne configurez jamais CORS avec origin: '*' et credentials: true simultanément. Cette combinaison est rejetée par les navigateurs et constitue une faille de sécurité majeure. En production, listez toujours explicitement les origines autorisées et utilisez une whitelist dynamique si nécessaire. Pour les APIs publiques, préférez une authentification par tokens plutôt que cookies afin d'éviter les problèmes CORS liés aux credentials.
Outils et middlewares associés
- cors (npm) - Middleware Express/Connect pour Node.js avec configuration flexible
- @fastify/cors - Plugin CORS optimisé pour le framework Fastify
- django-cors-headers - Package Django pour gérer CORS dans applications Python
- rack-cors - Middleware Rack pour applications Ruby/Rails
- Spring CORS Configuration - Support natif dans Spring Boot avec annotations
- Browser DevTools Network Tab - Inspection des en-têtes CORS et debugging des preflight
- CORS Anywhere - Service proxy pour tester et contourner CORS en développement
La maîtrise de CORS est essentielle pour toute architecture web moderne distribuée. Une configuration appropriée garantit la sécurité tout en permettant l'interopérabilité nécessaire aux applications microservices et SPAs. L'investissement dans une politique CORS bien définie réduit les vulnérabilités, améliore les performances via le caching des preflight, et facilite la maintenance en documentant explicitement les accès autorisés entre services.
