CORS nedir? Preflight (OPTIONS) isteği ne zaman gönderilir?
Cevap
CORS (Cross-Origin Resource Sharing), tarayıcının Same-Origin Policy kısıtlamasını sunucunun izniyle gevşetmesini sağlayan mekanizmadır. Origin = protokol + domain + port; https://app.com ile https://api.app.com farklı origin'dir.
Önemli nokta: CORS bir tarayıcı kuralıdır. İstek çoğu zaman sunucuya ulaşır; tarayıcı, cevapta uygun başlık yoksa JavaScript'in cevabı okumasını engeller. Postman veya curl'de CORS hatası olmaz.
Access-Control-Allow-Origin: https://app.com
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 600Preflight ne zaman olur?
"Basit istek" olmayan durumlarda tarayıcı önce bir OPTIONS isteği gönderip izin sorar:
- Metot
GET,HEAD,POSTdışındaysa (PUT,DELETE,PATCH). Content-Typeapplication/jsongibi basit olmayan bir tipse.Authorizationgibi özel header'lar varsa.
Access-Control-Max-Age preflight cevabını cache'leyerek her istekte tekrarını önler.
Sık hatalar
- Cookie göndermek için client'ta
credentials: "include"ve sunucudaAllow-Credentials: truegerekir; bu durumdaAllow-Origin: *kullanılamaz, origin açıkça yazılmalıdır. - CORS'u frontend'den "kapatmak" mümkün değildir; çözüm sunucu ayarı veya geliştirmede bir proxy'dir (Vite
server.proxy). - CORS bir yetkilendirme (authorization) mekanizması değildir; sunucu yine kimlik doğrulaması yapmalıdır.
İlgili Tarayıcı & Web API'leri soruları
- Bir URL'yi tarayıcıya yazıp Enter'a bastığınızda neler olur?
- Web Worker nedir? Service Worker'dan farkı nedir?
- IntersectionObserver ne işe yarar? Örnek kullanım verin.
- Tarayıcı önbelleği nasıl çalışır? Cache-Control başlıkları nelerdir?
- localStorage, sessionStorage, cookie ve IndexedDB arasındaki farklar nelerdir?
- script etiketinde async ile defer arasındaki fark nedir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.