logo
GeekFormat

Inspecteur CORS

Panneau de diagnostic CORS

Le serveur simule la requête preflight et la requête réelle pour déterminer rapidement si le problème vient de Allow-Origin, Allow-Headers ou credentials.

Simule côté serveur les requêtes preflight CORS et les requêtes réelles, vérifie les 6 en-têtes de réponse un par un, localise avec précision les erreurs de configuration cross-origin et fournit du code de correction pour plusieurs frameworks comme Nginx/Node.js/Spring.

Recommandations connexes

Cas d'utilisation

  • Lorsque l'erreur No 'Access-Control-Allow-Origin' header apparaît dans la console du navigateur, utilisez immédiatement cet outil pour vérifier les en-têtes CORS réellement renvoyés par l'API cible
  • Pendant la phase d'intégration frontend-backend dans des projets séparés, vérifiez que la configuration CORS du backend fonctionne correctement, évitant de perdre du temps à modifier la configuration à l'aveugle
  • Après avoir configuré un proxy inverse Nginx, Apache ou une API Gateway (Kong/APISIX/Spring Cloud Gateway), vérifiez que les règles CORS sont correctement transmises
  • Lorsque des requêtes cross-origin avec Cookie échouent, basculez le mode credentials pour détecter les conflits de configuration entre Allow-Credentials et Allow-Origin
  • Après avoir ajouté des en-têtes personnalisés (comme X-Token, X-Requested-With) la requête est bloquée, vérifiez s'ils sont correctement déclarés dans Allow-Headers
  • Des requêtes avec des méthodes non simples comme PUT/DELETE/PATCH échouent en CORS, vérifiez si Allow-Methods inclut la méthode correspondante
  • Le frontend ne peut pas lire les en-têtes de réponse personnalisés (comme X-Request-Id, X-Total-Count), vérifiez la configuration d'Access-Control-Expose-Headers
  • Après accélération par CDN, CORS fonctionne par intermittence, vérifiez si Vary: Origin est correctement configuré pour éviter que le CDN mette en cache des réponses incorrectes
  • Erreurs CORS occasionnelles en production, reproduisez le scénario du problème et conservez le message de réponse complet pour que le backend débogue
  • En apprenant les principes de CORS, observez la fonction de chaque en-tête de réponse via des requêtes réelles, approfondissant la compréhension du mécanisme cross-origin

Fonctionnalités

  • Simulation réelle côté serveur des requêtes preflight et réelles, sans interférence du cache navigateur ni des extensions, résultats plus précis
  • Affiche séparément la réponse preflight OPTIONS et la réponse réelle GET/POST, distinguant clairement à quelle étape le problème survient
  • Vérifie les 6 en-têtes CORS principaux un par un : Access-Control-Allow-Origin, Allow-Methods, Allow-Headers, Allow-Credentials, Expose-Headers, Max-Age, chaque en-tête marqué individuellement avec statut réussite/avertissement/erreur
  • Détecte intelligemment le conflit classique entre le joker * et le mode credentials, alertant immédiatement sur ce piège de configuration le plus courant
  • Prend en charge l'origine de requête Origin personnalisée, les méthodes HTTP (GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS) et des en-têtes de requête personnalisés arbitraires
  • Permet de basculer le mode avec ou sans identifiants (Cookie/en-tête Authorization/certificats client TLS), simulant des scénarios avec withCredentials=true
  • Détecte automatiquement si l'en-tête Vary: Origin est correctement configuré, évitant que CDN/proxy inverse mettent en cache des réponses CORS incorrectes
  • Affiche de manière structurée la configuration du cache preflight Max-Age, évaluant l'impact de la fréquence des requêtes preflight sur les performances
  • Vérifie la configuration d'Access-Control-Expose-Headers, confirmant quels en-têtes de réponse peuvent être lus par JavaScript côté frontend
  • Fournit des recommandations de correction ligne par ligne, incluant des exemples de configuration pour les principaux frameworks serveur comme Nginx, Apache, Node.js/Express, Spring Boot, Python/Django/Flask
  • Enregistre complètement les messages bruts de requête et de réponse, incluant le code de statut, tous les en-têtes de réponse, l'aperçu du corps de réponse, facilitant le débogage approfondi
  • Identifie automatiquement les différences entre requêtes simples et requêtes nécessitant preflight, expliquant pourquoi votre requête déclenche le preflight OPTIONS
  • Détecte les problèmes CORS dans les scénarios de redirection (si l'Origin change après des redirections 301/302/307/308)
  • Prend en charge la détection de scénarios de contenu mixte HTTPS/HTTP, alertant sur les problèmes liés à CORS causés par du contenu mixte

Comment utiliser

  1. Dans le champ URL de destination, saisissez l'adresse complète de l'API à vérifier (prend en charge http/https, doit inclure le chemin)
  2. Dans le champ Origin de la requête, saisissez l'origine réelle de votre page frontend (comme https://example.com, important d'inclure le protocole et le port, sans chemin)
  3. Sélectionnez la méthode HTTP (GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS), par défaut GET
  4. Dans la zone des en-têtes personnalisés, ajoutez les en-têtes que vous devez envoyer, un par ligne au format X-Token: abc123. Content-Type avec des types non simples comme application/json déclenchera automatiquement preflight
  5. Cochez l'option « Avec identifiants (credentials) » selon votre scénario ; si votre code frontend utilise withCredentials=true ou credentials: 'include' dans fetch, vous devez la cocher
  6. Cliquez sur le bouton « Commencer la vérification », l'outil enverra séquentiellement depuis le serveur la requête preflight OPTIONS et la requête réelle (si le preflight réussit ou n'est pas nécessaire)
  7. Consultez le rapport d'analyse : regardez d'abord le résultat d'évaluation globale, puis vérifiez l'état de chaque en-tête CORS un par un, ajustez la configuration du serveur selon les recommandations de correction des erreurs en rouge, revérifiez après correction

