Geliştirme esnasında CORS hatası aldınız ve Google'de aratıp bir kod parçası buldunuz ve kodunuza eklediniz sorun çözüldü işte bu kadar basit dediğinizi duyar gibiyim. Ancak işin aslı bukadarla sınırlı olmamalı Üst düzey bir geliştirici olma yolunda bazı temel kavramlara hakim olmak gerektiğini düşünüyorum.
İşte tamda bu yüzden CORS hakkında detaylı bir makale hazırlamaya karar verdim. Hazırsak başlayalım;
CORS nedir ne değildir?
Yeni başlayanlar için CORS bir güvenlik önlemi olarak algılanabilir ancak bu hem doğru hemde yanlış bir bilgidir. Birincisi, CORS kendi başına bir güvenlik önlemi değildir, aslında tam tersidir: CORS, ajax taleplerinizi farklı bir etki alanına göndermenizi engelleyen bir güvenlik önlemi olan "Aynı Kaynak İlkesi"ni yani Same Origin Policy atlatmanın bir yoludur.
Aynı Kaynak İlkesi yani sektörel terim ile Same Origin Policy, bir etki alanındaki bir web sitesinin başka bir etki alanına xhr talebinde bulunamayacağını belirtir. Bu, kötü niyetli bir web sitesinin bilinen bir web sitesine (örneğin Facebook veya Google), kullanıcının onları taklit edebilmesi için zaten oturum açmış olmasını umarak istekte bulunmasını engeller.
Bu politika tarayıcı tarafından uygulanır (küçük farklılıklar olsa da tümü SOP uygular), bu da bir sunucudan veya cURL veya POSTman gibi diğer HTTP istemcilerinden yapılan istekler için geçerli olmayacağı anlamına gelir. Ayrıca, sunucunun bunun üzerinde kesinlikle hiçbir kontrolü yoktur: Her isteği, güvenilir bir etki alanından geliyormuş gibi işleyecektir, istekleri engellemek tamamen tarayıcıya bağlıdır.
SOP, hiçbir şekilde bir saldırganın sunucunuza istekte bulunmasını engelleme amacı taşımaz (çünkü bir saldırganın tarayıcı kullanmayacağı açıktır). Yalnızca saygın bir tarayıcı kullanan meşru kullanıcıların farkında olmadan web sitenize istekte bulunmasını engellemek içindir.
Artık CORS, belirli bir web sitesinin normalde engellenmesine rağmen sunucunuza istekte bulunmasına izin vermek istediğiniz bazı durumlarda SOP'yi atlamanın bir yoludur. (genellikle, ön uç uygulamanızın API'nize istekte bulunmasına izin vermek için).
CORS nasıl çalışır?
CORS, HTTP'nin geri kalanı gibi, temelde tarayıcı ve sunucu arasında bir diyalogdur. Ön ucunuzun domain-a.com'da ve API'nizin Domain-b.com'da olduğunu varsayarsak, aşağıdaki gibi olur:
- Tarayıcı: "Hey Domain-B, Domain-A.com'daki bu komut dosyası benden size bir ajax sorgusu yapmamı istiyor, ancak bana sorun olmadığını söylemediğiniz sürece onu engellemem gerekiyor."
- Sunucu: "Bilmiyorum, ancak size yalnızca https://domain-a.com
GET, POST, OPTIONS ve DELETE istekleri yapmaya izin verildiğini ve bunun her 10 dakikada bir doğrulanması gerektiğini söyleyebilirim .
Tarayıcı kendi kendine düşünüyor" evet, bu doğru alan adı, istek göndereceğim! "
- Tarayıcı: " Merhaba alan-b, lütfen bu uç noktada POST yapmak istiyorum.
- Sunucu: Elbette, işte 200
Veya kullanıcı farklı bir etki alanında ise, diyalog daha kısa olur ve şöyle görünür:
- Tarayıcı: "Hey domain-b.com, malware-domain.com'daki bu komut dosyası benden size bir ajax sorgusu yapmamı istiyor, ancak bana sorun olmadığını söylemediğiniz sürece onu engellemem gerekiyor."
- Sunucu: "Bilmiyorum, ancak size yalnızca https://domain-a.com
GET, POST, OPTIONS ve DELETE isteklerinde bulunma izni olduğunu ve bunun her 10 dakikada bir doğrulanması gerektiğini söyleyebilirim .
Tarayıcı kendi kendine düşünüyor" Ah, bu doğru değil alan adı, bu isteği yapmasak iyi olur "ve konsolda bir hata göndermeye devam etsek iyi olur.
Tarayıcıda nasıl görünür?
Yukarıdaki küçük sahnelerimde, tarayıcıdan gelen ilk soru Preflight isteği olarak adlandırılır ve karşılık gelen HTTP fiili OPTIONS
. Sunucu Ön Kontrol İsteklerine her zaman gövdesi olmayan ancak Access-Control-Allow-Origin
ve birkaç başka başlık içeren 200 yanıtla yanıt vermelidir . Örneğimizde başlıklar şöyle olacaktır:
HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://domain-a.com
Access-Control-Allow-Methods: GET, POST, OPTIONS, DELETE
Access-Control-Max-Age: 3600
O sadece domain-A.com geliyorsa sadece yapabileceği, istek gerçekleştirebileceği tarayıcıya bildirir GET
, POST
, OPTIONS
veya DELETE
istekleri (bir PUT
istek örneğin engellenmiş olur) ve 3600 saniye boyunca bu bilgiyi önbelleğe alabilir böylece OPTIONS
her seferinde yeni bir istekte bulunmasına gerek kalmaz .
Temel bir girişten sonra makalemi ilerleyen zamanlarda daha da zenginleştireceğim.
Esenle kalın...