app.A.comfetch('B/api')api.B.comA-C-A-O: A.comOPTIONS preflightCORS allow → JS may readrequest always reaches server; response visibility is gated

Çapraz Kaynaklı Kaynak Paylaşımı

11 dk okumaWeb Teknolojisi

CORS, en kafa karıştırıcı web teknolojilerinden biridir çünkü sunucuya yapılan saldırıları engellemek değil, tarayıcılara neye izin vermeleri gerektiğini söylemekle ilgilidir. Bu ayrımı anladığınızda kurallar anlamlı hale gelir. CORS, sunucuların seçici olarak çapraz kaynak izinleri vermesine olanak tanır; aynı kaynak politikası varsayılan numaradır.

Makalenin tam metni aşağıda İngilizce olarak verilmektedir.

Çapraz Kökenli Kaynak Paylaşımı (CORS), bir sunucunun yanıtlarına diğer hangi kaynakların erişmesine izin verildiğini bildirmesine olanak tanıyan bir tarayıcı mekanizmasıdır. CORS, aynı kaynak politikasıyla (tarayıcının varsayılanı olan "bir kaynağın diğerinin yanıtlarını okumasına izin verme") birleştiğinde seçici rahatlama mekanizması sağlar.

Önce aynı kaynak politikası

Varsayılan olarak tarayıcılar, A kaynağında çalışan JavaScript'in B kaynağından gelen yanıtları okuyamayacağını zorunlu kılar. Bu, aynı kaynak politikasıdır. "Origin", şema + ana bilgisayar + bağlantı noktası anlamına gelir; https://a.example.com ve https://b.example.com farklı kaynaklardır.

Bu politika, bir sitenin JavaScript'inin oturum açtığınız başka bir sitedeki verilerinizi okumasını engeller. Politika olmadan, ziyaret ettiğiniz her site Gmail'inizi, bankanızı, özel depolarınızı okuyabilir; tarayıcınız çerezlerinizi otomatik olarak gönderir, böylece hedef yanıt verir ve saldırganın JS'si yanıtı görecektir.

CORS neler ekler

Birçok meşru kullanım durumu, çapraz köken okumaları gerektirir; bir CDN'den yazı tipleri, bir ön uçtan farklı bir alandaki arka uca API çağrıları, yerleşik sosyal medya widget'ları. CORS, yanıt veren sunucunun açıkça "evet, bu diğer kaynak yanıtlarımı okuyabilir" demesine olanak tanır.

Sunucu, yanıtında Access-Control-Allow-Origin üstbilgisini içerir. Tarayıcı şunları kontrol eder: eğer istekte bulunan kaynak değerle eşleşiyorsa (veya joker karakter * ise), yanıt JavaScript'e açıktır. Değilse, tarayıcı JavaScript'in onu okumasını engeller. isteği hala 'e gitti, sunucusu hala 'i aldı ve işledi - yalnızca JavaScript görünürlüğü kısıtlanmıştır.

Basit istekler ve önceden kontrol edilen istekler

"Basit" istekler için (temel içerik türleriyle GET, HEAD, POST), tarayıcı isteği gönderir ve yanıttaki CORS'yi kontrol eder. CORS izin vermiyorsa, JavaScript bunu okuyamaz.

"Karmaşık" istekler için (PUT, DELETE, özel başlıklar, JSON içerik türü), tarayıcı önce "orijin X bu isteği size yapabilir mi?" diye soran bir preflight OPTIONS isteği gönderir. Sunucu, izin verilen yöntemler ve başlıklarla yanıt verir. Tarayıcı yalnızca onaylanırsa gerçek isteği gönderir.

// Ön Kontrol
SEÇENEKLER /api/kullanıcılar HTTP/1.1
Kaynak: https://app.example.com
Erişim-Kontrol-İstek-Yöntemi: SİL
Erişim Kontrolü-İstek-Başlıkları: Yetkilendirme

// Sunucu yanıtı
HTTP/1.1 204 İçerik Yok
Erişim Kontrolü-İzin Verme-Origin: https://app.example.com
Erişim Kontrolü-İzin Verme Yöntemleri: DELETE, GET, POST
Erişim Kontrolü-İzin Ver-Başlıklar: Yetkilendirme, İçerik Türü
Erişim Kontrolü-Maksimum Yaş: 86400

Ön kontrol, tarayıcıların, bunları beklemeyen sunuculara karmaşık durum değiştirme istekleri göndermesini önler; yanlış yapılandırılmış sunuculara karşı bile temel bir savunmadır.

Kimlik Bilgileri ve CORS

Çerezler ve HTTP kimlik doğrulama başlıkları ("kimlik bilgileri") gönderilmez varsayılan olarak çapraz köken istekleri. Bunları dahil etmek için JavaScript şunu talep etmelidir:

fetch('https://api.example.com/data', { credentials: 'include' })

Ve sunucunun Access-Control-Allow-Credentials: true ve belirli bir köken (joker karakter değil *) ile yanıt vermesi gerekir. Erişim Kontrolü-İzin Ver-Köken. Genel sonuç şu: Access-Control-Allow-Origin: * + kimlik bilgileri = hiçbir şey çalışmıyor.