FAQ

Pourquoi avec Postman/curl l'API fonctionne bien, mais quand le navigateur accède il signale une erreur cross-origin ?

C'est le problème CORS le plus classique ! Parce que Postman et curl ne sont absolument pas soumis à la politique de même origine du navigateur — ce sont des clients HTTP, pas des navigateurs, ils n'interceptent pas les réponses, et n'envoient pas non plus automatiquement de requêtes preflight OPTIONS. Les erreurs cross-origin sont un mécanisme de sécurité exclusif au navigateur ; seul l'environnement d'exécution JavaScript du navigateur effectue des vérifications CORS. Que Postman puisse se connecter ne démontre que l'API elle-même peut retourner des données, ne démontre pas que la configuration CORS est correcte. Vous devez utiliser le navigateur, ou cet outil (qui simule le flux CORS du navigateur sur le serveur) pour vérifier, et là vous découvrirez le problème.

L'erreur CORS est-elle un problème du frontend ou du backend ? Qui doit la corriger ?

99% des erreurs CORS sont des problèmes de configuration du backend (ou des problèmes de configuration dans la couche Nginx/gateway), le frontend peut faire très peu. Le cœur de CORS est que le serveur « autorise » le navigateur via des en-têtes de réponse pour permettre l'accès cross-origin ; le frontend ne peut que configurer withCredentials, définir des en-têtes de requête, etc., il ne peut pas contourner les restrictions de sécurité du navigateur. Les proxys du frontend dont on parle sur internet (proxy devServer, proxy inverse Nginx qui proxifient frontend et API sur la même origine) essentiellement « trompent » le navigateur en lui faisant croire que c'est une requête de même origine, ils ne résolvent pas réellement le problème CORS ; en production si frontend et backend sont de différentes origines le backend doit encore configurer CORS correctement.

Pourquoi ma requête GET n'a pas de cross-origin, mais dès que je la change en POST/PUT apparaît cross-origin ?

Parce que GET remplit normalement les conditions de requête simple, le navigateur envoie la requête directement ; tandis que POST si vous envoyez Content-Type: application/json (90% des APIs POST sont ça), n'appartient plus à une requête simple, déclenchera preflight OPTIONS. La requête preflight nécessite que le serveur retourne les en-têtes CORS corrects ; beaucoup de gens n'ont configuré les en-têtes CORS que pour GET/POST mais n'ont pas géré la méthode OPTIONS, ou la réponse OPTIONS n'a pas d'en-têtes, donc ça signale une erreur. Les méthodes PUT/DELETE/PATCH par elles-mêmes ne sont pas des méthodes simples, inévitablement elles déclenchent preflight.

Comment résoudre le cross-origin en environnement de développement ? Et en production ?

