CORS

Z Wikipedie, otevřené encyklopedie

CORS (Cross-origin resource sharing, ve volném překladu sdílené zdroje odjinud) je v informatice mechanismus umožňující sdílení zdrojů (např. fontů, JavaScriptového kódu, atd.) webové stránky pro aplikaci na jiné doméně.[1] Toto je zejména použito při AJAX požadavcích pomocí XMLHttpRequestu. Mezi-doménové volání by jinak bylo zakázáno webovým prohlížečem kvůli omezení same-origin policy. CORS definuje způsob, pomocí kterého se prohlížeč a dotazovaný server dohodnou na tom, zda mezi-doménové volání bude povoleno.[2] Takto lze docílit sdílení zdrojů a zároveň zachovat bezpečnost aplikace.

Jak to funguje[editovat | editovat zdroj]

CORS přidává nové HTTP hlavičky, které předávají instrukce klientovi. Webové prohlížeče tyto hlavičky akceptují a respektují jejich omezení, která stanovují. Pokud požadavky na server mohou nějak změnit poskytovaná data (jiné metody než GET), specifikace nařizuje, aby prohlížeč nejprve provedl přípravný požadavek pomocí metody OPTIONS. Tímto požadavkem je ověřeno, zda je metoda hlavního požadavku a zdrojová doména povolena. Poté již následuje samotný požadavek na server. Server také podle standardu může oznámit klientovi, že povoluje příjem, tzv. credentials[3] (cookies, HTTP autentizačních dat, SSL certifikátů…).

Nevýhody[editovat | editovat zdroj]

CORS znemožňuje z lokálně prohlížené stránky načíst obsah lokálního souboru, např. metodou fetch, což znemožňuje tvořit lokální aplikace běžící ve webovém prohlížeči a je nutné pro ně instalovat lokální server.

Zjednodušený příklad[editovat | editovat zdroj]

Pro inicializaci mezi-doménového požadavku prohlížeč přidá do požadavku novou hlavičku Origin. Tato hlavička nese název domény, která vytváří požadavek. Například webová stránka http://www.mojestranka.cz se pokusí získat zdroje z webu http://www.cizistranka.cz. Pokud prohlížeč má podporu CORS, obsah hlavičky ORIGIN v požadavku odesílaného na cizistranka.cz bude:

 Origin: http://www.mojestranka.cz

Pokud cizistranka.cz povolí požadavek, v odpovědi pošle ACAO hlavičku Access-Control-Allow-Origin. V této hlavičce budou uvedeny domény, ze které jsou požadavky povoleny, například:

 Access-Control-Allow-Origin: http://www.mojestranka.cz

Pokud server nepodporuje mezidoménový požadavek, prohlížeč vyhodí chybu požadavku místo navrácení odpovědi.

Při povolení požadavků ze všech domén server vrací takovouto hlavičku:

 Access-Control-Allow-Origin: *

Toto nastavení však není vhodné pro všechny typy webových stránek. Je vhodné zejména pro API webových stránek, která mají být veřejná a volně dostupná, například jako Google Fonts.

Na druhou stranu je toto nastavení vhodné pro stránky, které využívají object-capability model, kde jednotlivé funkce mají neuhádnutelné/zašifrované URL a mají být dostupné pouze pro ty, kteří je znají.

Hodnota *, je speciální a nepovoluje aby požadavek obsahoval credentials.

Podpora prohlížečů[editovat | editovat zdroj]

CORS je podporována ve všech prohlížečích založených na následujících jádrech:

  • Gecko 1.9.1 (Firefox 3.5,[4] SeaMonkey 2.0,[5] Camino 2.1 [6]) a vyšší.
  • WebKit (Číslo verze, od které je podporováno není jisté, Safari 4 a vyšší,[1] Google Chrome 3 a vyšší, možná i v předchozích verzích)[7]
  • MSHTML/Trident 6.0 (Internet Explorer 10) má nativní podporu.[8] MSHTML/Trident 4.0 & 5.0 (Internet Explorer 8 & 9) poskytuje částečnou podporu pomocí XDomainRequest objektu.[1]
  • Prohlížeče s jádrem Presto(Opera) implementují CORS od Opery 12.00[9] a Opera Mobile 12, ale již ne v Opera Mini.[10]

