Merhaba arkadaşlar, bugün başımı çok ağrıtan bir sorundan ve onun nasıl üstesinden geldiğimden bahsedeceğim. Production ortamında, CORS (Cross-Origin Resource Sharing) hataları bazen o kadar sinsice ortaya çıkıyor ki, kullanıcılar "bu işlem gerçekleşmedi" diye şikayet ediyor ama siz loglarda hiçbir şey göremiyorsunuz. Frontend'de konsol hatası görülüyor evet, ama backend tarafında bu istekler genellikle sessiz sedasız reddediliyor ve iz bırakmıyor. Bu hatayı ilk gördüğümde kafayı yemiştim, çünkü sorunu tespit etmek neredeyse imkansızdı.
Sorun Neydi?
Sorun şuydu: Kullanıcılar belli bir işlemi yapamıyordu, frontend geliştirici arkadaş "CORS hatası alıyorum" diyordu, ama benim Node.js (Express) backend loglarımda o endpoint'e dair hiçbir istek kaydı yoktu. İstek, tarayıcı tarafından yapılan "preflight" (OPTIONS) aşamasında veya doğrudan backend'in CORS politikası tarafından engelleniyor ve klasik loglama middleware'lerim bu engellenen istekleri yakalayamıyordu. Sorunu anlamak ve hangi origin'den, hangi header ile geldiğini görmek için bir çözüm bulmam gerekiyordu.
Çözüm: CORS Loglama Middleware'i
İşte benim kullandığım en temiz çözüm. Amacım, CORS politikası devreye girip isteği reddetmeden önce, bu isteğin detaylarını (origin, method, headers) loglamaktı. Bunun için mevcut `cors` paketinin konfigürasyonuna ve kendi basit middleware'ime güvendim.
İlk adım, loglama işlevini yazmak. Ben basitçe konsola ve aynı zamanda production log servisime (Winston ile) bilgi gönderen bir fonksiyon oluşturdum.
Middleware'i Express'e Entegre Etmek
Şimdi sıra, bu loglama fonksiyonunu, CORS kontrolünden hemen önce çalıştıracak bir middleware yazmaya geldi. Önemli nokta, bu middleware'in `cors()` middleware'inden önce tanımlanması.
Bu yapı sayesinde, `
` adresinden gelen bir istek, `cors()` middleware'i tarafından reddedilse bile, benim loglarımda şu şekilde bir kayıt görünecek:
"[CORS İSTEK DENEMESİ] - Origin:
, Method: GET, URL: /api/sensitive-data"
Ne Kazandırdı?
Bu basit middleware ile artık:
Hangi origin'lerin yasaklı erişim denemesi yaptığını görebiliyorum.
Saldırı veya tarama amaçlı istekleri tespit edebiliyorum.
Frontend'deki yanlış yapılandırma kaynaklı sorunları (yanlış domain, port) hızlıca teşhis edebiliyorum.
Log kayıtlarım, güvenlik ve audit açısından çok daha zenginleşti.
Sonuç olarak, bu küçük dokunuş production'daki görünmezliği ortadan kaldırdı. Siz de backend framework'ünüz (Laravel, Django vs.) için benzer bir request interception mekanizması yazabilirsiniz. Önemli olan, istek reddedilmeden önce onu yakalayıp kaydetmek.
Peki ya siz? Benzer bir CORS izleme yöntemi kullanan var mı? Ya da Laravel gibi bir framework'te Request Middleware ile bunu nasıl implemente edersiniz? Fikirlerinizi merak ediyorum!
Sorun şuydu: Kullanıcılar belli bir işlemi yapamıyordu, frontend geliştirici arkadaş "CORS hatası alıyorum" diyordu, ama benim Node.js (Express) backend loglarımda o endpoint'e dair hiçbir istek kaydı yoktu. İstek, tarayıcı tarafından yapılan "preflight" (OPTIONS) aşamasında veya doğrudan backend'in CORS politikası tarafından engelleniyor ve klasik loglama middleware'lerim bu engellenen istekleri yakalayamıyordu. Sorunu anlamak ve hangi origin'den, hangi header ile geldiğini görmek için bir çözüm bulmam gerekiyordu.
İşte benim kullandığım en temiz çözüm. Amacım, CORS politikası devreye girip isteği reddetmeden önce, bu isteğin detaylarını (origin, method, headers) loglamaktı. Bunun için mevcut `cors` paketinin konfigürasyonuna ve kendi basit middleware'ime güvendim.
İlk adım, loglama işlevini yazmak. Ben basitçe konsola ve aynı zamanda production log servisime (Winston ile) bilgi gönderen bir fonksiyon oluşturdum.
JavaScript:
// utils/corsLogger.js
const logger = require('./winstonLogger'); // Kendi log modülünüz
const logCorsAttempt = (req) => {
const logData = {
timestamp: new Date().toISOString(),
ip: req.ip,
origin: req.headers.origin || 'Yok (Same-origin veya tanımsız)',
method: req.method,
url: req.originalUrl,
headers: req.headers,
};
// Konsola yazdır (development için)
console.warn('[CORS İSTEK DENEMESİ]', JSON.stringify(logData, null, 2));
// Production log dosyasına/servisine yaz
logger.warn('CORS istek denemesi tespit edildi', logData);
};
module.exports = { logCorsAttempt };
Şimdi sıra, bu loglama fonksiyonunu, CORS kontrolünden hemen önce çalıştıracak bir middleware yazmaya geldi. Önemli nokta, bu middleware'in `cors()` middleware'inden önce tanımlanması.
JavaScript:
// app.js veya server.js
const express = require('express');
const cors = require('cors');
const { logCorsAttempt } = require('./utils/corsLogger');
const app = express();
// 1. ÖNCE: CORS Loglama Middleware'i
app.use((req, res, next) => {
// Sadece tarayıcı kaynaklı ve potansiyel CORS isteklerini logla
if (req.headers.origin) {
logCorsAttempt(req);
}
next(); // Bir sonraki middleware'e (cors) geç
});
// 2. SONRA: Normal CORS Politikamız
const corsOptions = {
origin: ['https://guvenlialanadim.com', 'https://ikincialanadim.com'],
optionsSuccessStatus: 200,
};
app.use(cors(corsOptions));
// ... Diğer route'larınız
app.get('/api/sensitive-data', (req, res) => {
res.json({ data: 'Önemli veri' });
});
app.listen(3000, () => console.log('Sunucu çalışıyor...'));
Bu yapı sayesinde, `
Bu bağlantı ziyaretçiler için gizlenmiştir. Görmek için lütfen giriş yapın veya üye olun.
"[CORS İSTEK DENEMESİ] - Origin:
Bu bağlantı ziyaretçiler için gizlenmiştir. Görmek için lütfen giriş yapın veya üye olun.
Bu basit middleware ile artık:
Hangi origin'lerin yasaklı erişim denemesi yaptığını görebiliyorum.
Saldırı veya tarama amaçlı istekleri tespit edebiliyorum.
Frontend'deki yanlış yapılandırma kaynaklı sorunları (yanlış domain, port) hızlıca teşhis edebiliyorum.
Log kayıtlarım, güvenlik ve audit açısından çok daha zenginleşti.
Sonuç olarak, bu küçük dokunuş production'daki görünmezliği ortadan kaldırdı. Siz de backend framework'ünüz (Laravel, Django vs.) için benzer bir request interception mekanizması yazabilirsiniz. Önemli olan, istek reddedilmeden önce onu yakalayıp kaydetmek.
Peki ya siz? Benzer bir CORS izleme yöntemi kullanan var mı? Ya da Laravel gibi bir framework'te Request Middleware ile bunu nasıl implemente edersiniz? Fikirlerinizi merak ediyorum!