En environnement de développement il y a plusieurs solutions : ① Proxy intégré au framework (devServer.proxy de Vue CLI, server.proxy de Vite, proxy de Create React App) : proxifie les requêtes d'API sur la même origine que le serveur de développement du frontend, le navigateur croit que c'est une requête de même origine sans cross-origin ; ② Désactiver les paramètres de sécurité du navigateur (par exemple Chrome avec le paramètre de démarrage --disable-web-security), seulement pour tests temporaires locaux, absolument pas pour la navigation normale ; ③ Configurer CORS sur le backend en autorisant l'origine localhost (recommandé, comportement cohérent avec la production). En production le backend doit configurer CORS correctement : configurer une liste blanche d'origines autorisées, définir correctement Allow-Methods/Allow-Headers/Allow-Credentials, ajouter Vary: Origin, ou utiliser gateway/Nginx pour gérer CORS de manière unifiée.

Peut-on configurer Access-Control-Allow-Origin avec plusieurs origines ? Comment configurer plusieurs domaines pour autoriser le cross-origin ?

Non, l'en-tête de réponse Access-Control-Allow-Origin ne peut avoir qu'une seule valeur, soit une origine spécifique (comme https://a.com), soit *. Le navigateur n'accepte pas plusieurs origines (par exemple écrire https://a.com,https://b.com est invalide, le navigateur le considérera comme non correspondant). La bonne façon de configurer multi-origines est : le serveur maintient une liste blanche d'origines autorisées, à chaque fois qu'il reçoit une requête il lit la valeur d'Origin dans l'en-tête de requête, vérifie si cette Origin est dans la liste blanche, si oui définit Access-Control-Allow-Origin comme cette valeur d'Origin spécifique, et retourne en même temps l'en-tête Vary: Origin ; si non, ne retourne pas d'en-têtes CORS ou retourne une erreur. N'essayez pas de retourner plusieurs en-têtes Allow-Origin ou de séparer plusieurs valeurs par virgule, le navigateur ne les reconnaît pas.

La requête preflight OPTIONS nécessite-t-elle de retourner de la logique métier ? Peut-elle retourner directement 204 ?

La requête preflight OPTIONS n'a pas besoin de retourner aucune logique métier ni corps de réponse, elle n'a besoin que de retourner les en-têtes de réponse CORS corrects et le code de statut 200/204 est suffisant. Le navigateur en recevant les en-têtes CORS corrects considère que le preflight a réussi, il ne lira pas le contenu du body de la réponse OPTIONS. Donc la meilleure pratique est : intercepter directement les requêtes OPTIONS dans la couche Nginx/gateway, retourner 204 No Content et les en-têtes CORS corrects, sans renvoyer au serveur d'applications backend ; cela allège la charge du backend et évite également les erreurs 405 causées par des routes backend qui ne prennent pas en charge OPTIONS. Mais assurez-vous que les en-têtes CORS de la réponse OPTIONS sont cohérents avec les en-têtes CORS de la requête réelle.

Pourquoi j'ai configuré withCredentials: true, mais Cookie n'est pas emporté ?

Les requêtes cross-origin avec Cookie nécessitent de remplir simultanément trois conditions : ① XMLHttpRequest.withCredentials = true sur le frontend ou credentials: 'include' dans fetch ; ② En-tête de réponse backend Access-Control-Allow-Credentials: true ; ③ Access-Control-Allow-Origin ne peut pas être *, doit être une origine spécifique. Les trois conditions sont indispensables. De plus faites attention aux attributs de Cookie : le Cookie doit avoir défini SameSite=None; Secure (environnement HTTPS) pour pouvoir être emporté dans des requêtes cross-origin ; si le Cookie est SameSite=Lax ou Strict, dans des requêtes cross-origin il ne sera pas emporté ; l'attribut Domain du Cookie doit être configuré correctement ; faites également attention à l'impact des politiques de Cookie tierces (des navigateurs comme Chrome ont des restrictions sur les Cookies tiers).

Quelle relation y a-t-il entre CORS et CSRF ? Configurer CORS causera-t-il des vulnérabilités CSRF ?

CORS est un relâchement des restrictions d'accès cross-origin, CSRF est une attaque de falsification de requête intersite, ce sont des concepts différents. Configurer CORS correctement ne cause pas directement de vulnérabilités CSRF — parce que CORS ne permet qu'à JS de lire les réponses, tandis que CSRF c'est quand un attaquant induit l'utilisateur à envoyer des requêtes à son insu (comme des balises img, envoi automatique de formulaires), ces requêtes même sans CORS sont envoyées en emportant Cookie. Défendre CSRF nécessite d'utiliser CSRF Token, SameSite Cookie, vérifier Origin/Referer et d'autres solutions, on ne peut pas défendre CSRF en désactivant CORS. Mais si lors de la configuration CORS vous définissez Allow-Origin comme * et autorisez les identifiants, ça amplifiera effectivement le risque CSRF, c'est pourquoi dans des scénarios avec identifiants on ne peut absolument pas utiliser *, vous devez restreindre strictement la liste blanche d'origines.

Le téléchargement de fichiers, les redirections, le chargement de balises img/script ont-ils des problèmes CORS ?

Le chargement de ressources cross-origin avec des balises <img>, <script>, <link> normales (images CDN, scripts JS, CSS) par défaut n'a pas de problèmes CORS ; ce sont des « ressources incorporées » pas des « requêtes AJAX », le navigateur permet de les charger mais JS ne peut pas en lire le contenu. Mais si vous voulez manipuler des images cross-origin dans Canvas, ou charger ces ressources avec fetch/XHR et en lire le contenu, alors vous avez besoin de CORS, et en même temps vous devez ajouter l'attribut crossorigin sur la balise. Le téléchargement de fichiers cross-origin (clic sur balise a pour télécharger) par défaut ne nécessite pas non plus CORS. Les redirections affectent CORS : si la requête preflight OPTIONS retourne une redirection 3xx, le navigateur la rejettera directement (Preflight redirect is not allowed) ; si la redirection de la requête réelle est entre différentes origines, chaque saut doit retourner correctement les en-têtes CORS.

Comment configurer CORS correctement dans Nginx ? Donnez un exemple de configuration fonctionnelle ?

Points clés de configuration recommandée dans Nginx : ① Utiliser la directive map pour correspondre à la liste blanche d'Origins, en définissant dynamiquement la variable $cors_origin ; ② Les requêtes OPTIONS retournent directement 204 sans renvoyer au backend ; ③ add_header rappelez-vous d'ajouter le paramètre always pour vous assurer que les réponses d'erreur comportent également l'en-tête ; ④ Ajouter Vary: Origin ; ⑤ Configurer correctement Allow-Methods/Allow-Headers/Credentials. Vous pouvez trouver des configurations d'exemple dans les recommandations de correction des résultats de détection de cet outil ; nous fournissons des fragments de configuration vérifiés pour les frameworks principaux comme Nginx, Apache, Node.js Express, Spring Boot, Python Flask/Django, Koa, Go Gin.

Après avoir configuré CORS, comment vérifier si ça prend effet ?

Étapes pour vérifier CORS : ① D'abord utilisez la détection en ligne de cet outil, entrez URL, Origin, méthode, en-têtes, option d'identifiants, regardez si chaque vérification du preflight et de la requête réelle passe ; ② Ouvrez le panneau Network de DevTools du navigateur, cochez Disable cache pour désactiver le cache (en évitant l'interférence d'ancien cache), déclenchez la requête cross-origin, vérifiez que les en-têtes de réponse du preflight OPTIONS et de la requête réelle sont corrects ; ③ Dans Console regardez s'il y a des erreurs liées à CORS ; ④ Testez différents scénarios : requêtes GET sans en-têtes personnalisés, requêtes POST avec application/json, méthodes PUT/DELETE, avec Cookie/sans Cookie, avec en-têtes personnalisés ; ⑤ Simulez une requête OPTIONS avec curl : curl -i -X OPTIONS -H "Origin: https://yoursource.com" https://api.example.com/endpoint, vérifiez que les en-têtes de réponse sont corrects.

Pourquoi la requête cross-origin signale une erreur sur Chrome mais fonctionne normalement sur Safari/Firefox ? Ou l'inverse ?

Différents navigateurs ont des différences dans les détails d'implémentation de la spécification CORS : ① Safari a des restrictions plus strictes sur Max-Age du cache preflight (anciennes versions seulement 600 secondes), la politique de Cookies (ITP anti-pistage intelligent) est également plus stricte, peut causer des problèmes de Cookie cross-origin ; ② Chrome a des vérifications plus strictes sur les jokers avec identifiants, Allow-Headers/Allow-Methods n'autorisent pas non plus *, certaines versions de Firefox peuvent être plus laxistes ; ③ L'ancien IE (IE11) utilise XDomainRequest au lieu de XMLHttpRequest standard, l'implémentation CORS a beaucoup de pièges (par exemple ne prend pas en charge les en-têtes personnalisés, ne prend en charge que GET/POST) ; ④ Différents navigateurs ont des différences subtiles dans la gestion de l'en-tête Vary, la gestion des redirections, la gestion des en-têtes de sécurité. La solution est de configurer strictement selon la spécification CORS, ne pas dépendre du comportement compatible d'un navigateur spécifique.

Combien est-il approprié de définir Access-Control-Max-Age ? Quels problèmes y a-t-il si c'est trop long ou trop court ?

Il est recommandé de définir entre 3600 (1 heure) et 86400 (24 heures). Définir trop court (comme 60 secondes) : le cache preflight expire rapidement, envoyant fréquemment des requêtes OPTIONS, augmentant le temps de requête et la pression du serveur, l'impact est notable dans des environnements de réseau mobile faible. Définir trop long (comme 31536000, c'est-à-dire un an) : si vous mettez à jour la configuration CORS (par exemple en ajoutant des méthodes autorisées, en-têtes), l'ancien résultat preflight en cache dans le navigateur de l'utilisateur peut prendre beaucoup de temps à expirer, pendant cette période apparaîtront des problèmes de configuration qui ne prend pas effet. De plus Chrome et Firefox tronqueront automatiquement les valeurs qui dépassent 86400 secondes à 86400 secondes, peu importe comment vous le définissez ça ne sert à rien. En environnement de développement vous pouvez définir -1 pour désactiver le cache preflight, facilitant le débogage.

