OPTIONS
Penggunaan
Permintaan OPTIONS mengambil informasi tentang metode yang diizinkan dan kemampuan sebuah sumber daya target tanpa melakukan tindakan apa pun terhadap sumber daya tersebut. Server merespons dengan header Allow yang mendaftar metode-metode yang didukung.
Ketika tanda bintang (*) digunakan sebagai target permintaan, permintaan tersebut berlaku untuk server secara keseluruhan, bukan untuk sumber daya tertentu.
OPTIONS * HTTP/1.1
Host: api.example.re
Preflight CORS
Penggunaan OPTIONS yang paling umum di dunia nyata adalah permintaan preflight CORS. Sebelum mengirimkan permintaan lintas origin dengan metode di luar himpunan yang masuk safelist CORS, dengan header kustom, atau dengan Content-Type di luar himpunan safelist (application/x-www-form-urlencoded, multipart/form-data, text/plain), browser secara otomatis mengirimkan permintaan OPTIONS ke server target. Preflight tersebut memeriksa apakah server mengizinkan permintaan yang sesungguhnya.
Permintaan preflight menyertakan Origin, Access-Control-Request-Method, dan secara opsional Access-Control-Request-Headers. Server merespons dengan Access-Control-Allow-Origin, Access-Control-Allow-Methods, dan Access-Control-Allow-Headers untuk menandakan persetujuan.
Kemampuan sumber daya
Klien menanyakan metode yang diizinkan untuk sebuah sumber daya tertentu. Server merespons dengan 204 No Content beserta header Allow.
Permintaan
OPTIONS /articles HTTP/1.1
Host: api.example.re
Response
HTTP/1.1 204 No Content
Allow: OPTIONS, GET, HEAD, POST, DELETE
Kueri tingkat server
Menggunakan * sebagai target menunjukkan metode yang didukung server secara umum, terlepas dari sumber daya tertentu mana pun.
Permintaan
OPTIONS * HTTP/1.1
Host: api.example.re
Response
HTTP/1.1 204 No Content
Allow: OPTIONS, GET, HEAD
Preflight CORS
Sebuah browser menyiapkan permintaan PUT lintas origin dengan header kustom X-Request-ID. Sebelum mengirimkan permintaan yang sesungguhnya, browser menerbitkan permintaan preflight OPTIONS untuk memastikan server mengizinkan metode dan header tersebut dari origin yang meminta.
Permintaan preflight
OPTIONS /api/data HTTP/1.1
Host: api.example.re
Origin: https://example.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: X-Request-ID
Response preflight
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, PUT, DELETE
Access-Control-Allow-Headers: X-Request-ID
Access-Control-Max-Age: 86400
Nilai Access-Control-Max-Age memberi tahu browser untuk menyimpan hasil preflight di cache selama 86.400 detik (satu hari), sehingga menghindari permintaan preflight berulang untuk endpoint yang sama.
Keamanan
Response OPTIONS menyertakan header Allow yang mendaftar setiap metode yang didukung sumber daya tersebut. Ini merupakan pengungkapan informasi berskala kecil, dan pemindai keamanan kerap menandai endpoint OPTIONS yang aktif sebagai temuan. Menonaktifkan OPTIONS sepenuhnya bukanlah solusi yang praktis karena permintaan preflight CORS membutuhkan OPTIONS agar dapat berfungsi.
Pendekatan yang disarankan adalah membatasi header Allow hanya pada metode yang dibutuhkan setiap endpoint. Sumber daya yang menerima GET dan POST sebaiknya tidak mengumumkan DELETE atau PUT dalam daftar Allow.
Sebagian framework mendukung header X-HTTP-Method-Override untuk menyalurkan PUT, PATCH, atau DELETE melalui sebuah permintaan POST. Hal ini melewati kontrol akses berbasis metode dan menjadi persoalan keamanan apabila fitur tersebut tidak diaktifkan dan diaudit secara eksplisit.
Untuk menghindari permintaan preflight yang tidak perlu, jagalah agar permintaan lintas origin tetap memenuhi kriteria permintaan “sederhana”: hanya GET, HEAD, atau POST dengan header yang masuk safelist dan tipe konten yang masuk safelist. Menggunakan Content-Type: application/json selalu memicu preflight. Access-Control-Max-Age menyimpan hasil preflight di cache untuk mengurangi perjalanan bolak-balik OPTIONS yang berulang.