CORS คืออะไร และตั้งค่านโยบายอย่างไร
CORS คืออะไร
Cross-Origin Resource Sharing (CORS) เป็นกลไกที่เบราว์เซอร์ใช้ถามเซิร์ฟเวอร์ว่าต้นทางอื่นอ่านคำตอบได้หรือไม่ โดยค่าเริ่มต้น same-origin policy ห้ามหน้าจาก origin หนึ่งอ่านผลลัพธ์จาก origin อื่น เอกสารใช้งานอยู่ที่ MDN CORS และข้อกำหนดที่ WHATWG Fetch
Simple request กับ preflight
คำขอบางชนิด (เช่น GET บางชุด header) ถูกส่งเลย แล้วเบราว์เซอร์ตัดสินจาก Access-Control-Allow-Origin ในคำตอบ
คำขอที่ซับซ้อนกว่าจะส่ง OPTIONS ก่อน (preflight) โดยมี Access-Control-Request-Method และ Access-Control-Request-Headers เซิร์ฟเวอร์ต้องตอบ Access-Control-Allow-Methods และ Access-Control-Allow-Headers ให้ตรง
สิ่งที่ CORS ไม่ได้ทำ
CORS ไม่ใช่ไฟร์วอลล์ของ API คำขอจาก curl, แอปมือถือ หรือเซิร์ฟเวอร์อื่นยังเรียกได้ ต้องมีการยืนยันตัวตน, CSRF control และการตรวจสิทธิ์ฝั่งเซิร์ฟเวอร์ตาม OWASP
การตั้งค่าที่ปลอดภัยกว่า
- ระบุ origin จริงใน
Access-Control-Allow-Originอย่าใช้*คู่กับAccess-Control-Allow-Credentials: true(เบราว์เซอร์จะปฏิเสธอยู่แล้ว) - อย่าสะท้อนค่า
Originทุกค่าโดยไม่ตรวจรายการอนุญาต - จำกัดเมธอดและเฮดเดอร์เท่าที่ API ใช้
Access-Control-Allow-Origin: https://app.example.com
Access-Control-Allow-Credentials: true
Vary: OriginVary: Origin สำคัญเมื่อแคช reverse proxy เก็บคำตอบต่อ origin
สรุป
CORS เป็นสัญญาฝั่งเบราว์เซอร์ระหว่างหน้าเว็บกับ API ไม่ใช่การล็อก API จากอินเทอร์เน็ต ออกแบบรายการ origin ให้แคบที่สุด