Genel CORS yanlış anlamaları

  • CORS, sunucular için bir güvenlik özelliği değildir. İstek, CORS'tan bağımsız olarak sunucuya ulaşır. Tarayıcı, reading yanıtından gelen JavaScript'i engeller. Sunucuların yine de kimlik doğrulaması ve yetkilendirmesi gerekir.
  • CORS tüm istekler için geçerli değildir. Aynı kökenli istekler CORS'u tetiklemez. Sunucudan sunucuya istekler de geçerli değildir. Tarayıcıdan sunucuya çapraz kaynak, CORS'un yaşadığı tek yerdir.
  • * joker karakteri, çerezlerle birleştirildiğinde tehlikelidir. Birçok eğitimde, hızlı bir düzeltme olarak Access-Control-Allow-Origin: * önerilir. Kimlik bilgileri olmayan genel API'ler için sorun değil. Kimlik doğrulaması olan herhangi bir şey için bozuk.
  • CORS hataları, sunucu tarafı sorunlarıdır. Tarayıcı konsolunda CORS hatalarını gördüğünüzde, düzeltme istekte bulunan kodda değil yanıt veren sunucudadır.

CORS ve CSRF

Kolayca karıştırılır. CORS, tarayıcının JavaScript'e ne göstereceğini kontrol eder. CSRF (CSRF makalemize bakın), tarayıcının isteği gönderip göndermeyeceği ile ilgilidir. CORS, CSRF'yi engellemez; JavaScript yanıtı göremediğinde bile istek gönderilebilir ve işlenebilir.

Çerezler kullanan durum değiştiren API'ler için CSRF belirteçleri veya SameSite çerezleri hala gereklidir. CORS bunların yerini almaz.

Ön kontrol önbelleği

Ön kontrol yanıtları Access-Control-Max-Age aracılığıyla önbelleğe alınabilir. Uzun maksimum yaşlar (24+ saat) ek yükü azaltır; her farklı (yöntem, URL, başlık) kombinasyon, süre dolana kadar yeniden ön kontrol yapmaz. Kısa maksimum yaşlar önemli miktarda gecikme biriktirebilir.

2026

  • Genel API'lerdeki ortak CORS modelleri: Erişim-Kontrol-İzin Ver-Origin: *, uç noktalar için kimlik doğrulama.
  • Kimliği doğrulanmış API'ler:, Access-Control-Allow-Credentials ile bir izin verilenler listesindeyse çağıran Kökeni geri yansıtır: true.
  • SaaS API'ler: tarafından yapılandırılan müşteri başına izin verilenler listeleri customer.
  • JS SDK teslimi: geniş CORS'ye sahip statik dosyalar, genellikle genel API modeli.

Sık sorulan sorular

Getirmem neden CORS hatasıyla başarısız oluyor?
Aradığınız sunucu, kaynağınız için uygun Access-Control-Allow-Origin başlığını içermiyordu. Sunucunun size izin verecek şekilde yapılandırılması gerekir veya onu aynı kaynaktan (genellikle bir arka uç proxy aracılığıyla) çağırmanız gerekir.
Geliştirici olarak CORS'u atlayabilir miyim?
Tarayıcıdaki kendi kodunuzdan hayır; tarayıcı tarafından uygulanır. Kendi sunucunuzdan (arka uç kodu), evet, çünkü CORS, sunucudan sunucuya istekler için geçerli değildir. Yaygın geçici çözüm, arka uç proxy'sidir: ön ucunuz arka ucunuzu arar; arka ucunuz üçüncü taraf API'yi çağırır.
CORS API'mi koruyor mu?
Doğrudan değil. API'ye CORS'tan bağımsız olarak erişilebilir; tarayıcı yine de isteği gönderir. Koruma, diğer sitelerdeki JavaScript'in yanıtları okuyamamasıdır. API'yi gerçekten korumak için sunucuda kimlik doğrulama ve yetkilendirmeyi kullanın.
Access-Control-Allow-Origin: * kullanmalı mıyım?
Yalnızca kimlik bilgilerini kabul etmeyen genel API'ler için. Çerezleri veya yetkilendirme başlıklarını içeren herhangi bir şey için, belirli kökenleri kullanın veya çağıran Kökeni yankılayın (doğrulama ile). Joker karakter + kimlik bilgilerine tarayıcılar tarafından izin verilmez.
CORS neden yalnızca bazı isteklerin ön kontrolünü yapıyor?
Basit istekler (temel içerik türlerine sahip ve özel başlık içermeyen GET, HEAD, POST) muaftır; bunlar, CORS'un var olmasından önce HTML formlarının zaten yapabildiklerine eşdeğerdir. Karmaşık isteklerin HTML formu analogu yoktur, bu nedenle sunucuya herhangi bir durum değişikliğinden önce reddetme şansı vermek için ön kontrol yaparlar.
CORS Açıklandı: Tarayıcılar Çapraz Kaynaklı İsteklere Ne Zaman İzin Verileceğine Nasıl Karar Veriyor?