CORS spiegato: preflight, header e come risolvere gli errori CORS

CORS spiegato

CORS spiegato: preflight, header, errori e soluzioni | We.Inc

Come funziona CORS: richieste semplici e preflight, ogni header Access-Control, le regole sulle credenziali, gli errori più comuni in console e una soluzione lato server per Express, Next.js e nginx.

CORS (cross-origin resource sharing) è il modo in cui un server dice al browser che il JavaScript proveniente da un'altra origine può leggere le sue risposte. Il server risponde con Access-Control-Allow-Origin e gli header correlati. Le richieste che usano altri metodi, header personalizzati o body JSON inviano prima un preflight OPTIONS. La soluzione va sempre sul server che stai chiamando, mai sulla pagina.

Gli header di risposta CORS in sintesi

Un errore CORS sembra un bug nel tuo codice, eppure di solito la richiesta è arrivata al server senza problemi. Il browser si è semplicemente rifiutato di passare la risposta al tuo script. Il simulatore qui sotto ti permette di descrivere una richiesta e la configurazione del server, poi ti dice se parte un preflight, se il browser lascia passare la risposta e quale messaggio vedresti in console.

Domande frequenti

Perché Postman o curl funzionano mentre il browser fallisce?

CORS viene applicato solo dai browser, per impedire agli script di un sito di leggere i dati di un altro sito usando i tuoi cookie. Strumenti come curl non eseguono codice di pagine non affidabili, quindi lo ignorano. La risposta del server era identica: è stato solo il browser a decidere di trattenerla.

Cosa fa partire una richiesta di preflight?

Qualsiasi metodo diverso da GET, HEAD o POST, qualsiasi header al di fuori dei pochi ammessi (Accept, Accept-Language, Content-Language, Content-Type, Range), oppure un Content-Type diverso da codifica form, multipart o text/plain. Inviare application/json è la causa più comune.

Posso risolvere CORS dal frontend?

No. Impostare gli header Access-Control sulla tua richiesta non serve a nulla, e mode: no-cors ti restituisce una risposta opaca che il tuo script non può leggere. O l'API aggiunge gli header, oppure è il tuo server a recuperare i dati e a passarli avanti.

Posso usare Access-Control-Allow-Origin: * con i cookie?

No. Quando una richiesta porta credenziali, il browser rifiuta un'origine jolly e richiede l'origine esatta più Access-Control-Allow-Credentials: true. Lo stesso vale per i caratteri jolly negli elenchi di metodi, header ed expose headers.

Perché il mio script non riesce a leggere un header di risposta personalizzato?

Di default, uno script cross-origin vede solo un breve elenco di header di risposta sicuri. Elenca gli altri in Access-Control-Expose-Headers, per esempio X-Request-Id, e diventano leggibili.

Stessa origine, e perché il browser blocca le letture

Richieste semplici e preflight

Leggere l'errore in console

Errori CORS comuni e come risolverli

Il testo dei messaggi cambia da browser a browser. Questi sono i motivi come li chiama Firefox su MDN; Chrome dice le stesse cose con frasi più lunghe.

Motivi CORS in console e la soluzione lato server

Snippet per il server

Express: allowlist con credenziali

Restituisce l'origine solo quando è nell'elenco, risponde ai preflight con 204 e aggiunge Vary così le cache tengono separate le origini.

Route handler di Next.js

Un endpoint pubblico e senza cookie può usare il carattere jolly. Esporta OPTIONS così il preflight riceve una risposta tutta sua.

nginx davanti a un'API

Il flag always mantiene l'header anche sulle risposte di errore, così un 500 mostra comunque il suo stato reale invece di un errore CORS.

Lato browser: inviare cookie cross-origin

credentials: "include" è ciò che attiva sul server le regole più severe sulle credenziali.

Simulatore di richieste CORS

Descrivi una richiesta e gli header CORS del server per vedere se viene inviato un preflight e se il browser permette al tuo script di leggere la risposta.

La richiesta

La risposta del server

Origine della pagina

Origine dell'API

Metodo

Content-Type

Nessun body

Header di richiesta aggiuntivo (vuoto per nessuno)

Invia cookie (credentials: include)

Access-Control-Allow-Origin

Access-Control-Allow-Methods

Access-Control-Allow-Headers

Access-Control-Allow-Credentials: true

Verdetto

Stessa origine: CORS non si applica, la risposta è leggibile.

Nessun preflight: questa è una richiesta semplice.

Serve un preflight: il browser invia prima OPTIONS.

Motivo: il metodo non è GET, HEAD o POST.

Motivo: l'header {v} non è tra quelli ammessi.

Motivo: il Content-Type {v} non è uno dei tre tipi semplici.

Consentito: il tuo script può leggere la risposta.

Bloccato. Motivo in console:

Header che il server dovrebbe inviare

Inizia gratis · Nessuna carta di credito richiesta

Correlati: Guide

Prodotto

Per chi è

Funzionalità

Risorse

Azienda

Mappa del sito