Cross-Origin Resource Sharing - CORS
(permintaan AJAX Cross-Domain AKA) adalah masalah yang sebagian besar pengembang web mungkin temui, menurut Same-Origin-Policy, browser membatasi JavaScript klien dalam kotak pasir keamanan, biasanya JS tidak dapat berkomunikasi secara langsung dengan server jarak jauh dari domain yang berbeda. Di masa lalu pengembang menciptakan banyak cara rumit untuk mencapai permintaan sumber daya Lintas-Domain, cara yang paling umum digunakan adalah:
- Gunakan Flash / Silverlight atau sisi server sebagai "proxy" untuk berkomunikasi dengan remote.
- JSON Dengan Padding ( JSONP ).
- Sematkan server jauh dalam iframe dan berkomunikasi melalui fragmen atau window.name, lihat di sini .
Cara-cara rumit tersebut memiliki lebih atau kurang beberapa masalah, misalnya JSONP dapat mengakibatkan lubang keamanan jika pengembang hanya "mengevaluasi" itu, dan # 3 di atas, meskipun berfungsi, kedua domain harus membangun kontrak yang ketat antara satu sama lain, tidak fleksibel atau elegan MENURUT OPINI SAYA:)
W3C telah memperkenalkan Cross-Origin Resource Sharing (CORS) sebagai solusi standar untuk memberikan cara standar yang aman, fleksibel dan direkomendasikan untuk menyelesaikan masalah ini.
Mekanisme
Dari level tinggi, kita dapat menganggap CORS adalah kontrak antara panggilan AJAX klien dari domain A dan halaman yang dihosting di domain B, permintaan / respons Cross-Origin tipikal adalah:
Header permintaan DomainA AJAX
Host DomainB.com
User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/4.0
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,application/json
Accept-Language en-us;
Accept-Encoding gzip, deflate
Keep-Alive 115
Origin http://DomainA.com
Header respons DomainB
Cache-Control private
Content-Type application/json; charset=utf-8
Access-Control-Allow-Origin DomainA.com
Content-Length 87
Proxy-Connection Keep-Alive
Connection Keep-Alive
Bagian biru yang saya tandai di atas adalah fakta kernal, "Asal" header permintaan "menunjukkan di mana permintaan lintas-asal atau permintaan preflight berasal dari", header respons "Akses-Kontrol-Bolehkan-Asal" menunjukkan bahwa laman ini memungkinkan permintaan jarak jauh dari DomainA (jika nilainya * mengindikasikan memungkinkan permintaan jarak jauh dari domain apa pun).
Seperti yang saya sebutkan di atas, W3 merekomendasikan browser untuk mengimplementasikan " permintaan preflight " sebelum mengirimkan permintaan HTTP Cross-Origin yang sebenarnya, singkatnya itu adalah OPTIONS
permintaan HTTP :
OPTIONS DomainB.com/foo.aspx HTTP/1.1
Jika foo.aspx mendukung OPTIONS HTTP verb, itu mungkin mengembalikan respons seperti di bawah ini:
HTTP/1.1 200 OK
Date: Wed, 01 Mar 2011 15:38:19 GMT
Access-Control-Allow-Origin: http://DomainA.com
Access-Control-Allow-Methods: POST, GET, OPTIONS, HEAD
Access-Control-Allow-Headers: X-Requested-With
Access-Control-Max-Age: 1728000
Connection: Keep-Alive
Content-Type: application/json
Hanya jika responsnya berisi "Akses-Kontrol-Bolehkan-Asal" DAN nilainya adalah "*" atau berisi domain yang mengirimkan permintaan CORS, dengan memenuhi syarat ini, browser akan mengirimkan permintaan Cross-Domain yang sebenarnya, dan menyimpan hasilnya. di " Preflight-Result-Cache ".
Saya membuat blog tentang CORS tiga tahun lalu: permintaan HTTP Cross-Origin AJAX
http://siteA/MyCode.js
.