
Geliştiriciyim, CORS Hatası Alıyorum: HTTP Header Görüntüleyici Kullanarak 'Access-Control-Allow-Origin' Sorununu Çözme Rehberi
Web geliştirme dünyasında yer alan her geliştiricinin mutlaka karşılaştığı, kimi zaman sinir bozucu olabilen, ancak özünde web güvenliğinin temel bir parçası olan bir sorun vardır:
CORS hatası. Özellikle "Access-Control-Allow-Origin" başlığı ile ilgili hatalar, çoğu zaman bir API çağrısı yaparken veya farklı bir domaindeki bir kaynağa erişmeye çalışırken karşımıza çıkar. Bu rehberde, bu yaygın sorunu kökten çözmek için en güçlü araçlardan birini, yani bir
HTTP Header Görüntüleyici'yi nasıl kullanacağınızı adım adım anlatacağız. Artık sadece hatayı görmekle kalmayacak, aynı zamanda onu nasıl teşhis edip giderebileceğinizi de öğreneceksiniz.
CORS Nedir ve Neden Önemlidir?
CORS (Cross-Origin Resource Sharing), tarayıcıların, web sayfalarının kendi orijinal etki alanlarından (domain) farklı bir etki alanındaki kaynaklara (örneğin, API'ler, yazı tipleri, resimler) erişmesine izin veren bir güvenlik mekanizmasıdır. Temelinde, "Same-Origin Policy" (Aynı Kaynak Politikası) adı verilen bir tarayıcı güvenlik kuralı yatar. Bu politika, bir web sayfasının, yüklendiği kaynak (protokol, ana bilgisayar ve port) ile aynı olmayan bir kaynaktan veri okumasını veya ona istek göndermesini engeller. Bu, kötü niyetli bir web sitesinin sizin bilginiz dışında başka bir sitedeki (örneğin banka hesabınız) verilerinize erişmesini önlemek için kritik bir güvenlik katmanıdır.
Ancak günümüzün modern web uygulamaları, farklı kaynaklardan veri ve hizmetleri entegre ederek çalışır. İşte bu noktada CORS devreye girer. CORS, sunucuların belirli "cross-origin" isteklerine (farklı kaynaklardan gelen isteklere) izin verip vermediğini belirlemesine olanak tanır. Sunucu, yanıtında belirli HTTP başlıklarını göndererek tarayıcıya bu tür isteklerin güvenli olduğunu bildirir. Eğer bu başlıklar doğru ayarlanmazsa, tarayıcı güvenlik politikası gereği isteği engeller ve genellikle tanıdık bir
CORS hatası mesajı ile karşılaşırız.
Sorunun Merkezi: 'Access-Control-Allow-Origin' Başlığı
Karşılaştığımız
CORS hatası mesajlarının çoğunun temelinde, sunucunun yanıtında 'Access-Control-Allow-Origin' başlığının olmaması, yanlış olması veya beklendiği gibi davranmaması yatar. Bu başlık, sunucunun tarayıcıya, yanıtındaki kaynağa hangi origin'lerin (protokol, ana bilgisayar, port kombinasyonları) erişmesine izin verdiğini bildirmesini sağlar.
Örneğin, `https://uygulama.com` adresinde çalışan bir frontend uygulamanız var ve bu uygulama `https://api.example.com` adresindeki bir API'ye istek gönderiyor. Eğer `api.example.com` sunucusu, yanıtında `Access-Control-Allow-Origin: https://uygulama.com` veya `Access-Control-Allow-Origin: *` (tüm origin'lere izin verir, ancak güvenlik riskleri taşıyabilir) başlığını içermezse, tarayıcınız bu API yanıtını kabul etmeyecek ve bir CORS hatası fırlatacaktır.
Neden CORS Hatası Alırsınız?
CORS hatalarının ortaya çıkmasının birkaç yaygın nedeni vardır:
*
Sunucu 'Access-Control-Allow-Origin' başlığını hiç göndermiyor: Sunucunuzun yapılandırmasında bu başlık eksikse veya hiç ayarlanmamışsa, tarayıcı hangi origin'lere izin verildiğini bilemez ve isteği engeller.
*
Yanlış Origin Belirtildi: Sunucu, 'Access-Control-Allow-Origin' başlığını gönderiyor olabilir, ancak bu başlığın değeri sizin isteğinizin Origin başlığıyla eşleşmiyor olabilir. Örneğin, sizin isteğiniz `https://www.uygulama.com` adresinden gelirken, sunucu sadece `https://uygulama.com` adresine izin veriyor olabilir ( subdomain farkı).
*
Preflight İstek Sorunları: Bazı karmaşık HTTP istekleri (PUT, DELETE gibi yöntemler veya belirli özel başlıklar içeren istekler), gerçek isteğin gönderilmesinden önce bir "preflight" (ön kontrol) isteği (OPTIONS yöntemiyle) gönderir. Bu preflight isteği başarılı bir şekilde yanıtlanmazsa veya gerekli CORS başlıklarını içermezse, asıl istek bile asla gönderilmez.
*
Geliştirme ve Üretim Ortam Farkları: Geliştirme ortamınızda (örneğin `http://localhost:3000`) çalışan bir uygulama, genellikle tarayıcı proxy'leri veya geliştirme sunucusu ayarları nedeniyle CORS hataları almazken, üretim ortamına (gerçek bir domain) dağıtıldığında aniden CORS hataları ile karşılaşabilir.
Çözümün Anahtarı: HTTP Header Görüntüleyici
CORS hatalarını teşhis etmenin en etkili yolu, tarayıcınızın geliştirici araçlarında bulunan
HTTP Header Görüntüleyici'yi kullanmaktır. Bu araç, web isteğinizin ve sunucu yanıtının tüm HTTP başlıklarını, durum kodlarını ve gövdesini görmenizi sağlar. Hatanın kökenini anlamak için, tarayıcınızın kendi isteğinize hangi başlıkları eklediğini (Origin başlığı gibi) ve sunucunun bu isteğe hangi başlıklarla yanıt verdiğini (Access-Control-Allow-Origin, Access-Control-Allow-Methods vb.) tam olarak bilmeniz gerekir.
Tarayıcılar, bir CORS hatası meydana geldiğinde, genellikle konsolda net bir hata mesajı verirler ancak çoğu zaman başarısız olan isteğin yanıt başlıklarını doğrudan göremeyiz çünkü tarayıcı güvenlik politikası gereği bu başlıkları gizleyebilir. İşte bu yüzden
tarayıcı geliştirici araçları içindeki "Network" (Ağ) sekmesi paha biçilemez bir yardımcıdır. Bu sekme, bir web sayfasının yaptığı tüm ağ isteklerini ve bu isteklerin ayrıntılarını, başarılı olsun ya da olmasın, gerçek zamanlı olarak görüntüler. Bu sayede, tarayıcının güvenlik bariyerlerini aşarak sunucudan gelen tüm ham yanıt başlıklarını inceleyebilirsiniz.
Adım Adım Sorun Giderme: HTTP Header Görüntüleyici Kullanımı
Şimdi, bir
HTTP Header Görüntüleyici'yi kullanarak
Access-Control-Allow-Origin sorununu nasıl teşhis edeceğinizi adım adım inceleyelim.
Adım 1: Hatayı Tespit Edin ve Tekrarlayın
Öncelikle, uygulamanızda CORS hatasının nerede oluştuğunu belirleyin. Tarayıcınızın konsolunda (genellikle F12 tuşu ile açılır) beliren hatayı not alın. Hata mesajında genellikle hangi URL'ye yapılan istekte sorun yaşandığı belirtilir. Uygulamanızı, bu hatayı tekrar tetikleyecek şekilde çalıştırın.
Adım 2: Tarayıcı Geliştirici Araçlarını (Network Sekmesi) Açın
* Tarayıcınızın geliştirici araçlarını açın (çoğu tarayıcıda `F12` veya sağ tıklayıp "İncele" seçeneği ile).
* "Network" (Ağ) sekmesine gidin.
* Sayfayı yenileyerek veya ilgili işlemi tekrar tetikleyerek hata veren isteğin Network sekmesinde görünmesini sağlayın.
Adım 3: İlgili İsteği Bulun ve İnceleyin
Network sekmesinde, birçok istek listelenecektir. Genellikle hata veren istekler kırmızı renkte görünür veya bir hata durumu (örneğin 4xx veya 5xx) ile işaretlenir.
* Hata veren isteği bulun ve üzerine tıklayın.
* Sağ tarafta veya alt kısımda, bu isteğin ayrıntılarını göreceğiniz bir panel açılacaktır. Bu panelde "Headers" (Başlıklar), "Preview" (Önizleme), "Response" (Yanıt) gibi sekmeler bulunur.
* "Headers" sekmesine odaklanın. Burada iki ana bölümle ilgileneceğiz: "Request Headers" (İstek Başlıkları) ve "Response Headers" (Yanıt Başlıkları).
*
Request Headers: Kendi uygulamanızın sunucuya gönderdiği başlıkları burada göreceksiniz. Özellikle "Origin" başlığını kontrol edin. Bu başlık, isteğinizin hangi domain'den geldiğini sunucuya bildirir (örn: `Origin: https://your-app.com`).
*
Response Headers: Burası sunucudan gelen yanıt başlıklarının yer aldığı kritik bölümdür. İşte burada "Access-Control-Allow-Origin" başlığını aramalısınız.
Adım 4: 'Access-Control-Allow-Origin' Header'ını Analiz Edin
Yanıt başlıklarında "Access-Control-Allow-Origin" başlığını bulduktan sonra, değerini dikkatlice inceleyin:
*
Başlık Yoksa: Eğer bu başlık yanıt başlıkları arasında hiç yoksa, sorun sunucunuzun bu başlığı göndermemesinden kaynaklanıyor demektir. Sunucu tarafındaki CORS yapılandırmasını kontrol etmeniz gerekir.
*
Yanlış Origin Belirtilmişse: Başlık varsa, ancak değeri sizin isteğinizin "Origin" başlığı ile eşleşmiyorsa, sorun sunucunun yanlış origin'e izin vermesidir. Örneğin:
* Sizin `Origin` başlığınız: `https://dev.example.com`
* Sunucunun `Access-Control-Allow-Origin` başlığı: `https://example.com`
Bu durumda, sunucu yapılandırmasını `https://dev.example.com` adresini de içerecek şekilde güncellemeniz gerekir.
*
Değeri '*' İse: Sunucu `Access-Control-Allow-Origin: *` gönderiyorsa, bu genellikle tüm origin'lere izin verildiği anlamına gelir. Ancak, eğer isteğiniz kimlik doğrulama bilgileri (cookie'ler, HTTP kimlik doğrulama, SSL istemci sertifikaları) içeriyorsa (`withCredentials: true`), `Access-Control-Allow-Origin: *` geçerli olmaz ve yine bir CORS hatası alırsınız. Bu durumda, sunucunun belirli bir origin belirtmesi ve `Access-Control-Allow-Credentials: true` başlığını da göndermesi gerekir.
*
Başlık Doğru Görünüyorsa ama Hata Devam Ediyorsa: Bu nadir bir durum olsa da, sorun başka bir CORS başlığıyla ilgili olabilir. Özellikle karmaşık istekler (HTTP `PUT`, `DELETE` metodları veya `Content-Type` dışında özel başlıklar içeren istekler) için tarayıcı önce bir `OPTIONS` (preflight) isteği gönderir. Bu `OPTIONS` isteğine gelen yanıtta `Access-Control-Allow-Methods`, `Access-Control-Allow-Headers` gibi başlıkların doğru ayarlanmış olması gerekir. Network sekmesinde `OPTIONS` isteğini bulup yanıt başlıklarını inceleyin. Bu konuda daha detaylı bilgi için '/makale.php?sayfa=cors-preflight-istekleri' makalemizi ziyaret edebilirsiniz.
Sunucu Taraflı Çözümler
CORS sorununu teşhis ettikten sonra, çoğu zaman sunucu tarafında bazı değişiklikler yapmanız gerekecektir.
Origin'i Ayarlama
Sunucunuzun diline veya çatısına bağlı olarak (Node.js/Express, Python/Django, PHP/Laravel, Java/Spring Boot vb.), `Access-Control-Allow-Origin` başlığını ayarlamanın farklı yolları vardır.
*
Belirli Bir Origin'e İzin Verme: Bu en güvenli yaklaşımdır.
```
Access-Control-Allow-Origin: https://uygulama.com
```
*
Dinamik Olarak Birden Fazla Origin'e İzin Verme: Eğer birden fazla uygulamanız varsa veya dinamik origin'lere ihtiyacınız varsa, sunucu isteğin `Origin` başlığını kontrol edip, izin verilenler listesindeyse onu yanıt olarak döndürebilir:
```javascript
// Örnek Node.js (Express)
app.use((req, res, next) => {
const allowedOrigins = ['https://uygulama.com', 'https://dev.uygulama.com'];
const origin = req.headers.origin;
if (allowedOrigins.includes(origin)) {
res.setHeader('Access-Control-Allow-Origin', origin);
}
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
res.setHeader('Access-Control-Allow-Credentials', 'true');
next();
});
```
*
Tüm Origin'lere İzin Verme (Dikkatli Kullanın!): Güvenlik riskleri taşıdığı için genellikle önerilmez, ancak geliştirme ortamlarında veya halka açık API'ler için kullanılabilir:
```
Access-Control-Allow-Origin: *
```
Ancak, `Access-Control-Allow-Origin: *` ile birlikte `Access-Control-Allow-Credentials: true` kullanamayacağınızı unutmayın. Kimlik bilgileri ile istek yapılıyorsa, belirli bir origin belirtmek zorunludur.
Diğer CORS Başlıkları
`Access-Control-Allow-Origin` dışındaki diğer CORS başlıkları da önemlidir, özellikle preflight istekleri için:
* `Access-Control-Allow-Methods`: İzin verilen HTTP metotları (GET, POST, PUT, DELETE vb.).
* `Access-Control-Allow-Headers`: İzin verilen özel HTTP başlıkları (Authorization, X-Requested-With vb.).
* `Access-Control-Allow-Credentials`: Tarayıcının istekle birlikte kimlik bilgilerini (cookie'ler, HTTP kimlik doğrulama) göndermesine izin verilip verilmediğini belirtir. `true` olmalıdır.
* `Access-Control-Expose-Headers`: Tarayıcının istemci tarafında erişebileceği ek yanıt başlıklarını belirtir.
* `Access-Control-Max-Age`: Preflight isteğinin sonucunun ne kadar süre önbellekte tutulacağını saniye cinsinden belirtir.
Sık Yapılan Hatalar ve Ek İpuçları
*
Geliştirme ve Üretim Ortamı Farklılıkları: `localhost` ile çalışırken sorun yaşamamanız, üretim ortamında da yaşamayacağınız anlamına gelmez. Üretim domain'inizi sunucu yapılandırmanıza eklemeyi unutmayın.
*
Proxy Kullanımı: Eğer uygulamanız bir proxy üzerinden istek yapıyorsa (örn: Nginx veya Apache gibi bir ters proxy), CORS başlıklarının bu proxy tarafından doğru bir şekilde iletildiğinden emin olun. Bazen proxy'ler bu başlıkları silebilir veya değiştirebilir.
*
Cache Sorunları: CDN veya başka bir önbellekleme katmanı kullanıyorsanız, CORS başlıklarının doğru bir şekilde önbelleğe alındığından veya geçildiğinden emin olun. Değişikliklerinizin hemen yansımadığını fark ederseniz, önbelleği temizlemeyi deneyin.
*
Yönlendirmeler (Redirections): HTTP 3xx yönlendirmeleri, CORS mekanizmasını bozabilir. Eğer isteğiniz bir yönlendirme ile sonuçlanıyorsa, tarayıcı ilk isteğin Origin'i için CORS kontrolü yapar, ancak yönlendirilen nihai kaynağın CORS başlıkları ile sorun yaşayabilir. Bu durumu '/makale.php?sayfa=http-yonlendirmeleri-ve-cors' adresindeki makalemizde daha detaylı inceledik.
Sonuç
CORS hatası, özellikle
Access-Control-Allow-Origin başlığı ile ilgili olanlar, ilk bakışta karmaşık ve çözümsüz gibi görünebilir. Ancak bu rehberde de gördüğünüz gibi, sorunun kökeni genellikle sunucu tarafındaki bir HTTP başlığı yapılandırması eksikliğinden veya yanlışlığından kaynaklanır. Elinizdeki en güçlü araç olan
HTTP Header Görüntüleyici'yi kullanarak, isteğinizin ve yanıtınızın tam resmini görebilir, hatanın nedenini kesin olarak teşhis edebilir ve doğru sunucu yapılandırmalarıyla bu sorunu kalıcı olarak çözebilirsiniz. Unutmayın, CORS bir düşman değil, web uygulamalarınızın güvenliğini sağlayan önemli bir dosttur. Bu rehber sayesinde artık bu dostunuzla daha iyi geçinecek ve web projelerinizi sorunsuz bir şekilde hayata geçireceksiniz.
Yazar: Tarkan Tevetoğlu
Ben Tarkan Tevetoğlu, bir Akademisyen ve Araştırmacı. Platformumuzda teknolojiyi herkes için anlaşılır kılmak, karmaşık konuları basitleştirerek okuyucularımızın günlük yaşamında pratik olarak kullanabileceği bilgiler sunmak, yeni beceriler kazandırmak, farkındalık oluşturmak ve teknoloji dünyasındaki gelişmeleri anlaşılır bir dille aktarmak amacıyla yazıyorum.