CORS คืออะไร?

CORS คืออะไร?
CORS (Cross-Origin Resource Sharing) เป็นเมคานิกส์ด้านความปลอดภัยของเว็บบราวเซอร์ของเราที่จะไม่อนุญาตให้มีการเรียกหาข้อมูลข้ามโดเมนกัน
ข้าม = Cross
โดเมน = Origin
ท่าประจำในการพัฒนาเว็บที่พบเจอได้บ่อยก็คือ แยกส่วนการแสดงผล frontent กับจัดการฐานข้อมูล และส่วนหลังบ้าน หรือ backend ออกจากกัน, แต่ปัญหาแรกที่พบก็คือ เวลาที่พัฒนา frontend และ backend เสร็จแล้ว จะให้มาทดสอบในการเรียกข้อมูลดู ก็พบว่า Error และเรียกไปยัง API ที่กำหนดไว้ไม่ได้ ทั้งๆ ที่เวลาทดสอบด้วย Postman ก็ยังทดสอบเรียกดูข้อมูลได้ถูกต้องอยู่เลย

สาเหตุก็อย่างที่นิยามของ CORS ด้านบน บราวเซอร์ป้องกันการเรียกขอข้ามโดเมน หรือ Origin แม้กระทั่งเครื่องที่เราใช้ทดสอบในการพัฒนา จะเป็นเครื่องเดียวกัน แต่บราวเซอร์จะมองว่าเป็นต่างโดเมนกัน
นี่ก็เมคานิกส์เพื่อป้องกันการใช้งานได้อย่างปลอดภัย ป้องกันการโจมตีไป backend เป็นต้น
ยกตัวอย่าง
# Local Environment
http://localhost:5173/ -> http://localhost:8080/api/delivery/status/SM9389238128JP
# Real-World Case
https://good-ecommerce.com -> https://api.good-product.com/products/BIKE82912AMZ วิธีการ Implementation
เราต้องไปทำการตั้งค่าให้ backend เป็นฝ่ายรับผิดชอบในการดูว่า request นั้นได้มาจากโดเมน หรือ Origin ที่ได้รับอนุญาตหรือไม่ แล้วก็ส่ง response ที่มี header ว่าอนุญาตให้ origin ไหน เรียก endpoint แบบใดได้บ้าง
# Example Allow Only One
Access-Control-Allow-Origin: http://www.example.com
# Example Allow All
# ❌ **ระวัง ค่านี้เพื่อการยกตัวอย่างประกอบ blog เท่านั้น อย่าหาทำบน Production เด็ดขาด**
Access-Control-Allow-Origin: * Tech Stack
เพื่อการยกตัวอย่าง หาผู้อ่านถนัดภาษา และเฟรมเวิร์กอื่น ก็สามารถหา documentation ของ tool นั้นๆ เพื่อไปประยุกต์กันเอาเองนะ
- 🌱👢 Spring Boot 4
- 🛠️⚡ SvelteKit 2 & Svelte 5
- Java 25 JDK (GraalVM for native build)
- NodeJS
- PNPM
Project Setup

ติดตั้งโปรแกรมที่จำเป็น
- JDK 25
- NodeJS 22+
- PNPM for Node Package Management
Checkout จาก repository
https://github.com/santa-sandbox/demystify-corsspring-bootสำหรับ backendsvelteสำหรับ frontend
สั่งรัน backend
cd spring-boot./mvnw spring-boot:runเพื่อสั่งรัน backend
สั่งรัน frontend
cd sveltepnpm installรันคำสั่งก่อนครั้งแรกครั้งเดียวpnpm run devเพื่อสั่งรัน frontend
เปิดเว็บบราวเซอร์ เพื่อเช็ค
- http://localhost:5173
- ลองใส่รหัส Tracking พัสดุสมมติ
SM9389238128JPแล้วกด Track Package - จะเจอ error ตามภาพด้านล่าง

- เปิด Chrome DevTools
- ไปดูที่ Console แล้วดูว่ามี error อะไรบ้าง
CORS Configuration
โค้ดตัวอย่าง config แบบ Global
// โค้ดตัวอย่าง
blog.natta.santa.cors.config.CorsConfig.java - จากโค้ดตัวอย่าง จะเห็นว่าเป็น Code ที่ถูก comment เอาไว้ ก็เอา comment ออก, รีสตาร์ท backend
- เปิดดู frontend หรือ refresh อีกที
- ใส่รหัส Tracking พัสดุสมมติ
SM9389238128JPแล้วกด Track Package อีกรอบ จะเห็นว่า error เปลี่ยนไปแล้ว/api/v1/delivery/status/SM9389238128JPจะไม่ขึ้นมาแล้ว แต่จะติดที่/api/v2/receipts/SM9389238128JPแทน

โค้ดตัวอย่าง config แบบ @CrossOrigin Annotation
- ในโค้ดตัวอย่าง มองหา
@CrossOriginแล้วเอา comment ออก - ทำซ้ำ
- restart backend
- refresh frontend
- ใส่รหัส Tracking พัสดุสมมติ
SM9389238128JPแล้วกด Track Package

Conclusion
CORS คือเมคานิกส์ป้องกันการ request ข้ามโดเมน ซึ่งเป็น ฟีเจอร์ของ browser ในยุคปัจจุบัน แต่เวลาเราต้องการจะเปิดรับ request ข้ามโดเมน ต้องมีการตั้งค่าให้ฝั่ง backend ตามแนวคิด Principle of Least Privilege (PoLP) ที่จะเปิดรับจาก client ที่เราอนุญาตเท่านั้น ซึ่งจะช่วยลดการพยายามโจมตีมาที่เซอร์เวอร์ของเราได้