CORS uitgelegd: preflight, headers en CORS-fouten oplossen

CORS uitgelegd

CORS uitgelegd: preflight, headers, fouten en oplossingen | We.Inc

Zo werkt CORS: simple vs preflight requests, elke Access-Control-header, regels voor credentials, de veelvoorkomende consolefouten en een serverfix voor Express, Next.js en nginx.

CORS (cross-origin resource sharing) is de manier waarop een server de browser vertelt dat JavaScript van een andere origin zijn responses mag lezen. De server antwoordt met Access-Control-Allow-Origin en verwante headers. Requests met andere methodes, eigen headers of JSON-bodies sturen eerst een OPTIONS-preflight. De oplossing hoort altijd thuis op de server die u aanroept, nooit op de pagina.

De CORS-responseheaders in één oogopslag

Een CORS-fout lijkt erop dat uw code kapot is, terwijl de request de server meestal gewoon heeft bereikt. De browser weigerde alleen het antwoord aan uw script te geven. Met de simulator hieronder beschrijft u een request en een serverconfiguratie, en ziet u of er een preflight wordt verstuurd, of de browser de response doorlaat en welke consolemelding u zou krijgen.

Veelgestelde vragen

Waarom werkt het in Postman of curl wel en in de browser niet?

CORS wordt alleen door browsers afgedwongen, om te voorkomen dat scripts van de ene site met uw cookies gegevens van een andere site lezen. Tools zoals curl draaien geen onbetrouwbare paginacode en negeren het dus. De response van de server was identiek; alleen de browser besloot hem achter te houden.

Wat veroorzaakt een preflight-request?

Elke methode behalve GET, HEAD of POST, elke header buiten de paar toegestane (Accept, Accept-Language, Content-Language, Content-Type, Range), of een Content-Type anders dan formuliercodering, multipart of text/plain. Het versturen van application/json is de meest voorkomende oorzaak.

Kan ik CORS vanuit de frontend oplossen?

Nee. Access-Control-headers op uw request zetten doet niets, en mode: no-cors geeft u een opaque response die uw script niet kan lezen. Ofwel voegt de API de headers toe, ofwel haalt uw eigen server de gegevens op en geeft ze door.

Kan ik Access-Control-Allow-Origin: * gebruiken met cookies?

Nee. Als een request credentials meestuurt, weigert de browser een wildcard-origin en eist hij de exacte origin plus Access-Control-Allow-Credentials: true. Hetzelfde geldt voor wildcards in de lijsten met methodes, headers en expose headers.

Waarom kan mijn script een eigen responseheader niet lezen?

Een cross-origin script ziet standaard alleen een korte lijst veilige responseheaders. Zet andere headers in Access-Control-Expose-Headers, bijvoorbeeld X-Request-Id, en ze worden leesbaar.

Same origin, en waarom de browser het lezen blokkeert

Simple requests en preflights

De consolefout lezen

Veelvoorkomende CORS-fouten en hoe u ze oplost

De formulering van meldingen verschilt per browser. Dit zijn de redenen zoals Firefox ze op MDN noemt; Chrome zegt hetzelfde in langere zinnen.

CORS-consoleredenen en de oplossing op de server

Serverfragmenten

Express: allowlist met credentials

Geeft de origin alleen terug als die op de lijst staat, beantwoordt preflights met 204 en voegt Vary toe zodat caches origins uit elkaar houden.

Next.js-route-handler

Een publiek endpoint zonder cookies kan de wildcard gebruiken. Exporteer OPTIONS zodat de preflight een eigen antwoord krijgt.

nginx vóór een API

De always-vlag houdt de header ook op foutresponses, zodat een 500 zijn echte status laat zien in plaats van een CORS-fout.

De browserkant: cookies cross-origin versturen

credentials: "include" is wat de strengere credentials-regels op de server activeert.

CORS-requestsimulator

Beschrijf een request en de CORS-headers van de server om te zien of er een preflight wordt verstuurd en of de browser uw script de response laat lezen.

De request

Het antwoord van de server

Origin van de pagina

Origin van de API

Methode

Content-Type

Geen body

Extra requestheader (leeg voor geen)

Cookies meesturen (credentials: include)

Access-Control-Allow-Origin

Access-Control-Allow-Methods

Access-Control-Allow-Headers

Access-Control-Allow-Credentials: true

Oordeel

Same origin: CORS is niet van toepassing, de response is leesbaar.

Geen preflight: dit is een simple request.

Preflight nodig: de browser stuurt eerst OPTIONS.

Reden: de methode is niet GET, HEAD of POST.

Reden: de header {v} staat niet op de lijst met toegestane headers.

Reden: Content-Type {v} is niet een van de drie simple types.

Toegestaan: uw script kan de response lezen.

Geblokkeerd. Consolereden:

Headers die de server moet sturen

Gratis beginnen · Geen creditcard nodig

Gerelateerd: Gidsen

Product

Voor wie

Functies

Bronnen

Bedrijf

Sitemap