Tester CORS

Dalej

Błędy CORS to „klasyczna“ czerwień w konsoli przeglądarki: wywołujesz API z innej domeny, a przeglądarka blokuje odpowiedź. Ten tester wysyła żądanie preflight OPTIONS do dowolnego adresu URL, który wkleisz, z wybranym przez Ciebie źródłem i metodą, a następnie dekoduje nagłówki Access-Control-*, dzięki czemu widzisz dokładnie, co serwer dopuszcza, co blokuje i dlaczego przeglądarka zgłasza błąd.

Jak przetestować CORS

  1. 1

    Wpisz docelowy adres URL

    Punkt końcowy API, który chcesz wywołać z frontendu. Uwzględnij ciąg zapytania i protokół.

  2. 2

    Ustaw metodę i źródło (origin)

    GET/POST/PUT/DELETE/PATCH. Źródłem może być adres Twojej witryny lub dowolne źródło, które chcesz zasymulować.

  3. 3

    Zrozum preflight

    Tester zawsze wysyła żądanie OPTIONS z wybranym źródłem i metodą oraz nagłówkiem Access-Control-Request-Headers: Content-Type, dokładnie taki preflight, jaki przeglądarka wysyła przed żądaniem JSON.

  4. 4

    Uruchom test

    Tester wysyła preflight, a następnie raportuje status HTTP oraz nagłówki odpowiedzi CORS: Allow-Origin, Allow-Methods, Allow-Headers, Allow-Credentials i Max-Age.

  5. 5

    Napraw błędną konfigurację

    Raport wskazuje, czego brakuje lub co jest błędne, brakujący Allow-Origin, niedozwolony nagłówek, niedozwolona metoda.

Nagłówki, które mają znaczenie

Nagłówek Do czego służy
Access-Control-Allow-Origin Które źródła mogą odczytać odpowiedź
Access-Control-Allow-Methods Preflight: które metody są dozwolone
Access-Control-Allow-Headers Preflight: które nagłówki żądania są dozwolone
Access-Control-Allow-Credentials Czy dozwolone są ciasteczka/uwierzytelnianie
Access-Control-Expose-Headers Które nagłówki odpowiedzi może odczytać JS
Access-Control-Max-Age Jak długo wynik preflight jest buforowany

Żądania proste vs. żądania z preflight

Żądanie jest „proste“ (bez preflight) tylko wtedy, gdy spełnione są wszystkie poniższe warunki:

  • Metoda to GET, HEAD lub POST.
  • Nagłówki ograniczają się do Accept, Accept-Language, Content-Language, Content-Type (o określonych wartościach).
  • Content-Type, jeśli występuje, to application/x-www-form-urlencoded, multipart/form-data lub text/plain.

Wszystko inne, treść JSON, nagłówek Authorization, własny nagłówek X-Foo, metoda PUT/DELETE/PATCH, wywołuje preflight OPTIONS. Serwer musi odpowiedzieć na preflight właściwymi nagłówkami Allow-*, w przeciwnym razie właściwe żądanie nigdy nie zostanie wysłane.

Typowe błędy CORS

  • „No Access-Control-Allow-Origin header“ → serwer nie ustawia tego nagłówka. Napraw to po stronie serwera, nie klienta.
  • *„Credentials mode requires Allow-Origin not to be → jeśli wysyłasz ciasteczka, Allow-Origin musi być konkretnym źródłem (lub odbiciem nagłówka Origin).
  • „Request header X not allowed“ → dodaj X do Access-Control-Allow-Headers w odpowiedzi na preflight.
  • „Method not allowed“ → dodaj tę metodę do Access-Control-Allow-Methods.
  • „Redirect not allowed in preflight“ → preflight nie może podążać za przekierowaniami. Punkt końcowy OPTIONS musi odpowiedzieć bezpośrednio.

Allow-Origin: * vs. odbicie nagłówka Origin

Access-Control-Allow-Origin: * jest liberalny, ale nie da się go łączyć z poświadczeniami. W środowisku produkcyjnym odbijaj nagłówek Origin z żądania (po weryfikacji względem listy dozwolonych) i ustaw Allow-Credentials: true, jeśli potrzebujesz ciasteczek.

Proxy jako obejście

Jeśli nie masz kontroli nad serwerem, cienkie proxy w Twojej domenie całkowicie eliminuje CORS, przeglądarka widzi żądanie jako same-origin. Wiele platform hostingowych (Vercel, Netlify, Cloudflare) oferuje reguły przepisywania (rewrite) właśnie do tego celu.

Najczęściej zadawane pytania

Aby uniemożliwić złośliwej stronie odczytanie prywatnych danych w innej witrynie przy użyciu ciasteczek z Twojej przeglądarki. Bez CORS odwiedzenie evil.com mogłoby pozwolić tej stronie na wysłanie żądania do wewnętrznego API Twojego banku w Twoim imieniu. CORS wymusza, by bank jawnie zezwolił na odczyty cross-origin.

Tylko podczas tworzenia oprogramowania. Chromium ma flagę --disable-web-security, ale wpływa ona na wszystkie witryny i jest niebezpieczna. Właściwym rozwiązaniem są nagłówki po stronie serwera lub proxy.

Postman nie jest przeglądarką, całkowicie ignoruje CORS. CORS jest egzekwowany wyłącznie przez przeglądarki dla żądań JavaScript. Serwer, który działa w Postmanie, nie jest automatycznie poprawny pod kątem CORS.

Obrazy i klasyczne tagi <script> ładują się cross-origin bez CORS, ale JS nie może odczytać ich zawartości. <img crossorigin> i fetch() egzekwują CORS, właśnie dlatego obrazy rysowane na canvasie stają się „skażone“ (tainted) bez niego.

Powiązane narzędzia