app.A.comfetch('B/api')api.B.comA-C-A-O: A.comOPTIONS preflightCORS allow → JS may readrequest always reaches server; response visibility is gated

Zdieľanie zdrojov medzi zdrojmi

11 min prečítanéWebová technológia

CORS je jednou z najviac mätúcich webových technológií, pretože ide o to, povedať prehliadačom, čo majú povoliť – nie o blokovaní útokov na server. Keď pochopíte tento rozdiel, pravidlá dávajú zmysel. CORS umožňuje serverom selektívne udeľovať krížové oprávnenia; politika rovnakého pôvodu je predvolená č.

Celé telo článku je uvedené v angličtine nižšie.

Cross-Origin Resource Sharing (CORS) je mechanizmus prehliadača, ktorý umožňuje serveru deklarovať, ktoré iné zdroje majú povolený prístup k jeho odpovediam. V kombinácii s politikou rovnakého pôvodu (predvolená hodnota prehliadača „nenechajte jedného zdroja čítať odpovede druhého“) poskytuje CORS mechanizmus na selektívnu relaxáciu.

Prvá politika rovnakého pôvodu

Prehliadače štandardne vynucujú, že JavaScript spustený na pôvode A nemôže čítať odpovede z pôvodu B. Ide o politiku rovnakého pôvodu. „Pôvod“ znamená schéma + hostiteľ + port; https://a.example.com a https://b.example.com sú rôzneho pôvodu.

Zásady bránia JavaScriptu jednej stránky čítať vaše údaje na inej stránke, na ktorej ste prihlásený. Bez nej by každá stránka, ktorú navštívite, mohla čítať váš Gmail, vaša banka by odosielala súbory cookie – vaše súbory cookie, vaše súkromné ​​ukladanie automaticky a útočníkov JS by videl odpoveď.

Čo CORS pridáva

Mnoho legitímnych prípadov použitia vyžaduje čítanie krížového pôvodu – fonty z CDN, volania API z frontendu na backend v inej doméne, vložené widgety sociálnych médií. CORS umožňuje odpovedajúcemu serveru explicitne povedať „áno, tento iný zdroj môže čítať moje odpovede.“

Server vo svojej odpovedi obsahuje hlavičku Access-Control-Allow-Origin. Prehliadač skontroluje: ak sa žiadajúci pôvod zhoduje s hodnotou (alebo je to zástupný znak *), odpoveď je vystavená JavaScriptu. Ak nie, prehliadač blokuje JavaScript v jeho čítaní. Požiadavka stále šla, server ju stále prijal a spracoval — obmedzená je iba viditeľnosť JavaScriptu. Ak to CORS neumožňuje, JavaScript ho nemôže prečítať.

Pre „komplexné“ požiadavky (PUT, DELETE, vlastné hlavičky, typ obsahu JSON) prehliadač najprv odošle požiadavku preflight OPTIONS s otázkou „môže vám pôvod X zaslať túto požiadavku?“ Server odpovedá povolenými metódami a hlavičkami. Iba ak je to schválené, prehliadač odošle skutočnú požiadavku.

// Preflight
MOŽNOSTI /api/users HTTP/1.1
Pôvod: https://app.example.com
Access-Control-Request-Metóda: DELETE
Access-Control-Request-Headers: Autorizácia

// Odpoveď servera
HTTP/1.1 204 Žiadny obsah
Access-Control-Allow-Origin: https://app.example.com
Metódy kontroly prístupu: DELETE, GET, POST
Access-Control-Allow-Headers: Autorizácia, Content-Type
Access-Control-Max-Age: 86400

Predbežná kontrola zabraňuje prehliadačom odosielať zložité požiadavky na zmenu stavu na servery, ktoré ich neočakávajú – základná obrana aj proti nesprávne nakonfigurovaným serverom. sa v predvolenom nastavení neodosielajú pri žiadostiach s viacerými zdrojmi. Na ich zahrnutie musí JavaScript vyžadovať:

fetch('https://api.example.com/data', { credentials: 'include' })

A server musí odpovedať Access-Control-Allow-Credentials: trueXPLZ51 – špecifický pôvod: trueXPLZ51 Access-Control-Allow-Origin. Toto je bežný problém: Access-Control-Allow-Origin: * + poverenia = nič nefunguje.

