Uygulama geliştirme aşamalarının başlarında, kullanıcı kimliğini yönetmek genellikle basit bir iştir. Kullanıcılar için bir veritabanı tablonuz, basit bir şifre karma (hash) değeri ve bir oturum çerezi (cookie) vardır. İlk 1.000 kullanıcınız için mükemmel çalışır. Ancak sisteminiz mikro hizmetler, mobil istemciler ve üçüncü taraf entegrasyonları ile dağıtık bir mimariye dönüştükçe, kimlik yönetiminin karmaşıklığı patlama yaşar. İşte tam da burada kimlik doğrulama (kimsiniz kanıtlama) ile yetkilendirme (ne yapabileceğinizi kanıtlama) arasındaki ayrım, sistemin istikrarı ve güvenliği açısından kritik hale gelir.
Ölçeklendirme aşamasında, her bir mikro hizmetin kimlik bilgilerini doğrulamak için merkezi bir veritabanına sorgu atamasına tahammül edemezsiniz. Gecikme süresi (latency) birikir ve kimlik sağlayıcınızdaki tek bir başarısızlık noktası tüm platformunuzu çökertebilir. Bunu çözmek için modern sistem tasarımı, durum bilgisi içermeyen (stateless) tokenlara, dağıtık doğrulamaya ve sorumlulukların sıkı ayrımına dayanır.
JWT'ler ile Durumsuzluğa Geçiş
Ölçeklenebilir kimlik doğrulamanın temel taşı, genellikle JSON Web Tokens (JWT) kullanılarak uygulanan Durumsuz Erişim Tokenı'dır. Geleneksel oturumlardan farklı olarak, bunlar sunucunun durumu (genellikle Redis veya bir veritabanında) saklamasını gerektirirken, bir JWT gerekli tüm kullanıcı bilgilerini ve izinleri, sunucu tarafından dijital olarak imzalanmış şekilde içerir.
Kullanıcı giriş yaptığında, Kimlik Sağlayıcı (IdP) imzalı bir token verir. İstemci bu tokenı saklar (genellikle bellekte veya httpOnly bir çerezde) ve sonraki isteklerin Authorization başlığında bunu ekler. Herhangi bir mikro hizmet, IdP'ye veya veritabanına hiç temas etmeden bir genel anahtar kullanarak tokenın imzasını doğrulayabilir. Bu durum, gecikme süresini büyük ölçüde azaltır ve veritabanı darboğazını ortadan kaldırır.
// Örnek: Node.js mikro hizmetinde bir JWT'nin doğrulanması
const jwt = require('jsonwebtoken');
function verifyAccessToken(req, res, next) {
const token = req.headers['authorization']?.split(' ')[1];
if (!token) {
return res.status(401).send('Erişim Reddedildi');
}
try {
// İmzayı genel anahtarla doğrula
const verified = jwt.verify(token, process.env.PUBLIC_KEY);
req.user = verified; // Kullanıcı iddialarını isteğe ekle
next();
} catch (err) {
res.status(403).send('Geçersiz Token');
}
}
Ayrıntılı Yetkilendirme ve RBAC
JWT'ler kimlik doğrulamayı verimli bir şekilde ele alırken, kısa bir sona erme süresi olmadan geri alınamadıkları için dinamik yetkilendirme için ideal değildir. Ölçeklendirme düzeyinde yetkilendirme için, genellikle JWT iddiaları (claims) içinde kodlanmış veya hafif bir API çağrısı aracılığıyla getirilen Rol Tabanlı Erişim Kontrolü (RBAC) veya Nitelik Tabanlı Erişim Kontrolü (ABAC) kullanırız.
Kullanıcının izinlerinin değiştiği bir senaryoyu düşünün. Durumlu bir oturumla oturum deposunu güncellersiniz. JWT'lerle ise kısa ömürlü erişim tokenlarına (örn. 15 dakika) eşleştirilmiş yenileme tokenlarına güvenmeniz gerekir. Yenileme tokenı güvenli bir şekilde saklanır ve yeni erişim tokenları almak için kullanılır; böylece gerekirse yenileme tokenını kara listeye alarak erişimi anında geri alabilirsiniz.
Kimliği İş Mantığından Ayırma
Gerçekten ölçeklendirmek için kimliği, temel iş mikro hizmetlerinden ayırmanız gerekir. Sipariş hizmetinize veya kullanıcı profil hizmetinize kimlik doğrulama mantığını gömme. Bunun yerine, kimlik yönetimini özel bir Kimlik Sağlayıcıda (Auth0, Keycloak veya özel olarak inşa edilmiş bir hizmet gibi) merkezileştirin. Bu hizmet, giriş, şifre sıfırlama, Çok Faktörlü Doğrulama (MFA) ve token verme işlemlerini yönetir.
İş hizmetleriniz kaynak sunucusu olarak hareket eder. Sadece JWT'nin imzasını ve sona erme tarihini doğrularlar. Daha karmaşık yetkilendirme mantığına ihtiyacınız varsa (örn. "Bu kullanıcı bu belirli kaynağın sahibi mi?"), kısa ömürlü bir politika karar noktası uygulayın veya JWT iddialarına ve kaynak meta verilerine göre ince ayrıntılı kararlar verebilen OPA (Open Policy Agent) gibi bir kütüphane kullanın.
Sonuç
Kimlik doğrulama ve yetkilendirmeyi ölçeklendirmek, sadece doğru kütüphaneyi seçmekle ilgili değildir; merkezi veritabanlarına yapılan gidiş-dönüşleri en aza indirirken güvenliği en üst düzeye çıkaran bir sistem tasarlamakla ilgilidir. Durumsuz JWT'leri benimseyerek, kısa token ömürlerini zorlayarak ve kimliği iş mantığından ayırarak, terketmeden milyonlarca kullanıcıyı yönetebilen sağlam bir altyapı oluşturursunuz. Unutmayın, güvenlik sürekli bir süreçtir; ortaya çıkan tehditlere bir adım önde kalmak için token politikalarınızı ve döndürme stratejilerinizi düzenli olarak denetleyin.