CORS wyjaśniony: preflight, nagłówki i naprawianie błędów CORS

CORS wyjaśniony

CORS wyjaśniony: preflight, nagłówki, błędy i poprawki | We.Inc

Jak działa CORS: proste żądania i preflight, wszystkie nagłówki Access-Control, zasady dotyczące credentials, typowe błędy w konsoli i poprawka po stronie serwera dla Express, Next.js i nginx.

CORS (cross-origin resource sharing) to sposób, w jaki serwer informuje przeglądarkę, że JavaScript z innego originu może odczytywać jego odpowiedzi. Serwer odpowiada nagłówkiem Access-Control-Allow-Origin i nagłówkami pokrewnymi. Żądania z innymi metodami, własnymi nagłówkami lub treścią JSON najpierw wysyłają preflight OPTIONS. Poprawka zawsze należy do serwera, który wywołujesz, nigdy do strony.

Nagłówki odpowiedzi CORS w skrócie

Błąd CORS wygląda tak, jakby Twój kod był zepsuty, a tymczasem żądanie zwykle bez problemu dotarło do serwera. Przeglądarka po prostu odmówiła przekazania odpowiedzi Twojemu skryptowi. Poniższy symulator pozwala opisać żądanie i konfigurację serwera, a potem pokazuje, czy zostanie wysłany preflight, czy przeglądarka przepuści odpowiedź i jaki komunikat zobaczysz w konsoli.

Najczęściej zadawane pytania

Dlaczego Postman lub curl działa, a przeglądarka nie?

CORS jest egzekwowany tylko przez przeglądarki, aby skrypty jednej strony nie mogły odczytywać danych innej strony z użyciem Twoich ciasteczek. Narzędzia takie jak curl nie uruchamiają niezaufanego kodu strony, więc go ignorują. Odpowiedź serwera była identyczna; to tylko przeglądarka zdecydowała się jej nie przekazać.

Co wywołuje żądanie preflight?

Każda metoda inna niż GET, HEAD lub POST, każdy nagłówek spoza kilku bezpiecznych (Accept, Accept-Language, Content-Language, Content-Type, Range) albo Content-Type inny niż kodowanie formularza, multipart lub text/plain. Wysyłanie application/json to najczęstsza przyczyna.

Czy mogę naprawić CORS po stronie frontendu?

Nie. Ustawienie nagłówków Access-Control w Twoim żądaniu nic nie daje, a mode: no-cors zwraca nieprzezroczystą odpowiedź, której Twój skrypt nie może odczytać. Albo API doda nagłówki, albo Twój własny serwer pobierze dane i je przekaże.

Czy mogę użyć Access-Control-Allow-Origin: * razem z ciasteczkami?

Nie. Gdy żądanie zawiera credentials, przeglądarka odrzuca wieloznaczny origin i wymaga dokładnego originu oraz Access-Control-Allow-Credentials: true. To samo dotyczy symboli wieloznacznych na listach metod, nagłówków i nagłówków udostępnianych.

Dlaczego mój skrypt nie może odczytać własnego nagłówka odpowiedzi?

Skrypt z innego originu domyślnie widzi tylko krótką listę bezpiecznych nagłówków odpowiedzi. Wymień pozostałe w Access-Control-Expose-Headers, na przykład X-Request-Id, a staną się dostępne do odczytu.

Ten sam origin i dlaczego przeglądarka blokuje odczyt

Proste żądania i preflighty

Jak czytać błąd w konsoli

Typowe błędy CORS i jak je naprawić

Treść komunikatów różni się w zależności od przeglądarki. Poniżej są przyczyny w brzmieniu, jakie nadaje im Firefox na MDN; Chrome mówi to samo dłuższymi zdaniami.

Przyczyny CORS w konsoli i poprawka po stronie serwera

Fragmenty kodu serwera

Express: lista dozwolonych z credentials

Odsyła origin tylko wtedy, gdy jest na liście, odpowiada na preflighty statusem 204 i dodaje Vary, aby cache rozdzielał originy.

Route handler w Next.js

Publiczny endpoint bez ciasteczek może używać symbolu wieloznacznego. Wyeksportuj OPTIONS, aby preflight dostał własną odpowiedź.

nginx przed API

Flaga always zachowuje nagłówek także w odpowiedziach z błędem, więc 500 nadal pokazuje swój prawdziwy status zamiast błędu CORS.

Strona przeglądarki: wysyłanie ciasteczek między originami

To credentials: "include" włącza na serwerze surowsze zasady dotyczące credentials.

Symulator żądań CORS

Opisz żądanie i nagłówki CORS serwera, aby zobaczyć, czy zostanie wysłany preflight i czy przeglądarka pozwoli Twojemu skryptowi odczytać odpowiedź.

Żądanie

Odpowiedź serwera

Origin strony

Origin API

Metoda

Content-Type

Brak treści

Dodatkowy nagłówek żądania (puste, jeśli brak)

Wysyłaj ciasteczka (credentials: include)

Access-Control-Allow-Origin

Access-Control-Allow-Methods

Access-Control-Allow-Headers

Access-Control-Allow-Credentials: true

Werdykt

Ten sam origin: CORS nie ma zastosowania, odpowiedź można odczytać.

Bez preflightu: to proste żądanie.

Potrzebny preflight: przeglądarka najpierw wysyła OPTIONS.

Powód: metoda nie jest GET, HEAD ani POST.

Powód: nagłówek {v} nie jest na liście bezpiecznych.

Powód: Content-Type {v} nie jest żadnym z trzech prostych typów.

Dozwolone: Twój skrypt może odczytać odpowiedź.

Zablokowane. Przyczyna w konsoli:

Nagłówki, które serwer powinien wysłać

Zacznij za darmo · Bez karty kredytowej

Powiązane: Poradniki

Produkt

Dla kogo

Funkcje

Zasoby

Firma

Mapa strony