içeriğe atla

CORS'u çözmenin en iyi yolu: ona hiç ihtiyaç duymamak

Bir ASP.NET Core API + React SPA projesinin production dağıtımında dikkatimi çeken şey, CORS’u çözmek yerine gereksiz kılan bir yerleşim: Caddy hem statik React dosyalarını hem /api/* altındaki isteklerin proxy’sini aynı domain üzerinden servis ediyor. Tarayıcı açısından tek bir origin var, CORS başlıkları yönetmeye hiç gerek kalmıyor.

Kestrel tarafında da bir fark var: ASPNETCORE_URLS=http://localhost:5049 ile yalnızca localhost’ta dinleniyor — yerel geliştirmede alışılan 0.0.0.0’dan bilinçli bir sapma. Uygulama zaten dışarıdan doğrudan erişilmeyecek, önündeki Caddy proxy’liyor, o yüzden dinleme adresini dıştan erişilemez tutmak fazladan bir güvenlik katmanı.

İkinci, daha ince detay systemd birim dosyasında. Type=notify yerine Type=exec seçilmiş, gerekçesi yorum satırında yazılı:

Program.cs hiçbir yerde .UseSystemd() çağırmıyor. Type=notify seçilseydi, systemctl start uygulama aslında düzgün çalışırken bile TimeoutStartSec sonunda “başarısız” derdi.

Type=notify, uygulamanın systemd’ye “hazırım” sinyali göndermesini bekler; bu sinyali göndermeyen bir uygulama için bu tip seçilirse, uygulama gerçekte sorunsuz ayaktayken systemd onu zaman aşımıyla öldürür.

Bunu neden önemsiyorum: ikisi de “iş görünüşte doğru çalışıyor ama yanlış bir varsayımla” kategorisinden. CORS başlıklarını doğru yapılandırmak yerine mimariyi CORS’a hiç ihtiyaç duymayacak şekilde kurmak, ve bir systemd ayarının uygulamanın gerçekte ne yaptığıyla eşleşmesini kontrol etmek — ikisi de “çalışıyor gibi görünüyor” ile “gerçekten doğru” arasındaki farkı kapatıyor.