Preflight Request Nedir?

preflight_request

Web geliştirmede güvenlik her zaman en öncelikli konulardan biridir. Modern web uygulamalarında sıkça güvenliği yükseltme amacıyla sıkça kullanılan bir yöntem olan “preflight” istekler hakkında konuşmak yazmak istiyorum bu makaleyi. Preflight isteği, Cross-Origin Resource Sharing (CORS) mekanizması kapsamında tarayıcı tarafından gerçekleştirilen bir süreçtir. Peki bu süreç nasıl işler?

Temelde tarayıcı gerçek bir HTTP isteğini göndermeden önce, hedefin bu isteği kabul edip etmeyeceğini kontrol etmek amaçlı ilerlettiği bir süreçtir. Burada önemli olan hedef sunucunun bu isteği kabul edip etmediğidir. Zira, kabul etmeyecek bir sunucuya niçin istek gönderilsin ki?

Bu süreç, asıl isteği göndermeden önce OPTIONS metoduyla Access-Control-Request-Method ve Access-Control-Request-Headers headerlarını içeren bir istek göndererek işler. OPTIONS isteğine dönen yanıt da asıl isteğin gönderilip gönderilemeyeceğini belirler.

OPTIONS /resources/post-here/ HTTP/1.1
Host: bar.other
...
Origin: http://foo.example
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-PINGOTHER, Content-Type

Origin headerı, bir sunucuya, tam olarak nereden geldiğini bildirir. Sunucu, kendi içerisindeki CORS politikasına göre isteği kabul edip etmeyeceğine karar verir.

Access-Control-Request headerlarıyla da atacağı asıl isteğin hangi metotta ve hangi custom headerları içereceğini belirtir.

Sunucu, OPTIONS isteğine döndüğü cevabın içerisinde

  • Access-Control-Allow-Origin headerıyla hangi originlerden gelen istekleri kabul edeceği
  • Access-Control-Allow-Methods headerıyla hangi metotları kabul edeceği
  • Access-Control-Allow-Headers headerıyla da gelecek olan istekte hangi headerları kabul edeceği

bilgilerini döner.

Bu işlem tarayıcılar (veya postman gibi araçlar) tarafından otomatik olarak gerçekleştirilir. Yani OPTIONS isteğini manuel olarak build etmemize gerek yok. Bunlar gerektiğinde browser tarafından otomatik olarak oluşturulup gerçekleştirilecektir.

Faydalanılan kaynak: Why is my browser sending an OPTIONS HTTP request instead of POST?