Les connexions WebSocket ont-elles des problèmes cross-origin ? CORS s'applique-t-il à WebSocket ?

WebSocket (ws:// et wss://) ne sont pas soumis au mécanisme CORS HTTP, parce que WebSocket est un protocole indépendant, ce ne sont pas des requêtes HTTP AJAX. Mais la phase de handshake de WebSocket est une requête HTTP ; le serveur peut vérifier l'en-tête Origin pour décider s'il autorise la connexion — c'est un contrôle de permissions au niveau WebSocket, pas du CORS standard, mais le principe est similaire. Si la connexion WebSocket est rejetée, vous devez vérifier la configuration de vérification Origin du serveur WebSocket, pas les en-têtes CORS HTTP. Des bibliothèques comme Socket.IO peuvent avoir leur propre façon de configurer le cross-origin, similaire à la configuration CORS standard mais pas exactement identique. De plus, d'autres APIs du navigateur comme HTTP/2 Server Push, WebRTC ont également leur propre contrôle de permissions, ne suivent pas complètement le CORS HTTP.

Les résultats de détection de cet outil sont-ils cohérents avec le comportement du navigateur ? Pourquoi avec l'outil la détection passe mais le navigateur signale toujours une erreur ?

Cet outil sur le serveur simule strictement selon la spécification W3C CORS le flux de preflight et de requête réelle du navigateur, la logique de vérification des en-têtes CORS est fondamentalement cohérente avec les navigateurs modernes. Si l'outil détecte que ça passe mais le navigateur signale toujours une erreur, les causes possibles sont : ① Le navigateur a mis en cache des résultats preflight ou d'anciennes réponses, faites un rechargement forcé Ctrl+F5 ou effacez le cache et réessayez ; ② Des extensions du navigateur (blocage de publicité, protection de la vie privée, plugins de sécurité) ont modifié ou intercepté la requête ; ③ L'Origin, les en-têtes de requête, la méthode, l'option d'identifiants que vous avez écrits dans l'outil ne sont pas cohérents avec ce que le frontend envoie réellement (par exemple le frontend emporte réellement un en-tête personnalisé que vous n'avez pas ajouté dans l'outil) ; ④ Cache incohérent sur les nœuds CDN/proxy, le nœud auquel l'outil demande et le nœud auquel le navigateur demande retournent des résultats différents ; ⑤ Le navigateur a des politiques de sécurité spéciales (comme les requêtes vers du contenu mixte HTTP dans des pages HTTPS sont bloquées, restrictions spéciales du protocole file:// de fichiers locaux).

术语表

CORS (Cross-Origin Resource Sharing)
Partage de Ressources Cross-Origin, standard W3C, qui permet au serveur de déclarer quelles origines peuvent accéder aux ressources via de nouveaux champs d'en-tête HTTP, c'est la solution officielle des navigateurs modernes pour résoudre les problèmes cross-origin.
Politique de Même Origine (Same-Origin Policy)
Mécanisme de sécurité central du navigateur ; seulement quand protocole, domaine et port sont exactement identiques on considère comme même origine, et JavaScript d'origines différentes par défaut ne peut pas lire les ressources de l'autre.
Requête Preflight (Preflight Request)
Requête avec la méthode OPTIONS que le navigateur envoie automatiquement d'abord pour les requêtes cross-origin non simples, utilisée pour demander au serveur s'il autorise la requête réelle suivante ; ce n'est qu'après avoir réussi le preflight que la requête réelle est envoyée.
Requête Simple (Simple Request)
Requête cross-origin qui remplit des conditions spécifiques (méthode GET/HEAD/POST, seulement en-têtes sécurisés, Content-Type spécifique), qui n'a pas besoin d'envoyer de preflight et envoie directement la requête réelle.
Access-Control-Allow-Origin (ACAO)
En-tête de réponse CORS principal, spécifie l'origine autorisée à accéder à la ressource, peut être un URI d'origine spécifique ou joker *, avec identifiants on ne peut pas utiliser *.
Access-Control-Allow-Methods (ACAM)
En-tête de réponse preflight, liste toutes les méthodes HTTP prises en charge par le serveur, plusieurs méthodes séparées par virgule.
Access-Control-Allow-Headers (ACAH)
En-tête de réponse preflight, liste tous les champs d'en-tête de requête autorisés par le serveur ; les en-têtes personnalisés envoyés par le frontend doivent être déclarés ici.
Access-Control-Allow-Credentials (ACAC)
En-tête de réponse, valeur booléenne true indique qu'il est permis d'emporter des identifiants comme Cookie et Authorization dans les requêtes cross-origin ; dans ce cas Allow-Origin ne peut pas être *.
Access-Control-Max-Age (ACMA)
En-tête de réponse preflight, spécifie la durée de cache du résultat preflight en secondes ; une configuration raisonnable peut réduire les requêtes OPTIONS en améliorant les performances.
Vary: Origin
En-tête de réponse, dit au CDN/proxy que le contenu de la réponse varie selon l'en-tête Origin, lors de la mise en cache il faut inclure Origin comme clé de cache pour éviter le désordre de cache des réponses cross-origin.
En-têtes de requête de liste sécurisée CORS (CORS-safelisted request headers)
En-têtes de requête qui peuvent être envoyés sans avoir besoin de les déclarer dans Allow-Headers, incluant Accept, Accept-Language, Content-Language, Content-Type (valeurs spécifiques), etc.
Noms d'en-tête interdits (Forbidden header name)
En-têtes de requête que le navigateur interdit à JavaScript de définir par programmation, comme Host, Connection, Cookie, Origin, etc. ; ces en-têtes sont contrôlés automatiquement par le navigateur.
Requête avec identifiants (Credentialed Request)
Requête cross-origin qui comporte des identifiants d'identité comme Cookie, informations d'authentification HTTP, certificats client TLS ; nécessite que frontend et backend configurent conjointement withCredentials et Allow-Credentials.
Access-Control-Expose-Headers
En-tête de réponse, liste les en-têtes de réponse auxquels JavaScript peut accéder ; par défaut seulement quelques en-têtes basiques sont accessibles, les en-têtes personnalisés doivent être déclarés ici.
Méthode OPTIONS
Une des méthodes HTTP, utilisée pour obtenir les options de communication prises en charge par le serveur ; CORS l'utilise pour envoyer des requêtes preflight, demandant au serveur les méthodes, en-têtes, identifiants autorisés.
En-tête de requête Origin
En-tête de requête ajouté automatiquement par le navigateur, indique de quelle origine provient la requête actuelle (protocole+domaine+port) ; le serveur détermine s'il autorise le cross-origin selon cet en-tête.
Attribut crossorigin
Attribut d'éléments HTML (comme script, img, link), utilisé pour spécifier si on active le chargement de ressources avec CORS ; les valeurs sont anonymous (sans identifiants) et use-credentials (avec identifiants).
Mode de requête no-cors
Un mode de l'API fetch, qui permet d'envoyer des requêtes cross-origin mais ne peut envoyer que des requêtes simples et JavaScript ne peut pas lire le contenu de la réponse, équivalent à envoyer une requête opaque (Opaque Response).

Tableau de comparaison complet des en-têtes de réponse CORS

Tableau de détermination des requêtes qui déclenchent preflight

Tableau de référence rapide des erreurs CORS courantes et solutions

Troubleshooting