JWT, süre dolmadan nasıl iptal edilir
ASP.NET Core, JWT'yi imza ve süre sonuna göre doğrular; bu yüzden çalınan bir token şifre değişikliğinden sonra da çalışmaya devam eder. Makale, kısa ömürlü access token ile iptal edilebilir refresh token'ı, ardından anlık iptal için token_version kontrolünü adım adım anlatıyor. Token iptali üzerine çalışan her .NET geliştiricisinin bilmesi gereken bir ayrıntı.
Kilit noktalar
- Access token'ı kısa tutun (yazar 5 dakika kullanıyor) ve refresh token'ı veritabanında hash olarak saklayın.
- Refresh token'ın tek kullanımlık olmasını UsedAt kontrolüyle sağlayın; yeniden kullanım görülürse ilgili login'in tüm token'larını silin.
- Her girişe bir FamilyId verin ve access token'a sid claim'i olarak ekleyin; tek cihaz çıkışı yalnızca o aileyi silsin.
- Anlık iptal gerekiyorsa user satırına token_version ekleyin ve OnTokenValidated içinde context.Fail ile 401 dönün.
- token_version kontrolü her istekte veritabanı sorgusu demektir; ölçülen maliyet için önbellek düşünün, ancak kaynak olarak veritabanını koruyun.
Varsayılan JWT kurulumunda bearer handler her istekte imzayı, issuer, audience ve exp değerini kontrol eder, ama veritabanına bakmaz. Bu yüzden şifre değişikliği, daha önce verilmiş token'ları geçersiz kılmaz. Yazar, önce kısa süreli access token ve veritabanında hash olarak saklanan refresh token'dan oluşan standart tasarımı öneriyor. Refresh token'ın yeniden kullanılması çalınma belirtisi sayılıyor ve o girişe ait tüm token'lar iptal ediliyor.
Anlık iptal gerektiğinde ikinci yöntem devreye giriyor: kullanıcı satırındaki token_version değeri token'a claim olarak yazılıyor ve OnTokenValidated içinde her istekte veritabanıyla karşılaştırılıyor. Yazar k6 testinde bu sorgunun tek kullanıcıda yaklaşık 0,65 ms eklediğini, yoğun yükte ise throughput'un belirgin biçimde düştüğünü, Redis önbelleğinin maliyeti azalttığını ölçmüş. Ayrıca oturum kimliğini (sid) de kontrol ederek tek cihazın çıkışını ayırt etmek mümkün.
Gerçek dünyada kullanımı
- Birden fazla cihazda oturum açılabilen bir SaaS API'sinde şifre değişikliğinde tüm oturumları kapatmak.
- Hesabı devre dışı bırakılan bir kullanıcının açık token'larını hemen geçersiz kılmak gereken bir iç yönetim uygulaması.
- Mobil ve web istemcileri olan bir API'de tek cihazdan çıkış yapılabilmesi için refresh token ailesi yönetimi.
Neden önemli
Varsayılan JWT kurulumu şifre değişikliğinden sonra da token'ı kabul eder; bu boşluğu kapatmak için refresh token iptali ve gerekirse her istekte versiyon kontrolü eklemek gerekir. Hangi yöntemin hangi gecikme ve performans maliyetini getirdiğini bilmek, kimlik doğrulama tasarımında doğru dengeyi kurmanızı sağlar.