CORS (Cross-Origin Resource Sharing) — Web Fundamentals

CORS adalah mekanisme keamanan browser yang mengontrol apakah sebuah halaman web boleh mengakses resource dari domain (origin) yang berbeda. Apa itu Origin? Ori

CORS adalah mekanisme keamanan browser yang mengontrol apakah sebuah halaman web boleh mengakses resource dari domain (origin) yang berbeda.

Apa itu Origin? Origin adalah kombinasi dari protocol + hostname + port:

Same-Origin Policy (SOP): Browser secara default melarang JavaScript di satu origin mengakses resource dari origin lain. Ini mencegah website jahat mencuri data dari website lain.

// Dari https://mysite.com, request ke origin berbeda:
fetch("https://api.example.com/data")
  // ❌ Blocked by CORS policy!

Bagaimana CORS bekerja:

  1. Browser menambahkan header Origin ke request
  2. Server memeriksa origin dan membalas dengan header CORS
  3. Browser memeriksa header CORS — jika cocok, response diterima

Simple requests (GET, POST dengan form data):

Request:
Origin: https://mysite.com

Response:
Access-Control-Allow-Origin: https://mysite.com

Preflight requests (PUT, DELETE, custom headers): Browser mengirim OPTIONS request dulu untuk minta izin:

OPTIONS /api/users
Origin: https://mysite.com
Access-Control-Request-Method: DELETE
Access-Control-Request-Headers: Authorization

Response:
Access-Control-Allow-Origin: https://mysite.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Authorization
Access-Control-Max-Age: 86400

Header CORS penting:

Header Fungsi
Access-Control-Allow-Origin Origin mana yang boleh akses
Access-Control-Allow-Methods Method HTTP yang diizinkan
Access-Control-Allow-Headers Header custom yang diizinkan
Access-Control-Allow-Credentials Boleh kirim cookies?
Access-Control-Max-Age Berapa lama cache preflight (detik)

Setting CORS di server (Express.js):

const cors = require("cors");

app.use(cors({
  origin: ["https://mysite.com", "https://admin.mysite.com"],
  methods: ["GET", "POST", "PUT", "DELETE"],
  credentials: true,
  maxAge: 86400
}));

Kesalahan umum: