Browser menerapkan kebijakan asal sama (same-origin policy) yang membatasi halaman web hanya dapat mengakses sumber daya dari protokol, domain, dan port yang sama. Permintaan dari https://example.com ke https://api.example.com akan memicu error blocked by CORS policy. Tambahkan anotasi Cross-Origin Resource Sharing (CORS) pada Nginx Ingress Anda untuk mengizinkan permintaan lintas asal tertentu.
Cara kerja
CORS menangani dua jenis permintaan: simple dan preflight.
Permintaan sederhana dikirim langsung ke server:
-
Browser menambahkan header
Originke permintaan—misalnya,Origin: https://example.com. -
Kontroler Nginx Ingress membandingkan metode HTTP dan nilai
Originterhadap konfigurasi CORS. Jika sesuai, kontroler menambahkan headerAccess-Control-Allow-Originke respons. -
Browser memeriksa apakah nilai
Access-Control-Allow-Originsesuai dengan origin permintaan. Jika sesuai, permintaan berhasil; jika header tidak ada atau nilainya tidak cocok, permintaan gagal.
Permintaan preflight mengirim pemeriksaan OPTIONS sebelum permintaan utama:
-
Browser mengirim permintaan
OPTIONSdengan headerAccess-Control-Request-MethoddanAccess-Control-Request-Headersyang menjelaskan permintaan sebenarnya. -
Jika metode atau header tidak diizinkan, preflight gagal dan permintaan utama tidak pernah dikirim. Jika preflight berhasil, permintaan utama dilanjutkan seperti permintaan simple.
Permintaan memicu preflight ketika:
-
Metodenya bukan
GET,HEAD, atauPOST. -
Metodenya adalah
POSTdan nilaiContent-Typebukantext/plain,application/x-www-form-urlencoded, ataumultipart/form-data. -
Permintaan menyertakan header kustom.
Saat cors-allow-credentials bernilai "true", jangan atur cors-allow-origin ke "*". Spesifikasi W3C melarang kombinasi ini: ketika permintaan membawa kredensial (seperti cookie), server harus secara eksplisit menyebutkan origin yang dipercaya. Penggunaan "*" memungkinkan situs web apa pun mengirim permintaan ber-kredensial atas nama pengguna, yang merupakan risiko keamanan.
Konfigurasikan CORS
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
-
Kluster ACK dengan kontroler Nginx Ingress yang telah dideploy
-
Resource Ingress yang mengarahkan lalu lintas ke layanan backend Anda
-
Izin untuk mengedit resource Ingress di kluster
Tambahkan anotasi CORS
-
Masuk ke Konsol ACK. Di panel navigasi kiri, pilih Clusters.
-
Pada halaman Clusters, klik kluster target. Di panel navigasi kiri, pilih Network > Ingresses.
-
Pada halaman Ingresses, temukan Ingress target dan klik Edit YAML di kolom Actions.
-
Tambahkan anotasi CORS ke
metadata.annotationssesuai skenario Anda.
Skenario A: Permintaan dengan kredensial atau cookie (disarankan)
Gunakan ini ketika antarmuka depan (https://example.com atau https://app.example.com) mengirim kredensial—seperti cookie atau header Authorization—ke API backend (https://api.example.com).
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: api-ingress-secure
annotations:
# Aktifkan CORS.
nginx.ingress.kubernetes.io/enable-cors: "true"
# Izinkan permintaan dengan kredensial, seperti cookie dan header Authorization.
nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
# Tentukan origin secara eksplisit. Jangan gunakan "*" saat kredensial diaktifkan.
nginx.ingress.kubernetes.io/cors-allow-origin: "https://example.com, https://app.example.com"
# Tentukan metode HTTP yang diizinkan.
nginx.ingress.kubernetes.io/cors-allow-methods: "GET, POST, PUT, DELETE, OPTIONS"
# Tentukan header permintaan yang diizinkan, termasuk header kustom yang dibutuhkan aplikasi Anda.
nginx.ingress.kubernetes.io/cors-allow-headers: "Content-Type, Authorization"
# Tentukan header respons kustom mana yang diekspos ke JavaScript browser.
nginx.ingress.kubernetes.io/cors-expose-headers: "X-Request-ID, Content-Length, Content-Range"
# Atur durasi cache preflight dalam detik. 86400 = 24 jam.
nginx.ingress.kubernetes.io/cors-max-age: "86400"
...
Skenario B: Permintaan tanpa kredensial
Gunakan ini untuk API publik yang read-only tanpa autentikasi.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: api-ingress-public
annotations:
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-origin: "*"
# Harus "false" saat cors-allow-origin adalah "*".
nginx.ingress.kubernetes.io/cors-allow-credentials: "false"
nginx.ingress.kubernetes.io/cors-allow-methods: "GET, POST, HEAD"
...
Verifikasi konfigurasi CORS
Gunakan curl untuk mensimulasikan permintaan preflight browser:
curl -i -X OPTIONS 'https://api.example.com/your/path' \
-H 'Origin: https://app.example.com' \
-H 'Access-Control-Request-Method: POST' \
-H 'Access-Control-Request-Headers: Content-Type, Authorization'
Preflight yang berhasil mengembalikan kode status 2xx, biasanya 204 No Content atau 200 OK:
HTTP/2 204
date: Fri, 12 Sep 2025 03:51:12 GMT
access-control-allow-origin: https://example.com, https://app.example.com
access-control-allow-credentials: true
access-control-allow-methods: GET, POST, PUT, DELETE, OPTIONS
access-control-allow-headers: Content-Type, Authorization
Pastikan setiap nilai access-control-allow-* sesuai dengan anotasi nginx.ingress.kubernetes.io/cors-* yang sesuai di Ingress Anda.
Referensi anotasi CORS
|
Anotasi |
Deskripsi |
Header HTTP |
Contoh |
|
|
Mengaktifkan atau menonaktifkan CORS. |
N/A |
|
|
|
Origin yang diizinkan. Pisahkan beberapa origin dengan koma. |
|
|
|
|
Metode HTTP yang diizinkan. |
|
|
|
|
Header permintaan kustom yang diizinkan. |
|
|
|
|
Menentukan apakah permintaan dengan kredensial—seperti cookie atau autentikasi HTTP—diizinkan. Harus |
|
|
|
|
Header respons yang diekspos ke JavaScript browser. Secara default, hanya header standar ( Memerlukan kontroler Nginx Ingress v0.44 atau lebih baru. |
|
|
|
|
Waktu maksimum (dalam detik) browser dapat menyimpan cache respons preflight. Nilai yang lebih besar mengurangi jumlah permintaan preflight; nilai yang lebih kecil meningkatkan keamanan. |
|
|
FAQ
Bagaimana cara memecahkan masalah error lintas asal?
Periksa permintaan jaringan di developer tools browser atau log kontroler Nginx Ingress. Pastikan origin, metode, dan header permintaan sesuai dengan anotasi CORS Ingress Anda.
Pesan error umum dan penyebabnya:
-
Method POST is not allowed by Access-Control-Allow-Methods in preflight response— metode tersebut tidak tercantum dalamcors-allow-methods. -
Access to fetch at 'https://api.example.com/data' from origin 'https://app.example.com' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: xxxx.— preflight gagal; bandingkan header responsaccess-control-allow-*dengan nilai anotasi Anda.
Bagaimana cara mengonfigurasi kebijakan CORS berbeda untuk path berbeda pada domain yang sama?
Anotasi CORS berlaku di tingkat Ingress; konfigurasi tingkat path tidak didukung. Buat resource Ingress terpisah untuk kelompok path yang memerlukan kebijakan berbeda—misalnya, api-public-ingress.yaml untuk path publik dan api-private-ingress.yaml untuk path terautentikasi.
Bagaimana cara mengekspos header respons kustom ke JavaScript browser?
Pada respons lintas asal, browser hanya dapat mengakses header standar berikut: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, dan Pragma. Header kustom—seperti X-Request-ID—tidak terlihat oleh JavaScript kecuali diekspos secara eksplisit.
Tambahkan cors-expose-headers ke anotasi Anda untuk mengeksposnya. Lihat Skenario A: Permintaan dengan kredensial atau cookie.
Referensi
-
Enable CORS — referensi resmi anotasi ingress-nginx