Middleware CORS
Referensi: Panduan HTTP CORS MDN
Middleware CORS (Cross-Origin Resource Sharing) menangani request lintas-origin dengan menambah header yang sesuai dan menangani request preflight OPTIONS.
Penggunaan Dasar
Terapkan middleware CORS memakai middleware bawaan Deserve:
import { Mware, Router } from '@neabyte/deserve'
const router = new Router()
// Izinkan semua origin, tangani preflight
router.use(Mware.cors())
await router.serve(8000)Konfigurasi CORS Khusus
Konfigurasi CORS dengan opsi khusus:
import { Mware, Router } from '@neabyte/deserve'
const router = new Router()
// Setel origin, metode, header, dan cache
router.use(
Mware.cors({
origin: [
'http://localhost:3000',
'https://example.com'
],
methods: [
'GET',
'POST',
'PUT',
'DELETE'
],
allowedHeaders: [
'Content-Type',
'Authorization',
'X-Custom-Header'
],
credentials: true,
maxAge: 3600
})
)
await router.serve(8000)Opsi CORS
origin
Tentukan origin yang diizinkan:
// Satu origin
origin: 'https://example.com'
// Banyak origin
origin: [
'https://example.com',
'https://app.example.com'
]
// Izinkan semua origin (default)
origin: '*'methods
Tentukan metode HTTP yang diizinkan. Default ke ketujuh metode yang didukung:
methods: [
'GET',
'POST',
'PUT',
'DELETE',
'PATCH',
'OPTIONS'
]allowedHeaders
Tentukan header yang diizinkan. Default ke Content-Type, Authorization, dan X-Requested-With:
allowedHeaders: [
'Content-Type',
'Authorization',
'X-Custom-Header'
]exposedHeaders
Tentukan header yang diekspos ke klien:
exposedHeaders: [
'X-Total-Count',
'X-Page-Count'
]credentials
Izinkan kredensial dalam request:
credentials: true // Izinkan cookie dan header authorizationmaxAge
Atur durasi cache preflight dalam detik. Default ke 86400 (24 jam):
maxAge: 3600 // Cache request preflight selama 1 jamDefault
Setiap opsi punya default, jadi Mware.cors() tanpa argumen mengizinkan origin apa pun:
| Opsi | Default |
|---|---|
origin | '*' |
methods | ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'PATCH', 'POST', 'PUT'] |
allowedHeaders | ['Content-Type', 'Authorization', 'X-Requested-With'] |
exposedHeaders | [] |
credentials | false |
maxAge | 86400 |
Cara Kerja
- Tanpa header Origin - request lolos tanpa disentuh, karena bukan lintas-origin
- Preflight OPTIONS - origin yang cocok mendapat 204 No Content dengan header CORS. Origin yang tidak cocok juga mendapat 204 tapi tanpa header CORS, jadi browser memblokir request sebenarnya. Event
cors:blockedmenyala untuk origin yang tidak cocok - Request sebenarnya - origin yang cocok menerima
Access-Control-Allow-Originplus kredensial dan header yang diekspos saat dikonfigurasi. Origin yang tidak cocok tidak mendapat header CORS dan eventcors:blockedmenyala - Header Vary -
Vary: Originditambahkan setiap kalioriginbukan wildcard'*', jadi cache tetap benar
Kredensial dan Wildcard
Mengatur credentials: true bersama origin: '*' melempar Deno.errors.InvalidData saat middleware dibuat, karena browser menolak request berkredensial terhadap origin wildcard. Sebut origin eksplisit saja:
// Kredensial butuh origin eksplisit
router.use(
Mware.cors({
origin: ['https://app.example.com'],
credentials: true
})
)Header CORS Umum
Header Request
Origin- Origin yang membuat requestAccess-Control-Request-Method- Metode untuk request preflightAccess-Control-Request-Headers- Header untuk request preflight
Header Response
Access-Control-Allow-Origin- Origin yang diizinkanAccess-Control-Allow-Methods- Metode HTTP yang diizinkanAccess-Control-Allow-Headers- Header request yang diizinkanAccess-Control-Allow-Credentials- Izinkan kredensialAccess-Control-Max-Age- Durasi cache preflightAccess-Control-Expose-Headers- Header yang diekspos ke klien