- Konu sahibi
- #1
CORS proxy, tarayıcı ile hedef API arasına giren sunucu tarafı ara katmandır. Ön yüzdeki JavaScript, farklı origin’deki API yanıtını CORS nedeniyle okuyamıyorsa isteği kendi sunucunuzdaki bir uç noktaya gönderir; sunucunuz hedef API’ye bağlanır ve sonucu tarayıcıya döndürür. Üretimde güvenli yaklaşım, herkese açık “her URL’yi getir” servisi kullanmak değil; hedefleri, metotları, başlıkları ve kaynakları sınırlandırılmış bir proxy kurmaktır.
Bir web sayfasının origin’i şema, ana makine ve porttan oluşur. Örneğin
Hedef API uygun
Örneğin ön yüzünüz
Basit bir istemci çağrısı şöyle olabilir:
Bu örnek, uç noktanın JSON döndürdüğünü varsayar; ağ ve JSON ayrıştırma hataları da son hata işleyicisine gider.
Kararı aşağıdaki gibi verebilirsiniz. Güvenli proxy tasarımı yalnızca CORS başlığı eklemekle bitmez; hedef doğrulaması ve gerekiyorsa kimlik/yetki kontrolleri de gerekir.
Gelen
Geliştirme sırasında yerel test için geçici olarak yardımcı olabilir; fakat gerçek kullanıcıların tarayıcılarını değiştiremez. Üretim çözümü API’nin CORS yapılandırması veya kontrolünüzdeki sunucu tarafı geçittir.
Hayır. İstekler yine hedef API’ye ulaşır. Proxy yalnızca erişim katmanını değiştirir; kota, kullanım şartları ve yetkilendirme kuralları hedef servis tarafından uygulanmaya devam eder.
CORS neden ortaya çıkar?
Bir web sayfasının origin’i şema, ana makine ve porttan oluşur. Örneğin
https://app.example.com ile https://api.example.com ana makine bakımından farklı olduğu için farklı origin kabul edilir. Tarayıcı, başka bir origin’e yapılan isteğin yanıtını JavaScript koduna vermeden önce hedef sunucunun CORS izinlerini kontrol eder.Hedef API uygun
Access-Control-Allow-Origin başlığını göndermiyorsa, sunucu isteği almış olsa bile tarayıcı yanıtı uygulamaya açmayabilir. API size aitse ilk tercih CORS proxy değil, API üzerinde yalnızca ihtiyaç duyulan origin’lere izin veren doğrudan CORS yapılandırmasıdır. Hedef üçüncü tarafa aitse veya API anahtarının tarayıcıya gönderilmemesi gerekiyorsa sunucu tarafı proxy anlamlı hale gelir.CORS proxy akışı
Örneğin ön yüzünüz
https://app.example.com, hedef servisiniz de https://api.example.com olsun. Ön yüz, hedef alan adına doğrudan gitmek yerine kendi alan adındaki /api/data uç noktasını çağırır.- Tarayıcı
/api/dataadresine istek gönderir. Bu uç nokta ön yüzle aynı origin’deyse bu adımda cross-origin CORS izni gerekmez. - Proxy, sunucu tarafında sabit olarak tanımlanmış hedef API’ye bağlanır.
- Proxy hedef yanıtın durum kodunu ve içeriğini kontrol eder; gereksiz başlıkları ve hassas verileri istemciye aktarmaz.
- Yanıtı ön yüze döndürür. Ön yüz farklı bir origin’de barınıyorsa proxy, yalnızca izin verilen origin için uygun CORS başlıklarını ekler.
Basit bir istemci çağrısı şöyle olabilir:
Kod:
fetch('/api/data')
.then(response => {
if (!response.ok) {
throw new Error('HTTP ' + response.status);
}
return response.json();
})
.then(data => console.log(data))
.catch(error => console.error('Veri alınamadı:', error.message));
Bu örnek, uç noktanın JSON döndürdüğünü varsayar; ağ ve JSON ayrıştırma hataları da son hata işleyicisine gider.
response.ok kontrolü önemlidir; yalnızca fetch() çağrısının hata fırlatmaması, HTTP yanıtının başarılı olduğu anlamına gelmez.Hangi durumda proxy kullanılmalı?
Kararı aşağıdaki gibi verebilirsiniz. Güvenli proxy tasarımı yalnızca CORS başlığı eklemekle bitmez; hedef doğrulaması ve gerekiyorsa kimlik/yetki kontrolleri de gerekir.
| Durum | Tercih | Neden |
|---|---|---|
| API size ait | Doğrudan CORS | Ek sunucu ve ağ adımı gerekmez |
| Üçüncü taraf API sunucudan kullanıma izin veriyor | Kısıtlı proxy değerlendirilebilir | Yetkilendirme, kullanım şartları ve kota ayrıca korunur |
| API anahtarı gizli kalmalı | Sunucu proxy’si | Anahtar tarayıcı koduna gönderilmez |
| Kullanıcı rastgele URL verecek | Proxy’den kaçının veya güçlü allowlist kullanın | SSRF ve kötüye kullanım riski yükselir |
Güvenli kurulum adımları
- Hedefleri tam URL olarak kullanıcıdan almak yerine
weatherveyacataloggibi kaynak adlarını sabit hedeflerle eşleyin. - Proxy’nin yalnızca
httpskullanmasına ve gerekli HTTP metotlarına izin verin. Gereksiz istek başlıklarını ve istemcinin gönderdiği kimlik bilgilerini hedefe otomatik aktarmayın. - API anahtarlarını yalnızca sunucu ortamında veya güvenli gizli bilgi yönetiminde tutun; hata mesajlarına, günlük kayıtlarına ve istemci yanıtlarına yazmayın.
- İstek ve yanıt boyutunu, toplam zaman aşımını ve istek hızını sınırlayın. Yönlendirmeleri varsayılan olarak kapatın; zorunluysa her yeni hedefte aynı izin ve IP kontrollerini yeniden uygulayın.
- Hedef ana makineyi allowlist ile doğrulayın. Çözümlenen tüm IPv4/IPv6 adreslerinde localhost, özel ağ ve bulut metadata hedeflerini engelleyin; bağlantının doğrulanan adrese kurulduğundan emin olun. Kontrolden sonra yeniden denetlenmeyen DNS çözümlemesi, DNS rebinding açığı bırakabilir. Ağ çıkışını da yalnızca gerekli hedeflere sınırlandırın.
- Özel veriye erişen proxy uç noktasında kullanıcı kimliğini ve her kaynağa erişim yetkisini doğrulayın. CORS bir kimlik doğrulama yöntemi değildir; tarayıcı dışındaki istemcilerin isteğini engellemez.
- Ön yüze izin verilecek origin’leri açıkça tanımlayın. Kimlik bilgili isteklerde
Access-Control-Allow-Origin: *kullanmayın; belirli origin ve gerektiğindeAccess-Control-Allow-Credentials: trueyapılandırması gerekir. - Geliştirici araçlarında önce varsa
OPTIONSön isteğini, sonra gerçek isteğin HTTP durum kodunu ve yanıt başlıklarını kontrol edin.
Sık yapılan hatalar
mode: 'no-cors' CORS’u okunabilir bir yanıtla çözmez; cross-origin yanıtı opak hale getirir ve JavaScript’in içeriği okumasını engeller. API size aitken proxy eklemek de gereksiz gecikme ve yeni bir saldırı yüzeyi oluşturabilir.Gelen
Origin değerini doğrulamadan doğrudan Access-Control-Allow-Origin olarak geri yansıtmak güvenli değildir. Özellikle çerez veya başka kimlik bilgileri kullanılıyorsa yalnızca önceden tanımlanmış origin’ler kabul edilmelidir. Ayrıca hedef URL’yi tamamen kullanıcıya bırakmak, proxy’yi SSRF aracına dönüştürebilir. Yalnızca IP adresinin veya alan adının biçimsel olarak geçerli olması yeterli değildir; hedefin izin verilen kaynaklardan biri olduğu da doğrulanmalıdır.Sık sorulan sorular
Proxy kurmadan CORS hatasını tarayıcı eklentisiyle çözebilir miyim?
Geliştirme sırasında yerel test için geçici olarak yardımcı olabilir; fakat gerçek kullanıcıların tarayıcılarını değiştiremez. Üretim çözümü API’nin CORS yapılandırması veya kontrolünüzdeki sunucu tarafı geçittir.
Proxy hedef API’nin kota sınırlarını ortadan kaldırır mı?
Hayır. İstekler yine hedef API’ye ulaşır. Proxy yalnızca erişim katmanını değiştirir; kota, kullanım şartları ve yetkilendirme kuralları hedef servis tarafından uygulanmaya devam eder.