CORS expliqué : preflight, en-têtes et correction des erreurs CORS

CORS expliqué

CORS expliqué : preflight, en-têtes, erreurs et correctifs | We.Inc

Comment fonctionne CORS : requêtes simples ou preflight, chaque en-tête Access-Control, règles des credentials, les erreurs de console courantes et un correctif serveur pour Express, Next.js et nginx.

CORS (cross-origin resource sharing) permet à un serveur d'indiquer au navigateur que du JavaScript provenant d'une autre origine peut lire ses réponses. Le serveur répond avec Access-Control-Allow-Origin et les en-têtes associés. Les requêtes qui utilisent d'autres méthodes, des en-têtes personnalisés ou un corps JSON envoient d'abord une requête preflight OPTIONS. Le correctif se fait toujours sur le serveur que vous appelez, jamais sur la page.

Les en-têtes de réponse CORS en un coup d'œil

Une erreur CORS donne l'impression que votre code est cassé, alors que la requête a généralement bien atteint le serveur. Le navigateur a simplement refusé de transmettre la réponse à votre script. Le simulateur ci-dessous vous permet de décrire une requête et une configuration serveur, puis vous indique si un preflight est déclenché, si le navigateur laisse passer la réponse et quel message vous verriez dans la console.

Questions fréquentes

Pourquoi Postman ou curl fonctionnent alors que le navigateur échoue ?

CORS n'est appliqué que par les navigateurs, pour empêcher les scripts d'un site de lire les données d'un autre site avec vos cookies. Des outils comme curl n'exécutent pas de code de page non fiable, ils l'ignorent donc. La réponse du serveur était identique, seul le navigateur a décidé de la retenir.

Qu'est-ce qui déclenche une requête preflight ?

Toute méthode autre que GET, HEAD ou POST, tout en-tête hors de la courte liste autorisée (Accept, Accept-Language, Content-Language, Content-Type, Range), ou un Content-Type autre que l'encodage de formulaire, multipart ou text/plain. L'envoi de application/json est le déclencheur le plus courant.

Puis-je corriger CORS depuis le frontend ?

Non. Définir des en-têtes Access-Control sur votre requête ne sert à rien, et mode: no-cors vous donne une réponse opaque que votre script ne peut pas lire. Soit l'API ajoute les en-têtes, soit votre propre serveur récupère les données et les transmet.

Puis-je utiliser Access-Control-Allow-Origin: * avec des cookies ?

Non. Quand une requête transporte des credentials, le navigateur rejette une origine joker et exige l'origine exacte accompagnée de Access-Control-Allow-Credentials: true. Il en va de même pour les jokers dans les listes de méthodes, d'en-têtes et d'en-têtes exposés.

Pourquoi mon script ne peut-il pas lire un en-tête de réponse personnalisé ?

Par défaut, un script cross-origin ne voit qu'une courte liste d'en-têtes de réponse sûrs. Listez les autres dans Access-Control-Expose-Headers, par exemple X-Request-Id, et ils deviennent lisibles.

Même origine, et pourquoi le navigateur bloque la lecture

Requêtes simples et preflights

Lire l'erreur dans la console

Erreurs CORS courantes et comment les corriger

La formulation des messages varie selon le navigateur. Voici les raisons telles que Firefox les nomme sur MDN, Chrome dit la même chose avec des phrases plus longues.

Raisons CORS affichées dans la console et correctif côté serveur

Extraits serveur

Express : liste d'autorisation avec credentials

Renvoie l'origine uniquement si elle figure dans la liste, répond aux preflights avec 204 et ajoute Vary pour que les caches séparent les origines.

Route handler Next.js

Un endpoint public sans cookies peut utiliser le joker. Exportez OPTIONS pour que le preflight obtienne sa propre réponse.

nginx devant une API

Le drapeau always conserve l'en-tête sur les réponses d'erreur aussi, pour qu'une erreur 500 affiche son vrai statut au lieu d'une erreur CORS.

Côté navigateur : envoyer des cookies en cross-origin

credentials: "include" est ce qui active les règles plus strictes des credentials sur le serveur.

Simulateur de requête CORS

Décrivez une requête et les en-têtes CORS du serveur pour voir si un preflight est envoyé et si le navigateur laisse votre script lire la réponse.

La requête

La réponse du serveur

Origine de la page

Origine de l'API

Méthode

Content-Type

Pas de corps

En-tête de requête supplémentaire (vide si aucun)

Envoyer les cookies (credentials: include)

Access-Control-Allow-Origin

Access-Control-Allow-Methods

Access-Control-Allow-Headers

Access-Control-Allow-Credentials: true

Verdict

Même origine : CORS ne s'applique pas, la réponse est lisible.

Pas de preflight : il s'agit d'une requête simple.

Preflight nécessaire : le navigateur envoie d'abord OPTIONS.

Raison : la méthode n'est pas GET, HEAD ou POST.

Raison : l'en-tête {v} ne fait pas partie de la liste autorisée.

Raison : le Content-Type {v} ne fait pas partie des trois types simples.

Autorisé : votre script peut lire la réponse.

Bloqué. Raison dans la console :

En-têtes que le serveur doit envoyer

Commencer gratuitement · Sans carte bancaire

Voir aussi: Guides

Produit

Pour qui

Fonctionnalités

Ressources

Entreprise

Plan du site