CORS
Jak działa
Przeglądarka do każdego żądania między-originowego dołącza nagłówek Origin. Dla żądań prostych (simple requests) — metoda GET, HEAD lub POST, tylko nagłówki z tzw. safelisty, a dla POST Content-Type ograniczony do application/x-www-form-urlencoded, multipart/form-data lub text/plain — przeglądarka wysyła żądanie od razu, a następnie sprawdza, czy odpowiedź zawiera pasujący nagłówek Access-Control-Allow-Origin; jeśli nie, blokuje odczyt odpowiedzi przez skrypt. Dla żądań nie spełniających warunków prostych (własne nagłówki, inne metody, inny Content-Type, tryb credentials: include) przeglądarka wykonuje najpierw preflight: automatyczne żądanie OPTIONS z nagłówkami Access-Control-Request-Method i Access-Control-Request-Headers. Serwer odpowiada (zwykle 204) nagłówkami Access-Control-Allow-Origin, Access-Control-Allow-Methods, Access-Control-Allow-Headers oraz opcjonalnie Access-Control-Max-Age (czas cache preflightu). Dopiero po akceptacji wysyłane jest właściwe żądanie. Przy żądaniach z poświadczeniami (ciasteczka, HTTP auth) serwer musi zwrócić Access-Control-Allow-Credentials: true, a symbol wieloznaczny „*" jest wtedy zabroniony dla Access-Control-Allow-Origin (i pokrewnych) — trzeba podać konkretny origin, inaczej przeglądarka zablokuje odpowiedź. Nagłówek Access-Control-Expose-Headers wskazuje, które nagłówki odpowiedzi spoza safelisty skrypt może odczytać.
Rozwiązany problem
Same-Origin Policy blokuje odczyt odpowiedzi na żądania między-originowe wykonywane ze skryptu, co uniemożliwiałoby legalnym aplikacjom (np. frontend pod jednym originem korzystający z API pod innym) komunikację między-domenową. CORS rozwiązuje ten problem, dając serwerowi możliwość jawnego i selektywnego zezwolenia wybranym originom na dostęp — bez całkowitego wyłączania ochrony przeglądarki.
Komponenty
Nagłówek automatycznie dołączany przez przeglądarkę do żądań między-originowych; wskazuje schemat, host i port strony źródłowej.
Automatyczne żądanie OPTIONS wysyłane dla żądań nie-prostych, zawierające Access-Control-Request-Method i Access-Control-Request-Headers; serwer potwierdza, czy właściwe żądanie jest dozwolone.
Nagłówek odpowiedzi wskazujący, który origin może odczytać zasób: konkretny origin albo „*"; „*" jest zabroniony przy żądaniach z poświadczeniami.
Nagłówek odpowiedzi preflightu wskazujący metody HTTP dozwolone dla zasobu (np. GET, POST, OPTIONS).
Nagłówek odpowiedzi preflightu wskazujący, które nagłówki (np. własne, Content-Type) mogą pojawić się we właściwym żądaniu.
Nagłówek odpowiedzi; wartość true pozwala dołączyć ciasteczka i dane uwierzytelniające. Wymusza jawny origin zamiast „*".
Nagłówek odpowiedzi określający w sekundach, jak długo przeglądarka może cache’ować wynik preflightu, ograniczając liczbę żądań OPTIONS.
Nagłówek odpowiedzi wskazujący, które nagłówki spoza safelisty JavaScript może odczytać z odpowiedzi.
Implementacja
Gdy żądanie zawiera poświadczenia (credentials: include), a odpowiedź ma Access-Control-Allow-Origin: *, przeglądarka blokuje odpowiedź.
Serwer nie odpowiada poprawnie na automatyczne żądanie OPTIONS, przez co właściwe żądanie nie-proste jest blokowane.
Dynamiczne odbijanie dowolnego Origin do Access-Control-Allow-Origin razem z Allow-Credentials: true otwiera dostęp każdemu originowi do zasobów z ciasteczkami użytkownika.
Skrypt nie może odczytać nagłówków odpowiedzi spoza safelisty, jeśli nie wymieniono ich w Access-Control-Expose-Headers.
Zbyt krótki czas cache preflightu generuje nadmiar żądań OPTIONS; przeglądarki narzucają też własne górne limity.
Ewolucja
W3C publikuje CORS jako oficjalną rekomendację (16 stycznia 2014), standaryzując nagłówki kontroli dostępu między-originowego i mechanizm preflight.
Protokół CORS zostaje włączony do żywej specyfikacji WHATWG Fetch Standard, która obecnie zastępuje dokument W3C — adres w3.org/TR/cors przekierowuje do fetch.spec.whatwg.org.
Hiperparametry (konfigurowalne osie)
Które originy mogą odczytać zasób (konkretna lista lub „*"). Przy poświadczeniach „*" jest niedozwolone.
Metody HTTP dozwolone dla zasobu w żądaniach między-originowych.
Nagłówki żądania (w tym własne) dopuszczone we właściwym żądaniu.
Czy dozwolone jest przesyłanie ciasteczek i danych uwierzytelniających.
Jak długo przeglądarka cache’uje wynik preflightu.
Które nagłówki odpowiedzi spoza safelisty są odczytywalne przez skrypt.