Následující prohlížeče nemají podporu CORS

  • Camino nemá podporu ve verzích 2.0.x, protože jsou založené na jádře Gecko 1.9.0.[11]
  • Ve verzi 0.10.2 prohlížeče Arora implementuje CORS, ale při pokusu o mezidoménový požadavek dojde k chybě.[12]

CORS a JSONP[editovat | editovat zdroj]

CORS může být použito jako moderní alternativa k JSONP vzoru. Zatímco JSONP podporuje pouze požadavky metodou GET, CORS podporuje i ostatní metody HTTP. Použití CORS tak programátorovi umožňuje použit standardní XMLHttpRequest, který podporuje lepší řízení požadavku nežli JSONP. Na druhou stranu JSONP funguje na starších prohlížečích, které ještě nemají podporu CORS. Avšak tento standard je již dnes podporován ve všech moderních prohlížečích. Nevýhodou JSONP je zranitelnost přes cross-site scripting (XSS) útoky, zatímco CORS umožňuje parsování příchozího požadavku a tak zaručí bezpečnost.[2][13]

Související články[editovat | editovat zdroj]

Reference[editovat | editovat zdroj]

  1. a b c on July 6, 2009 by Arun Ranganathan. cross-site xmlhttprequest with CORS ✩ Mozilla Hacks – the Web developer blog [online]. Hacks.mozilla.org, 2009-07-06 [cit. 2012-07-05]. Dostupné online. 
  2. a b Cross-domain Ajax with Cross-Origin Resource Sharing [online]. NCZOnline [cit. 2012-07-05]. Dostupné online. 
  3. cross-site xmlhttprequest with CORS [online]. MOZILLA [cit. 2012-09-05]. Dostupné online. 
  4. HTTP access control (CORS) - MDN [online]. Developer.mozilla.org [cit. 2012-07-05]. Dostupné v archivu pořízeném dne 2010-05-27. 
  5. Gecko - MDN [online]. Developer.mozilla.org, 2012-06-08 [cit. 2012-07-05]. Dostupné v archivu pořízeném dne 2012-08-03. 
  6. What makes Camino Special [online]. [cit. 2013-02-20]. Dostupné online. 
  7. 59940: Apple Safari WebKit Cross-Origin Resource Sharing Bypass [online]. Osvdb.org [cit. 2012-07-05]. Dostupné v archivu pořízeném dne 2012-07-19. 
  8. Tony Ross, Program Manager, Internet Explorer. CORS for XHR in IE10 [online]. MSDN, 2012-02-09 [cit. 2012-12-14]. Dostupné online. 
  9. David Honneffer, Documentation Specialist. 12.00 for UNIX Changelog [online]. Opera, 2012-06-14 [cit. 2012-07-05]. Dostupné v archivu pořízeném dne 2012-06-18. 
  10. David Honneffer, Documentation Specialist. Opera Software: Web specifications support in Opera Presto 2.10 [online]. Opera.com, 2012-04-23 [cit. 2012-07-05]. Dostupné online. 
  11. HTTP Access Control in Camino • mozillaZine Forums [online]. Forums-test.mozillazine.org [cit. 2012-07-05]. Dostupné online. 
  12. Issue 904 - arora - Arora providing API for CORS (Cross-Origin Resource Sharing) but fails in actual use - Cross Platform WebKit Browser - Google Project Hosting [online]. Code.google.com, 2010-09-04 [cit. 2012-07-05]. Dostupné v archivu pořízeném dne 2012-11-09. 
  13. When can I use... Cross Origin Resource Sharing [online]. caniuse.com [cit. 2012-07-12]. Dostupné online. 

Externí odkazy[editovat | editovat zdroj]