Kökler Arası Kaynak Paylaşımı

Cross-Origin Resource Sharing (CORS), bir web sayfası üzerindeki bazı kaynakların (örneğin font dosyaları), kaynağın sunulduğu alan adının dışındaki bir alan adından istenebilmesine izin veren bir mekanizmadır.  Bir web sayfası, özgürce kökler arası resimleri, stil sayfalarını, betikleri ve videoları ekleyebilmektedir. Ancak, bazı “alanlar arası” istekler, özellikle Ajax istekleri, Aynı Kök Politikası nedeniyle varsayılan olarak yasaklanmıştır.
CORS, kökler arası isteklerin güvenli olup olmadığına karar vermek için tarayıcı ve sunucu arasında bir etkileşimin nasıl yapılacağını tanımlamaktadır. Aynı kök isteklerine oranla daha fazla özgürlük ve işlevsellik sağlamaktadır, ancak basitçe tüm kökler arası isteklere izin vermekten daha güvenlidir. W3C tarafından da önerilen standart olmuştur.
CORS güvenlik ile ilgili değildir, içerik sahipliğinin korunması ile ilgilidir. Saldırganların Aynı Kök Politikası'na (SOP) uyması beklenmemelidir. CORS pek çok tarayıcı üzerinden kolayca devre dışı bırakılabilmektedir.

  CORS nasıl çalışır?

CORS standardı, tarayıcı ve sunucuların izinleri olması halinde uzak URL’lere istekte bulunabileceği bir yöntem sunan yeni HTTP başlıkları tanımlamaktadır. Bazı doğrulama ve yetkilendirme sunucu tarafından yapılsa da, bu başlıkları desteklemek ve belirttikleri kısıtlamaları uygulamak tarayıcıların sorumluluğundadır.
Veriyi değiştirebilen Ajax ve HTTP istek metotları (genellikle GET dışındaki HTTP metotları veya bazı MIME türleri ile POST kullanımı) için, tanımlama, tarayıcıların sunucudan HTTP OPTIONS istek metodu ile desteklenen metotları öğrenerek ve sunucudan onay aldıktan sonra asıl HTTP metodu ile asıl isteği göndererek bir ön kontrol yapmalarını zorunlu tutmaktadır. Sunucular, login bilgilerinin (çerezler ve HTTP kimlik doğrulama verisi dahil) isteklerle birlikte gönderilip gönderilememesi konusunda istemcileri de bilgilendirebilmektedir.

Ön Kontrol örneği

Bazı kökler arası Ajax istekleri gönderilirken, CORS’u destekleyen modern tarayıcılar, belirtilen aksiyonu yapma yetkisinin olup olmadığına karar vermek için ilave bir "ön kontrol" isteği eklemektedir.
OPTIONS /
Host: service.example.com
Origin: http://www.example.com
Eğer service.example.com isteği kabul etmek istiyorsa, aşağıdaki başlıklarla cevap verebilir:
Access-Control-Allow-Origin: http://www.example.com
Access-Control-Allow-Methods: PUT, DELETE

Başlıklar

CORS ile ilgili HTTP başlıkları

Tarih

Kökler arası destek, VoiceXML tarayıcılarında güvenli kökler arası veri isteklerine izin vermek için VoiceXML 2.1 sürümünde yer alması için Mart 2004'te Tellme Networks çalışanlarından Matt Oshry, Brad Porter ve Michael Bodell tarafından önerilmiştir. Mekanizma VoiceXML’e özgü olmayan genel bir yapıya sahip olarak kabul edilmiştir ve sonrasında bir uygulama notu olarak ayrılmıştır. Ana tarayıcı sağlayıcılarından katılımcılarla birlikte W3C WebApps Çalışma Grubu, bu notu resmi W3C Öneri durumuna getirmek üzere W3C Çalışma Taslağı olarak resmileştirmeye başlamıştır.
Mayıs 2006'da ilk W3C Çalışma Taslağı sunulmuştur. Mart 2009'da taslak "Cross Origin Resource Sharing" olarak isim değiştirmiştir ve Ocak 2014'te bir W3C Önerisi olarak kabul edilmiştir.

CORS vs JSONP

CORS, JSONP’ye karşı modern bir alternatif olarak da kullanılabilmektedir. JSONP sadece GET isteklerini desteklerken, CORS diğer HTTP istek türlerini de desteklemektedir. CORS kullanımı, JSONP’den daha iyi hata işleme imkanları sunan XMLHttpRequest’lerin web programcıları tarafından kullanılabilmesine imkan tanımaktadır. CORS pek çok modern tarayıcı tarafından desteklenmektedir. JSONP, harici site ele geçirildiğinde siteler arası betik çalıştırma (XSS) sorunlarına yol açabilirken, CORS güvenliği sağlamak için web sayfalarının cevapları manuel olarak işlemesine izin vermektedir.