CORS
Kaynaklar Arası Kaynak Paylaşımı
- Okunuşu
- kors
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
Ö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
OPTIONSistekleri, 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
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
- HTTPWeb Geliştirme, s. 20HTTP, tarayıcıların, uygulamaların ve sunucuların basit bir istek-yanıt döngüsüyle web sayfaları ve veri alışverişi yapmasını sağlayan protokoldür.
- APIBackend ve API'ler, s. 2API, bir yazılımın başka bir yazılımdan veri ya da işlem talep etmesini sağlayan, belgelenmiş ve öngörülebilir kurallar bütünüdür.
- CSRFGüvenlik, s. 5CSRF, oturum açmış kullanıcının tarayıcısını güvenilir bir siteye istenmeyen istek göndermeye kandıran, sitenin de gerçek kullanıcı eylemi sandığı saldırıdır.
- MiddlewareBackend ve API'ler, s. 29Middleware, bir sistemin iki katmanı arasında duran yazılımdır; bir web sunucusunda çoğunlukla gelen istek ile son yanıt arasında çalışan koddur.
- JavaScriptWeb Geliştirme, s. 25JavaScript, web tarayıcılarında sayfaları etkileşimli hale getiren ve Node.js gibi çalışma ortamlarıyla sunucularda da çalışan programlama dilidir.
- CookieWeb Geliştirme, s. 7Cookie, bir web sitesinin tarayıcıdan saklamasını ve sonraki isteklerle geri göndermesini istediği, çoğunlukla oturum açık tutmak için kullanılan küçük veridir.
- HTTP BaşlığıWeb Geliştirme, s. 21HTTP başlığı, bir HTTP isteği ya da yanıtıyla gönderilen ad-değer satırıdır; içerik türü, önbellek kuralları ya da kimlik bilgileri gibi ayrıntıları taşır.
Kaynaklar
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin