- Konu sahibi
- #1
npm’deki
Ön koşul olarak Node.js yüklü boş bir klasör kullanın. Aşağıdaki örnek yalnızca
Tarayıcı denemesi için ön yüzünüzü gerçekten http://localhost:5173 origin’i üzerinde sunun. Başka bir port veya 127.0.0.1 kullanıyorsanız izinli origin’i buna göre değiştirin; curl komutu ön yüz sunucusu oluşturmaz. Üretimde hem API hem ön yüz için uygun HTTPS kullanın.
Başarılı yanıtta
Karar vermeyi kolaylaştıran temel seçenekler şunlardır:
Kimlik doğrulama cookie ile yapılıyorsa
İstemci tarafında da istek credentials seçeneğiyle gönderilmelidir:
JSON gövdesi, özel başlıklar veya
En yaygın hatalar şunlardır:
Tarayıcı konsolunda hata görürseniz önce isteğin
cors paketi, Express uygulamanızın farklı origin’lerden gelen tarayıcı isteklerine hangi koşullarda izin vereceğini HTTP yanıt başlıklarıyla belirler. CORS, API’yi herkese açan bir güvenlik sistemi değildir; yalnızca tarayıcının yanıtı istemci JavaScript’ine verip vermeyeceğini kontrol eder. API yetkilendirmesi ayrıca yapılmalıdır.En küçük çalışan Express örneği
Ön koşul olarak Node.js yüklü boş bir klasör kullanın. Aşağıdaki örnek yalnızca
http://localhost:5173 origin’inden gelen tarayıcı isteklerine izin verir.- Yeni proje oluşturup bağımlılıkları yükleyin:
Kod:mkdir cors-ornek cd cors-ornek npm init -y npm install express cors - Klasörde
server.jsadlı dosya oluşturup şu kodu yerleştirin:
Kod:const express = require('express'); const cors = require('cors'); const app = express(); const PORT = 3000; app.use(cors({ origin: 'http://localhost:5173' })); app.get('/api/mesaj', (req, res) => { res.json({ mesaj: 'CORS ayarı çalışıyor' }); }); app.listen(PORT, '127.0.0.1', () => { console.log(`API http://127.0.0.1:${PORT} adresinde çalışıyor`); }); - Sunucuyu çalıştırın (bu yeni örnek CommonJS kullanır; mevcut type: module projesine require kodunu aynen taşımayın):
Kod:node server.js - Başka bir terminalde origin başlığını taklit ederek yanıtı kontrol edin:
Kod:curl -i -H "Origin: http://localhost:5173" http://127.0.0.1:3000/api/mesaj
Tarayıcı denemesi için ön yüzünüzü gerçekten http://localhost:5173 origin’i üzerinde sunun. Başka bir port veya 127.0.0.1 kullanıyorsanız izinli origin’i buna göre değiştirin; curl komutu ön yüz sunucusu oluşturmaz. Üretimde hem API hem ön yüz için uygun HTTPS kullanın.
Başarılı yanıtta
Access-Control-Allow-Origin: http://localhost:5173 başlığını ve {"mesaj":"CORS ayarı çalışıyor"} içeriğini görürsünüz. Bu başlık yoksa veya farklı origin gönderirseniz, istek sunucuya ulaşsa bile tarayıcı yanıtı JavaScript koduna kullandırmaz.Ayarı nasıl seçmelisiniz?
origin seçeneği, hangi web uygulamasının API yanıtını okuyabileceğini belirler. Geliştirme sırasında frontend’in gerçek adresini yazın; port numarası origin’in parçasıdır. Örneğin http://localhost:5173 ile http://127.0.0.1:3000 aynı origin değildir.Karar vermeyi kolaylaştıran temel seçenekler şunlardır:
| İhtiyaç | Önerilen ayar | Dikkat edilmesi gereken |
|---|---|---|
| Herkese açık, kimlik bilgisi gerektirmeyen API | origin: '*'
| Fetch credentials modu include olan istekte wildcard yanıtı kabul edilmez. |
| Belirli frontend uygulaması | origin: 'http://localhost:5173' | Şema, alan adı ve port doğru yazılmalıdır. |
| Birden fazla güvenilen frontend | Origin listesini doğrulayan fonksiyon | Gelen origin’i kontrol etmeden doğrudan geri döndürmeyin. |
Kimlik doğrulama cookie ile yapılıyorsa
credentials: true ekleyin ve origin değerini kesinlikle '*' yapmayın:
Kod:
app.use(cors({
origin: 'http://localhost:5173',
credentials: true
}));
İstemci tarafında da istek credentials seçeneğiyle gönderilmelidir:
Kod:
fetch('http://127.0.0.1:3000/api/mesaj', {
credentials: 'include'
});
Preflight ve sık yapılan hatalar
JSON gövdesi, özel başlıklar veya
PUT, PATCH ve DELETE gibi yöntemler kullanıldığında tarayıcı önce OPTIONS preflight isteği gönderebilir. Express’te app.use(cors(...)) kullanmak, cors middleware’inin genel olarak bu isteklere de yanıt vermesini sağlar. Özel middleware sıralaması veya proxy kullanıyorsanız OPTIONS yanıtının engellenmediğini kontrol edin.En yaygın hatalar şunlardır:
- Frontend adresini yalnızca alan adıyla yazmak;
http,httpsve port da kontrol edilmelidir. - Cookie kullanan isteklerde wildcard origin kullanmak.
- CORS’u yetkilendirme sanmak. CORS, Postman veya sunucu tarafı istemcilerin API’ye erişimini engellemez.
- İzin verilen origin’i gelen
Originbaşlığından doğrulamadan aynen yanıtlamak. - CORS middleware’ini route’lardan sonra eklemek. Genel kullanımda
app.use(cors(...))route tanımlarından önce yer almalıdır.
Tarayıcı konsolunda hata görürseniz önce isteğin
Origin, yöntem ve gönderdiği özel başlıkları inceleyin. Ardından sunucu yanıtında Access-Control-Allow-Origin, gerekiyorsa Access-Control-Allow-Credentials, Access-Control-Allow-Methods ve Access-Control-Allow-Headers değerlerini kontrol edin.