Ana içeriğe geç

CORS

Kaynaklar Arası Kaynak Paylaşımı

Okunuşu
kors
Güncellendi 2 dk okuma

Bu sayfayı paylaşın

Bağlantıyı gönderin, tanımı bağlantısıyla birlikte alıntılayın ya da kendi sitenizde bir kart olarak gösterin.

https://softwaredictionary.org/tr/terimler/cors

Kısaca

CORS, bir sunucunun JavaScript'ten istek yapan hangi diğer sitelerin yanıtlarını okuyabileceğini bildirmesini sağlayan tarayıcı güvenlik mekanizmasıdır.

CORS nedir?

Tarayıcılar aynı kaynak politikasını (same-origin policy) uygular: https://app.example.com gibi belirli bir şema, alan adı ve port birleşimi olan bir kaynakta (origin) çalışan JavaScript, varsayılan olarak farklı bir kaynağın yanıtlarını okuyamaz. CORS, sunucunun bu kuralı güvenli biçimde esnetmesinin standart yoludur; hangi kaynaklara izin verildiğini söyleyen HTTP başlıkları gönderir.

Bir sayfa başka bir kaynağa fetch() ile istek yaptığında tarayıcı isteğe bir Origin başlığı ekler. Yanıtta eşleşen bir Access-Control-Allow-Origin başlığı varsa tarayıcı veriyi betiğe verir; yoksa yanıtı engeller ve bir CORS hatası kaydeder. PUT, DELETE veya özel başlık kullananlar gibi veriyi değiştirebilecek istekler için tarayıcı önce izin sormak üzere bir OPTIONS preflight isteği gönderir.

CORS'u, sunucunun yazdığı ve kapıdaki görevli gibi davranan tarayıcının kontrol ettiği bir davetli listesi olarak düşünebilirsiniz. Önemli ayrıntı şudur: bunu sunucu değil tarayıcı uygular. curl gibi araçlar ve diğer sunucular CORS'u tamamen yok sayar; bu yüzden bir istek terminalde çalışırken tarayıcıda başarısız olabilir.

Sık yapılan bir hata, CORS'u bir API için koruma sanmaktır. CORS kimsenin istek göndermesini engellemez; yalnızca hangi web sayfalarının yanıtları tarayıcıda okuyabileceğini denetler. Gerçek koruma için yine kimlik doğrulama ve yetkilendirme gerekir. Özel API'lerde * ile tüm kaynaklara izin vermek risklidir; tarayıcılar ayrıca * değerini cookie gibi kimlik bilgileriyle birlikte kullanmayı reddeder.

Bir bakışta

CORS ile kaynaklar arası bir çağrı: https://a.com üzerindeki bir sayfa https://b.com üzerindeki bir API'yi çağırır. Tarayıcı önce bir OPTIONS preflight isteği gönderir, API Access-Control başlıklarıyla o kaynağa izin verir, ardından tarayıcı asıl PUT isteğini gönderir ve yanıtı betiğe verir.Tarayıcıhttps://a.com sayfasıAPIhttps://b.compreflightOPTIONS /ordersOrigin: https://a.com204 No ContentAccess-Control-Allow-Origin: https://a.comAccess-Control-Allow-Methods: PUTasıl istekPUT /orders200 OKAccess-Control-Allow-Origin: https://a.comTarayıcı veriyi betiğe verir
Hangi kaynaklara izin verildiğini sunucu söyler; bu başlıkları tarayıcı denetler ve ancak ondan sonra sayfadaki betiğin yanıtı okumasına izin verir.

Önemli noktalar

  • Tarayıcılar, aynı kaynak politikası gereği varsayılan olarak kaynaklar arası okumaları engeller.
  • Sunucunun gönderdiği CORS başlıkları tarayıcıya hangi kaynaklara izin verildiğini söyler.
  • Preflight OPTIONS istekleri, bazı isteklerden önce izni denetler.
  • CORS'u sunucular veya komut satırı araçları değil, tarayıcılar uygular.
  • CORS hataları frontend kodunda değil, sunucuda çözülür.

Örnek

Tek bir kaynağın API'yi çağırmasına izin vermek (Express)javascript
app.use((req, res, next) => {
  // Only this front end may read responses in the browser
  res.setHeader("Access-Control-Allow-Origin", "https://app.example.com");
  res.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
  res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");

  // Answer preflight requests without running the route
  if (req.method === "OPTIONS") return res.sendStatus(204);
  next();
});

Sık sorulan sorular

CORS hatasını nasıl düzeltirim?

API'nin sahibi olan sunucuyu, frontend'inizin kaynağını içeren bir Access-Control-Allow-Origin başlığı döndürecek ve preflight OPTIONS isteklerini yanıtlayacak şekilde yapılandırın. Hata yalnızca tarayıcı tarafındaki JavaScript ile giderilemez; ancak geliştirme sırasında aynı kaynaktan çalışan bir proxy yaygın bir geçici çözümdür.

CORS, API'mi saldırganlardan korur mu?

Hayır. CORS yalnızca tarayıcıların web sayfalarına yanıtları okutup okutmayacağını denetler; saldırganlar API'nizi başka araçlarla doğrudan çağırabilir. Yine kimlik doğrulama, yetkilendirme ve CSRF koruması gerekir.

Preflight isteği nedir?

Preflight, tarayıcının bazı kaynaklar arası isteklerden önce sunucunun ilgili metoda ve başlıklara izin verip vermediğini kontrol etmek için otomatik olarak gönderdiği bir OPTIONS isteğidir. Sunucu onaylamazsa asıl istek hiç gönderilmez.

İlgili sayfalar

Kaynaklar

Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin

Daha fazla

Ayarlar