การแบ่งปันทรัพยากรข้ามแหล่งกำเนิด - CORS
(คำขอ AKA Cross-Domain AJAX) เป็นปัญหาที่นักพัฒนาเว็บส่วนใหญ่อาจพบตามเบราว์เซอร์เดิม จำกัด นโยบายเบราว์เซอร์ จำกัด ไคลเอ็นต์ JavaScript ในแซนด์บ็อกซ์รักษาความปลอดภัยโดยปกติ JS ไม่สามารถสื่อสารโดยตรงกับเซิร์ฟเวอร์ระยะไกล จากโดเมนอื่น ในอดีตนักพัฒนาสร้างวิธีที่ยุ่งยากมากมายในการบรรลุการร้องขอทรัพยากรข้ามโดเมนส่วนใหญ่ใช้วิธี:
- ใช้ Flash / Silverlight หรือฝั่งเซิร์ฟเวอร์เป็น "พร็อกซี" เพื่อสื่อสารกับรีโมท
- JSON With Padding ( JSONP )
- ฝังเซิร์ฟเวอร์ระยะไกลใน iframe และการติดต่อสื่อสารผ่านส่วนหรือ window.name โปรดดูที่นี่
วิธีที่ยุ่งยากเหล่านั้นมีปัญหาบางอย่างมากขึ้นหรือน้อยลงตัวอย่างเช่น JSONP อาจส่งผลให้เกิดช่องโหว่ด้านความปลอดภัยหากผู้พัฒนาเพียงแค่ "eval" และ # 3 ด้านบนแม้ว่ามันจะใช้ได้ แต่โดเมนทั้งสองควรสร้างสัญญาที่เข้มงวดระหว่างกัน IMHO :)
W3C ได้แนะนำ Cross-Origin Resource Sharing (CORS) เป็นโซลูชันมาตรฐานเพื่อให้วิธีการที่ปลอดภัยยืดหยุ่นและเป็นวิธีมาตรฐานที่แนะนำในการแก้ปัญหานี้
กลไก
จากระดับสูงเราสามารถเห็นว่า CORS เป็นสัญญาระหว่างลูกค้า AJAX โทรจากโดเมน A และหน้าโฮสต์บนโดเมน B คำขอ / การตอบสนองข้ามแหล่งกำเนิดโดยทั่วไปจะเป็น:
ส่วนหัวคำขอ 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
ส่วนหัวการตอบสนอง 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
ส่วนสีฟ้าที่ฉันทำเครื่องหมายไว้ด้านบนคือข้อเท็จจริงของ kernal ส่วนหัวคำขอ "Origin" "ระบุตำแหน่งที่คำขอข้ามต้นกำเนิดหรือคำขอ preflight มีต้นกำเนิดมาจาก" ส่วนหัวตอบกลับ "Access-Control-Allow-Origin" ระบุว่าหน้านี้อนุญาตการร้องขอจากระยะไกล DomainA (หากค่าเป็น * หมายถึงอนุญาตการร้องขอระยะไกลจากโดเมนใด ๆ )
ดังที่ฉันได้กล่าวไว้ข้างต้น W3 แนะนำให้ใช้เบราว์เซอร์ " คำขอ preflight " ก่อนที่จะส่งคำขอ HTTP ข้ามแหล่งกำเนิดจริงโดยสังเขปมันเป็นOPTIONS
คำขอHTTP :
OPTIONS DomainB.com/foo.aspx HTTP/1.1
หาก foo.aspx สนับสนุนคำกริยา HTTP ของ OPTIONS อาจส่งคืนการตอบกลับดังนี้:
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
เฉพาะในกรณีที่คำตอบประกอบด้วย "Access-Control-Allow-Origin" และค่าของมันคือ "*" หรือมีโดเมนที่ส่งคำขอ CORS โดยการตอบสนองเบราว์เซอร์เงื่อนไข mandtory นี้จะส่งคำขอข้ามโดเมนจริงและแคชผลลัพธ์ ใน " Preflight-Result-Cache "
ฉัน blogged เกี่ยวกับ CORS สามปีที่ผ่านมา: AJAX Cross-Origin HTTP ร้องขอ
http://siteA/MyCode.js
ได้