Bežné nedorozumenia CORS

  • CORS nie je bezpečnostná funkcia pre servery. Požiadavka sa dostane na server bez ohľadu na CORS. Prehliadač blokuje JavaScript z odpovede reading. Servery sa musia stále overovať a autorizovať.
  • CORS sa nevzťahuje na všetky požiadavky. Žiadosti s rovnakým pôvodom nespúšťajú CORS. Žiadosti server-to-server tiež nie. Vzájomný pôvod medzi prehliadačmi a servermi je jediným miestom, kde CORS žije.
  • Zástupný znak * je nebezpečný v kombinácii so súbormi cookie. Mnohé návody odporúčajú Access-Control-Allow-Origin: * ako rýchlu opravu. Pre verejné API bez poverení je to v poriadku. Pre čokoľvek s overením je nefunkčné.
  • CORS chyby sú problémy na strane servera. Keď uvidíte chyby CORS v konzole prehliadača, oprava je na odpovedajúcom serveri, nie na žiadajúcom kóde.

CORS vs CSRFX25XESasiPL CORS riadi, čo prehliadač vystavuje JavaScriptu. CSRF (pozri náš článok CSRF) je o tom, či prehliadač vôbec odošle požiadavku. CORS nebráni CSRF – požiadavku možno odoslať a spracovať aj vtedy, keď JavaScript nevidí odpoveď.

Pre rozhrania API na zmenu stavu, ktoré používajú súbory cookie, sú stále potrebné tokeny CSRF alebo súbory cookie SameSite. CORS ich nenahrádza.

Predletová vyrovnávacia pamäť

Predletové odpovede je možné uložiť do vyrovnávacej pamäte cez Access-Control-Max-Age. Dlhé maximálne veky (24+ hodín) znižujú réžiu – každá odlišná kombinácia (metóda, adresa URL, hlavičky) neprebehne znova pred výstupom, kým nevyprší platnosť. Krátky maximálny vek môže nahromadiť značnú latenciu.

Bežné vzory CORS v 2026

  • Public APIs: Access-Control-Allow-Origin: * pre koncové body autentifikácia.
  • Authenticated APIs: echo späť volajúci pôvod, ak je v zozname povolených, s Access-Control-Allow-Credentials: true.
  • XaPLZ5mer API zoznam povolených konfigurovaný zákazníkom.
  • JS Dodávka súpravy SDK: statické súbory so širokým CORS, často so vzorom public-API.

Často kladené otázky

Prečo moje načítanie zlyhá s chybou CORS?
Server, ktorý voláte, nezahŕňal vhodnú hlavičku Access-Control-Allow-Origin pre váš pôvod. Server musí byť nakonfigurovaný tak, aby vám to umožňoval, alebo ho musíte volať z rovnakého pôvodu (zvyčajne cez server proxy).
Môžem ako vývojár obísť CORS?
Z vášho vlastného kódu v prehliadači nie – vynucuje ho prehliadač. Z vášho vlastného servera (backendový kód), áno, pretože CORS sa nevzťahuje na požiadavky server-to-server. Bežným riešením je backend proxy: váš frontend volá váš backend; váš backend volá rozhranie API tretej strany.
Chráni CORS moje API?
Nie priamo. Rozhranie API je dostupné bez ohľadu na CORS – prehliadač stále odosiela požiadavku. Ochrana spočíva v tom, že JavaScript na iných stránkach nedokáže čítať odpovede. Na skutočnú ochranu API použite autentifikáciu a autorizáciu na serveri.
Mám použiť Access-Control-Allow-Origin: *?
Iba pre verejné rozhrania API, ktoré neprijímajú poverenia. Pre čokoľvek so súbormi cookie alebo autorizačnými hlavičkami použite špecifický pôvod alebo zopakujte volajúci pôvod (s overením). Prehliadače nepovoľujú zástupný znak + poverenia.
Prečo CORS predlietava len niektoré požiadavky?
Jednoduché požiadavky (GET, HEAD, POST so základnými typmi obsahu a bez vlastných hlavičiek) sú vyňaté – tieto sú ekvivalentom toho, čo mohli HTML formuláre robiť už predtým, než existoval CORS. Komplexné požiadavky nemajú žiadny analógový formát HTML, takže predchádzajú pred výstupom, aby dali serveru možnosť odmietnuť pred akoukoľvek zmenou stavu.
Vysvetlenie CORS: Ako sa prehliadače rozhodujú, kedy sú povolené požiadavky na krížový pôvod