CORS Test Aracı

Sonraki

CORS hataları, tarayıcı konsolundaki “klasik” kırmızıdır: farklı bir kökenden bir API’ye istek atarsınız ve tarayıcı yanıtı engeller. Bu test aracı, yapıştırdığınız herhangi bir URL’ye seçtiğiniz köken ve yöntemle bir preflight OPTIONS isteği gönderir, ardından Access-Control-* başlıklarını çözerek sunucunun neye izin verdiğini, neyi engellediğini ve tarayıcının neden şikâyet ettiğini tam olarak görmenizi sağlar.

CORS nasıl test edilir

  1. 1

    Hedef URL'yi girin

    Ön uçtan çağırmak istediğiniz API uç noktası. Sorgu dizesini ve protokolü ekleyin.

  2. 2

    Yöntemi ve kökeni (origin) ayarlayın

    GET/POST/PUT/DELETE/PATCH. Köken, sitenizin URL'si veya simüle etmek istediğiniz herhangi bir köken olabilir.

  3. 3

    Preflight'i anlayın

    Araç, seçtiğiniz köken ve yöntemle, ayrıca Access-Control-Request-Headers: Content-Type başlığıyla her zaman bir OPTIONS isteği gönderir; bu, tarayıcının bir JSON isteğinden önce gönderdiği preflight'ın aynısıdır.

  4. 4

    Testi çalıştırın

    Araç preflight'ı gönderir ve HTTP durumunu ve CORS yanıt başlıklarını raporlar: Allow-Origin, Allow-Methods, Allow-Headers, Allow-Credentials ve Max-Age.

  5. 5

    Yanlış yapılandırmayı düzeltin

    Rapor, neyin eksik veya yanlış olduğunu işaretler, eksik Allow-Origin, yasak başlık, izin verilmeyen yöntem.

Önemli başlıklar

Başlık Ne işe yarar
Access-Control-Allow-Origin Hangi kökenlerin yanıtı okuyabileceği
Access-Control-Allow-Methods Preflight: hangi yöntemlere izin verildiği
Access-Control-Allow-Headers Preflight: hangi istek başlıklarına izin verildiği
Access-Control-Allow-Credentials Çerezlere/kimlik doğrulamaya izin verilip verilmediği
Access-Control-Expose-Headers JS’in okuyabileceği yanıt başlıkları
Access-Control-Max-Age Preflight sonucunun ne kadar süre önbelleğe alınacağı

Basit istekler vs. preflight gerektiren istekler

Bir istek yalnızca şunların tümü doğruysa “basit”tir (preflight yok):

  • Yöntem GET, HEAD veya POST’tur.
  • Başlıklar yalnızca Accept, Accept-Language, Content-Language, Content-Type (belirli değerlerle) ile sınırlıdır.
  • Content-Type, varsa, application/x-www-form-urlencoded, multipart/form-data veya text/plain’dir.

Bunun dışındaki her şey, bir JSON gövdesi, bir Authorization başlığı, özel bir X-Foo başlığı, bir PUT/DELETE/PATCH, bir preflight OPTIONS tetikler. Sunucu, preflight’a doğru Allow-* başlıklarıyla yanıt vermelidir; aksi takdirde gerçek istek hiçbir zaman gönderilmez.

Yaygın CORS hataları

  • “No Access-Control-Allow-Origin header” → sunucu bu başlığı ayarlamıyor. İstemcide değil, sunucuda düzeltin.
  • “Credentials mode requires Allow-Origin not to be *” → çerez gönderiyorsanız Allow-Origin belirli bir köken olmalıdır (ya da Origin başlığını geri yansıtmalıdır).
  • “Request header X not allowed” → preflight yanıtında Access-Control-Allow-Headers listesine X’i ekleyin.
  • “Method not allowed” → yöntemi Access-Control-Allow-Methods listesine ekleyin.
  • “Redirect not allowed in preflight” → preflight yönlendirmeleri izleyemez. OPTIONS uç noktası doğrudan yanıt vermelidir.

Allow-Origin: * vs. Origin’i geri yansıtmak

Access-Control-Allow-Origin: * esnektir ancak kimlik bilgileriyle birlikte kullanılamaz. Üretimde, isteğin Origin’ini (bir izin listesine göre doğruladıktan sonra) geri yansıtın ve çerez gerekiyorsa Allow-Credentials: true olarak ayarlayın.

Geçici çözüm olarak proxy kullanmak

Sunucuyu denetleyemiyorsanız, kendi alan adınızdaki ince bir proxy CORS’u tamamen ortadan kaldırır, tarayıcı bunu same-origin olarak görür. Birçok barındırma platformu (Vercel, Netlify, Cloudflare) tam da bunun için yeniden yazma (rewrite) kuralları sunar.

Sık Sorulan Sorular

Kötü niyetli bir sayfanın, tarayıcınızın çerezlerini kullanarak başka bir sitedeki özel verileri okumasını önlemek için. CORS olmasaydı, evil.com’u ziyaret etmek bu sitenin bankanızın iç API’sine sizin adınıza istek atmasına izin verebilirdi. CORS, bankayı çapraz kökenli okumalara açıkça izin vermeye zorlar.

Yalnızca geliştirme sırasında. Chromium’da bir --disable-web-security bayrağı vardır ama tüm siteleri etkiler ve tehlikelidir. Doğru çözüm, sunucu tarafı başlıklar veya bir proxy’dir.

Postman bir tarayıcı değildir, CORS’u tamamen yok sayar. CORS yalnızca tarayıcılar tarafından JavaScript istekleri için uygulanır. Postman’de çalışan bir sunucu otomatik olarak CORS açısından doğru değildir.

Görseller ve klasik <script> etiketleri CORS olmadan çapraz kökenli yüklenir, ancak JS içeriklerini okuyamaz. <img crossorigin> ve fetch() ise CORS’u uygular; bu yüzden canvas üzerine çizilen görseller, CORS olmadan “kirlenmiş” (tainted) hâle gelir.

İlgili Araçlar