İletişim

CORS (Kaynaklar Arası Paylaşım) Nedir?

Kısa tanım

CORS (Cross-Origin Resource Sharing), bir sunucunun HTTP başlıklarıyla, kendi origin'i dışındaki hangi sitelerin tarayıcıda çalışan JavaScript aracılığıyla yanıtlarını okuyabileceğini belirttiği mekanizmadır. Tarayıcıların varsayılan aynı köken politikasını (same-origin policy) kontrollü biçimde gevşetir. CORS'u tarayıcı uygular; sunucuya doğrudan gönderilen isteklere karşı bir koruma sağlamaz.

Diğer adları: Cross-Origin Resource Sharing, kaynaklar arası kaynak paylaşımı, CORS hatası, Access-Control-Allow-Origin, CORS policy

Tarayıcının farklı kaynaklı isteği önce OPTIONS ile sorup sunucunun izin başlığından sonra yanıtı sayfaya verdiği CORS akışı

Önce aynı köken politikası

Tarayıcılarda bir "origin" (köken) üç parçadan oluşur: şema, host ve port. https://ornek.com ile http://ornek.com şeması, https://api.ornek.com host'u, https://ornek.com:8080 ise portu farklı olduğu için ayrı kökenlerdir. Aynı köken politikası gereği bir sayfadaki JavaScript, başka bir kökene istek gönderebilir ama kural olarak gelen yanıtı okuyamaz. Bu kısıt, açık bir sekmedeki kötü niyetli sitenin, kullanıcının oturum açtığı başka bir sitenin verilerini okumasını engeller.

Ancak modern uygulamalarda ön yüzün app.ornek.com, API'nin api.ornek.com üzerinde çalışması çok olağandır. CORS, sunucunun "bu kökenin yanıtlarımı okumasına izin veriyorum" diyebilmesini sağlayan standart yoldur ve bunu HTTP başlıkları ile yapar.

Basit istekler ve preflight

GET, HEAD ya da POST metoduyla, yalnızca standart başlıklar ve text/plain, multipart/form-data veya application/x-www-form-urlencoded içerik türüyle gönderilen istekler "basit istek" sayılır. Tarayıcı bunları doğrudan gönderir, yanıtı ise Access-Control-Allow-Origin başlığına bakarak JavaScript'e verir ya da vermez.

PUT veya DELETE gibi bir HTTP metodu, Authorization gibi bir başlık ya da application/json içerik türü kullanıldığında tarayıcı önce bir OPTIONS isteğiyle izin ister. Buna preflight denir:

OPTIONS /api/siparisler/42 HTTP/1.1
Origin: https://panel.ornek.com
Access-Control-Request-Method: DELETE
Access-Control-Request-Headers: authorization

HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://panel.ornek.com
Access-Control-Allow-Methods: GET, POST, DELETE
Access-Control-Allow-Headers: Authorization, Content-Type
Access-Control-Max-Age: 600
Vary: Origin

Yanıt izin verirse tarayıcı asıl DELETE isteğini gönderir; Access-Control-Max-Age bu iznin kaç saniye önbellekte tutulacağını belirtir. Yanıtı kökene göre değişen sunucularda Vary: Origin eklemek, bir ara önbelleğin bir kökene verilen yanıtı başkasına sunmasını önler.

Çerezli istekler ve joker karakter

Varsayılan olarak kökenler arası isteklerde çerezler gönderilmez. İstemci credentials: "include" ile çerez göndermek istediğinde sunucu Access-Control-Allow-Credentials: true döndürmeli ve Access-Control-Allow-Origin değerinde * yerine açık bir köken yazmalıdır; tarayıcı joker karakterli yanıtı reddeder. Burada sık görülen tehlikeli kestirme, gelen Origin başlığını kontrol etmeden aynen geri yansıtmaktır. Bu, çerezli isteklerle birleştiğinde herhangi bir sitenin oturum açmış kullanıcının verilerini okuyabilmesi anlamına gelir. Doğru yaklaşım, izin verilen kökenleri sunucuda bir listede tutup yalnızca eşleşenleri yanıtlamaktır.

CORS bir sunucu koruması değildir

CORS kuralları yalnızca tarayıcılar tarafından uygulanır. curl, bir sunucu betiği ya da bot bu başlıkları hiç umursamaz ve API'nize istediği isteği gönderir. Üstelik tarayıcıda bile basit bir POST isteği sunucuya ulaşır ve işlenir; CORS yalnızca yanıtın okunmasını engeller. Bu yüzden kimin neye erişebileceği her zaman sunucu tarafında yetkilendirme ile kontrol edilmeli, durum değiştiren işlemler ayrıca CSRF'e karşı korunmalıdır.

Konsolda "CORS policy" hatası gördüğünüzde sorun neredeyse her zaman sunucu yapılandırmasındadır: istek çoğu zaman sunucuya ulaşmış, yalnızca tarayıcı yanıtı ön yüze vermemiştir. Çözüm ön yüz kodunda değil, API'nin doğru başlıkları döndürmesindedir. Ayrıntılı kurallar MDN CORS rehberinde anlatılır.

İlgili terimler

← Sözlüğe dön