API güvenliği, projenin en başında doğru kurulmazsa sonradan yamanması en zor konulardan biri. JWT ve OAuth2'nin birbirinden farkını netleştirmek, doğru bir kimlik doğrulama mimarisi kurmanın ilk adımı.

JWT Nedir, Ne Değildir?

JWT (JSON Web Token), bir kimlik doğrulama protokolü değil, bir token formatı. İçinde kullanıcı kimliği ve rolleri gibi bilgileri (claim) taşıyan, imzalanmış bir veri yapısı. Sunucu bu imzayı doğrulayarak token'ın değiştirilmediğinden emin oluyor.

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            IssuerSigningKey = new SymmetricSecurityKey(key)
        };
    });

OAuth2: Yetkilendirme Protokolü

OAuth2, bir uygulamanın başka bir uygulama adına, kullanıcının izniyle kaynaklara erişmesini sağlayan bir yetkilendirme çerçevesi. "LinkedIn ile giriş yap" gibi senaryolarda kullanılan asıl mekanizma bu. JWT genelde OAuth2 akışının sonucunda üretilen token formatı olarak kullanılıyor.

Access Token ve Refresh Token Ayrımı

Access token'ı kısa ömürlü (15-60 dakika) tutup, kullanıcı deneyimini bozmadan oturumu uzatmak için refresh token kullanıyorum. Bu, çalınan bir access token'ın etki süresini sınırlarken, kullanıcının sürekli yeniden giriş yapmasını da engelliyor.

Rol Bazlı ve Policy Bazlı Yetkilendirme

Basit senaryolarda [Authorize(Roles = "Admin")] yeterli olsa da, karmaşık kurallar (örneğin "sadece kendi kaydını güncelleyebilir") için policy tabanlı yetkilendirmeyi tercih ediyorum; bu, yetkilendirme mantığını controller'lardan ayrı, test edilebilir bir yere taşıyor.

Sonuç

JWT ve OAuth2'yi birbirinin yerine geçen kavramlar gibi düşünmek yaygın bir hata. Birini token formatı, diğerini yetkilendirme protokolü olarak net ayırdığınızda, API güvenliği mimarisini çok daha doğru kurabiliyorsunuz.