CORS (Cross-Origin Resource Sharing), bir sitenin başka bir kökene ait kaynağa tarayıcıdan erişimini düzenleyen mekanizmadır. SSL ile doğrudan ilgisi yoktur; ancak HTTPS'e geçişte köken değiştiği için CORS hataları sıkça ortaya çıkar.
HTTPS geçişi neden CORS'u etkiler?
Köken; şema, alan adı ve portun birleşimidir. http://ornek.com ile https://ornek.com farklı kökenlerdir. Sitenizi HTTPS'e taşıdıktan sonra API sunucusu yalnızca eski http:// kökenine izin veriyorsa tarayıcı konsolunda şu hatayı görürsünüz:
Access to fetch at 'https://api.ornek.com/veri' from origin 'https://www.ornek.com'
has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present
Doğru yapılandırma
Nginx üzerinde belirli bir kökene izin vermek için örnek:
location /api/ {
add_header Access-Control-Allow-Origin "https://www.ornek.com" always;
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS" always;
add_header Access-Control-Allow-Headers "Authorization, Content-Type" always;
add_header Vary "Origin" always;
if ($request_method = OPTIONS) { return 204; }
}
- Çerez veya yetkilendirme başlığı gönderen isteklerde
Access-Control-Allow-Credentials: truegerekir ve bu durumda*joker değeri kullanılamaz; kökeni açıkça yazmalısınız. - Birden çok kökene izin verecekseniz gelen
Origindeğerini beyaz listeyle karşılaştırıp yansıtın veVary: Originekleyin. - Preflight (OPTIONS) isteğine 2xx ile yanıt verildiğinden emin olun.
Karma içerik ile karıştırmayın
HTTPS sayfadan http:// API çağrısı yapmak CORS değil, karma içerik engelidir; çözümü API'yi de HTTPS'e almaktır. API alan adının sertifikası geçerli değilse tarayıcı isteği CORS aşamasına gelmeden reddeder ve konsolda genellikle ERR_CERT_* görünür. Sertifikanızı SSL Checker ile doğrulayabilirsiniz.
Güvenlik uyarıları
- Kimlik bilgili isteklerde
Allow-Origin: *kullanmayın; Origin'i kör yansıtmak da aynı riski doğurur. - CORS bir sunucu koruması değil, tarayıcı politikasıdır; API yetkilendirmesini yine sunucuda yapın.
Özetle HTTPS geçişinden sonra izinli köken listesini güncelleyin, preflight yanıtlarını doğrulayın ve hem site hem API için geçerli bir SSL sertifikası kullanın.