Yenileme Belirteçleri ve Süre Dolumu
Güvenli belirteç yenilemeyi uygulayın.
Yenileme Belirteçleri ve Süre Dolumu, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.
Sona Erme Sorunu
Kısa süreli access token'lar güvenlidir ancak kullanışsızdır: kullanıcıları her 15 dakikada bir oturum açmaya zorlamak kötü bir kullanıcı deneyimidir.
Çözüm, parola girmeden yeni access token'lar almak için kullanılan, ayrı ve daha uzun süre geçerli bir kimlik bilgisi olan refresh token'dır.
// access token: 15 minutes
// refresh token: 7-30 daysRefresh Token Nedir?
Refresh token genellikle opak, rastgele bir dizedir (JWT değildir). Uzun süre geçerli olduğu için iptal edilebilmesi amacıyla sunucu tarafında saklanmalıdır.
Token'ı kriptografik açıdan güvenli bir RNG ile oluşturun.
public static string GenerateRefreshToken()
{
var bytes = new byte[64];
using var rng = RandomNumberGenerator.Create();
rng.GetBytes(bytes);
return Convert.ToBase64String(bytes);
}Refresh Token'ları Saklama
Her refresh token'ı sahibi, sona erme zamanı ve iptal edildiğini belirten bir bayrakla birlikte kalıcı olarak saklayın. Böylece oturum kapatma veya token'ın çalınması durumunda token'ı geçersiz kılabilirsiniz.
public class RefreshToken
{
public int Id { get; set; }
public string Token { get; set; } = default!;
public int UserId { get; set; }
public DateTime ExpiresAt { get; set; }
public bool IsRevoked { get; set; }
}Oturum Açarken Her İki Token'ı da Üretme
Başarılı bir oturum açma işleminde kısa süreli access token'ı ve yeni bir refresh token'ı döndürün. Refresh token'ı veritabanına kaydedin.
var access = tokenService.CreateAccessToken(user);
var refresh = new RefreshToken
{
Token = TokenService.GenerateRefreshToken(),
UserId = user.Id,
ExpiresAt = DateTime.UtcNow.AddDays(7)
};
db.RefreshTokens.Add(refresh);
await db.SaveChangesAsync();
return Results.Ok(new { access, refresh = refresh.Token });Refresh Uç Noktası
Ayrı bir /refresh uç noktası bir refresh token kabul eder ve token geçerliyse yepyeni bir access token üretir.
app.MapPost("/refresh", async (RefreshDto dto, AppDb db, TokenService tokens) =>
{
var stored = await db.RefreshTokens
.SingleOrDefaultAsync(r => r.Token == dto.RefreshToken);
if (stored is null || stored.IsRevoked ||
stored.ExpiresAt < DateTime.UtcNow)
return Results.Unauthorized();
var user = await db.Users.FindAsync(stored.UserId);
var access = tokens.CreateAccessToken(user!);
return Results.Ok(new { access });
});Refresh Token Döndürme
Döndürme akışı daha güvenli hâle getirir: Bir refresh token her kullanıldığında iptal edin ve yeni bir token üretin. Böylece çalınmış ve daha önce kullanılmış bir token işe yaramaz hâle gelir.
stored.IsRevoked = true; // burn the old one
var next = new RefreshToken
{
Token = TokenService.GenerateRefreshToken(),
UserId = stored.UserId,
ExpiresAt = DateTime.UtcNow.AddDays(7)
};
db.RefreshTokens.Add(next);
await db.SaveChangesAsync();Token Yeniden Kullanımını Algılama
Döndürme sayesinde hırsızlığı algılayabilirsiniz: Daha önce iptal edilmiş bir token yeniden sunulursa bunu bir güvenlik ihlali olarak değerlendirin ve kullanıcının tüm token ailesini iptal edin.
if (stored.IsRevoked)
{
// This token was already used - likely stolen.
await RevokeAllUserTokens(stored.UserId, db);
return Results.Unauthorized();
}Oturum Kapatma ve İptal Etme
Oturum kapatma işlemi yalnızca geçerli refresh token'ı iptal eder. Access token ise birkaç dakika içinde kendiliğinden sona erer.
app.MapPost("/logout", async (RefreshDto dto, AppDb db) =>
{
var stored = await db.RefreshTokens
.SingleOrDefaultAsync(r => r.Token == dto.RefreshToken);
if (stored is not null) stored.IsRevoked = true;
await db.SaveChangesAsync();
return Results.Ok();
}).RequireAuthorization();İstemcide Token'lar Nerede Saklanmalı?
Tarayıcılar için en güvenli yöntem, refresh token'ı HttpOnly, güvenli bir çerezde saklamaktır; böylece JavaScript token'ı okuyamaz ve XSS kaynaklı hırsızlık azaltılır.
Kısa süreli access token bellekte tutulabilir.
Response.Cookies.Append("refresh", refresh.Token, new CookieOptions
{
HttpOnly = true,
Secure = true,
SameSite = SameSiteMode.Strict,
Expires = refresh.ExpiresAt
});Süresi Dolmuş Token'ları Temizleme
Refresh token'lar zamanla birikir. Süresi dolmuş veya iptal edilmiş satırları silmek için düzenli aralıklarla çalışan bir arka plan işi (ör. barındırılan bir hizmet) çalıştırın.
await db.RefreshTokens
.Where(r => r.ExpiresAt < DateTime.UtcNow || r.IsRevoked)
.ExecuteDeleteAsync();Geçerlilik Sürelerini Seçme
Güvenlik ile kullanım kolaylığı arasında denge kurun:
- Access token: 5-15 dakika; sızdırılmış bir token'ın açığa çıkaracağı bilgiyi sınırlar.
- Refresh token: Hassasiyete bağlı olarak birkaç saatten birkaç haftaya kadar.
- Bir günden uzun süreler için döndürme kullanın.
AccessTokenLifetime = TimeSpan.FromMinutes(15);
RefreshTokenLifetime = TimeSpan.FromDays(7);Hızlı Kontrol
Refresh akışını ne kadar anladığınızı sınayın.
Özet
Refresh token akışını uyguladınız:
- Kısa süreli bir access token ile uzun, opak ve sunucuda saklanan bir refresh token üretin.
/refreshuç noktası, geçerli bir refresh token karşılığında yeni bir access token verir.- Döndürme ve yeniden kullanım algılama, hırsızlığa karşı korumayı güçlendirir.
- Refresh token'ları HttpOnly çerezlerde saklayın ve süresi dolmuş satırları temizleyin.
JWT kimlik doğrulama kursu burada tamamlanıyor.
Sıkça Sorulan Sorular
“Yenileme Belirteçleri ve Süre Dolumu” dersi ücretsiz mi?
Evet — “Yenileme Belirteçleri ve Süre Dolumu” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.
“Yenileme Belirteçleri ve Süre Dolumu” dersinde ne öğreneceğim?
Güvenli belirteç yenilemeyi uygulayın. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C# Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Yenileme Belirteçleri ve Süre Dolumu” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- JWT Yapısı ve Talepleri
- JWT Bearer Kimlik Doğrulamasını Yapılandırma
- Belirteç Verme
- Yenileme Belirteçleri ve Süre Dolumu