CORS Nedir ve Neden Önemlidir?
CORS (Cross-Origin Resource Sharing) veya Çapraz Kaynak Kaynak Paylaşımı, web tarayıcılarında çalışan JavaScript kodlarının farklı bir kaynaktan (domain, protokol veya port) kaynaklara erişmesine izin veren bir güvenlik mekanizmasıdır. Tarayıcılar, varsayılan olarak "Same-Origin Policy" (Aynı Kaynak Politikası) adı verilen bir güvenlik kuralını uygular. Bu kural, kötü niyetli web sitelerinin kullanıcı verilerini ele geçirmesini engellemeyi amaçlar. Ancak modern web uygulamalarında, farklı sunuculardan API'lere veya medya kaynaklarına erişmek yaygın bir ihtiyaçtır. İşte tam da bu noktada CORS devreye girer. Sunucunun belirli kaynaklara erişim için hangi kaynaklara izin verdiğini belirlemesini sağlayarak, bu kısıtlamayı kontrollü bir şekilde aşmayı mümkün kılar. Bu nedenle, web uygulamalarının işlevselliği ve güvenliği için CORS ayarlarının doğru yapılması kritik öneme sahiptir.
Apache'de CORS Ayarları İçin Temel Yaklaşım
Apache web sunucusunda CORS ayarlarını yapmak için genellikle `mod_headers` modülü kullanılır. Bu modül, HTTP yanıt başlıklarını manipüle etme yeteneği sağlar ve CORS ile ilgili başlıkları eklememizi sağlar. Ayarlar genellikle `.htaccess` dosyası içerisinde veya Apache'nin ana yapılandırma dosyası olan `httpd.conf` ya da sanal host (Virtual Host) yapılandırma dosyalarında yapılır. `.htaccess` kullanmak, değişikliklerin tek bir dizin veya alt dizini etkilemesini sağlar ve sunucuya erişimi olmayan kullanıcılar için bile yapılandırma esnekliği sunar. Ancak performans açısından, genel sunucu ayarlarının `httpd.conf` içinde yapılması daha verimlidir. Öncelikle `mod_headers` modülünün etkin olduğundan emin olmak gerekir. Genellikle `sudo a2enmod headers` komutu ile etkinleştirilebilir.
Access-Control-Allow-Origin Başlığı Nasıl Ayarlanır?
`Access-Control-Allow-Origin` başlığı, CORS yapılandırmasının en önemli bileşenidir. Bu başlık, hangi kaynakların sunucunuzdaki kaynaklara erişmesine izin verildiğini belirler. Tek bir kaynak için izin vermek istiyorsanız, başlığı doğrudan o kaynak URL'sini içerecek şekilde ayarlarsınız. Örneğin, `example.com` alan adından gelen isteklere izin vermek için `Header set Access-Control-Allow-Origin "
https://www.example.com"` şeklinde bir komut kullanırsınız. Bu komut, Apache yapılandırma dosyanızda veya `.htaccess` dosyanızda yer alabilir. Bu basit yapılandırma, belirli bir istemcinin sunucunuzdaki kaynaklara güvenli bir şekilde erişmesini sağlar ve diğer, yetkisiz kaynakların erişimini engeller. Doğru ve spesifik kaynak belirtmek, güvenlik risklerini minimize eder.
Birden Fazla Kaynağa İzin Verme ve Joker Karakter Kullanımı
Birden fazla kaynağa izin vermek istendiğinde, `Access-Control-Allow-Origin` başlığına virgülle ayrılmış birden fazla URL eklemek genellikle doğrudan desteklenmez. Bu başlık, standartlara göre ya tek bir kaynak URL'si ya da tüm kaynaklara izin veren `*` (joker karakter) değerini alabilir. Güvenlik nedeniyle `*` kullanımı, yalnızca halka açık ve hassas olmayan verilere erişime izin verirken önerilir. Eğer belirli ama birden fazla kaynağa izin vermek gerekiyorsa, Apache'de bir RewriteRule kullanarak veya sunucu tarafında isteğin `Origin` başlığını kontrol edip dinamik olarak `Access-Control-Allow-Origin` başlığını ayarlayan bir modül veya betik kullanmak daha doğru bir yaklaşımdır. Başka bir deyişle, isteğin geldiği kaynak başlığını kontrol ederek, izin verilenler listesindeki bir eşleşme durumunda ilgili Origin başlığını yanıt olarak gönderebilirsiniz.
Diğer CORS Başlıkları: Yöntemler ve İstek Başlıkları
CORS sadece kaynak URL'sini kontrol etmekle kalmaz, aynı zamanda HTTP yöntemlerini ve özel istek başlıklarını da yönetir. `Access-Control-Allow-Methods` başlığı, çapraz kaynak isteği için hangi HTTP yöntemlerinin (GET, POST, PUT, DELETE vb.) kullanılmasına izin verildiğini belirtir. Örneğin, `Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"` şeklinde bir ayar, sadece bu üç yöntemin kullanılmasına izin verir. Ek olarak, `Access-Control-Allow-Headers` başlığı, istemcinin çapraz kaynak isteğinde göndermesine izin verilen özel HTTP başlıklarını tanımlar. `Content-Type`, `Authorization` gibi başlıklar genellikle bu alana eklenir: `Header set Access-Control-Allow-Headers "Content-Type, Authorization"`. Bu başlıkların doğru yapılandırılması, özellikle kimlik doğrulama veya özel içerik tipleri gerektiren API istekleri için hayati öneme sahiptir.
Preflight İstekleri (OPTIONS) ve Apache Yapılandırması
Bazı karmaşık çapraz kaynak istekleri, ana istekten önce bir "preflight" (ön uçuş) isteği gönderir. Bu preflight istekleri, sunucuya ana isteği göndermeden önce izin isteyip istemediğini soran bir HTTP OPTIONS yöntemidir. Sunucu, bu OPTIONS isteğine uygun CORS başlıklarıyla yanıt vererek, gerçek isteğin güvenli bir şekilde gönderilip gönderilemeyeceğini tarayıcıya bildirir. Apache'de OPTIONS isteklerini doğru şekilde ele almak önemlidir. `Header always set Access-Control-Allow-Origin "..."` gibi komutlar, genellikle tüm isteklere (OPTIONS dahil) uygulanır. Ancak bazen yalnızca OPTIONS isteklerine özel olarak izin vermek veya belirli dizinlerde OPTIONS isteklerini yönetmek gerekebilir. Bunun için `LimitExcept` yönergesi veya bir `RewriteRule` kullanarak OPTIONS isteklerini özel olarak yönlendirmek ve yanıtlamak mümkündür. Sonuç olarak, preflight isteklerinin doğru şekilde yanıtlanması, karmaşık CORS işlemlerinin sorunsuz çalışmasını sağlar.
CORS Sorunlarını Giderme ve En İyi Uygulamalar
CORS sorunları genellikle tarayıcının geliştirici konsolunda (Console ve Network sekmeleri) "CORS policy" hataları olarak ortaya çıkar. Bu hatalar, sunucunun beklenen `Access-Control-Allow-Origin` başlığını göndermediğini veya gönderdiği değerin istemcinin kaynağıyla eşleşmediğini gösterir. Sorun gidermeye başlarken, Apache yapılandırma dosyanızın veya `.htaccess` dosyanızın doğru yazıldığından ve kaydedildiğinden emin olun. Sunucuyu yeniden başlatmak (`sudo systemctl restart apache2`) bazen gerekli olabilir. Ek olarak, `mod_headers` modülünün etkin olduğundan emin olun. Güvenlik açısından en iyi uygulama, `Access-Control-Allow-Origin` başlığını her zaman mümkün olduğunca spesifik tutmaktır; yani, sadece gerçekten ihtiyaç duyan kaynaklara erişim izni vermektir. Joker karakter (`*`) kullanımından kaçınmak ve sadece HTTPS üzerinden erişime izin vermek, genel web güvenliğini önemli ölçüde artırır.