Next.js Auth Matcher'ımı Üç Kez Batırdım
Next.js 16'da proxy.ts'in nasıl çalıştığını anlamadan önce üç projeyi bozdum.
Hata sessizdi. Log yok. Uyarı yok. Hata yok. Sadece bozuk yönlendirmeler ve güvenlik açıkları.
Eğer Next.js 16'ya yükseltme yapıyorsanız, sadece bir codemod çalıştırıp kenara çekilmeyin. Şu üç şeyi kontrol etmeniz gerekiyor.
Geçiş Tuzağı
Next.js, middleware.ts dosyasının adını proxy.ts olarak değiştirdi. Bu sadece bir isim değişikliği değil.
middleware.tsEdge runtime üzerinde çalışıyordu. Sınırlı crypto desteğine sahipti.proxy.tsvarsayılan olarak Node.js runtime üzerinde çalışır. Tam crypto desteğine sahiptir.
Eğer paketinizi bir codemod kullanmadan manuel olarak güncellerseniz, eski middleware.ts dosyanız hala mevcut olabilir. Sorunsuz bir şekilde derlenecektir. TypeScript kontrollerinden geçecektir. Ancak hiçbir şey yapmayacaktır. Rotalarınız yakalanmayacak (intercept edilmeyecek). Yönlendirmeleriniz çalışmayacaktır.
Şu üç şeyi manuel olarak kontrol edin:
proxy.tsproje kök dizininizde bulunmalıdır.- Dışa aktarılan (exported) fonksiyonun adı
proxyolmalıdır. middleware.tssilinmiş olmalıdır.
Matcher Boşluğu
Auth kurulumlarının en sık hata verdiği yer matcher kısmıdır.
Eğer matcher'ınız çok geniş kapsamlıysa, proxy her CSS ve görsel dosyası için çalışır. Bu da sonsuz yönlendirme döngülerine (infinite redirect loops) neden olur.
Eğer matcher'ınız çok dar kapsamlıysa, bir güvenlik açığı oluşturursunuz.
Eğer bir rota matcher'ınızda yer almıyorsa, proxy asla çalışmaz. Bir kullanıcı o rotaya kendi header'larını gönderebilir. Eğer Server Component'iniz bu header'lara güveniyorsa, bir saldırgan herkesin kimliğine bürünebilir.
Çözüm: Header'lara Güvenmeyin
Bunu acı bir tecrübeyle öğrendim: Sadece proxy tarafından iletilen header'lara güvenmeyin.
İki katmanlı bir yaklaşım kullanın:
- Proxy, ağ sınırında hızlı bir kapı görevi görür.
- Server Component, render sırasında JWT'yi doğrudan cookie üzerinden doğrular.
Bu ikinci kontrol boşluğu kapatır. Matcher bir rotayı kaçırsa bile, Server Component geçersiz kullanıcıyı yakalayacaktır. Birkaç milisaniyelik gecikme ekler ancak büyük bir güvenlik hatasını önler.
Özet Check-list:
- Auth için
proxy.tskullanın. - Tam crypto desteği için Node.js runtime kullanın.
- Header'ları response yerine request üzerinde ayarlayın.
- JWT'yi her zaman Server Component'ler içinde doğrulayın.