Token Refresh dan Kedaluwarsa
Implementasikan pembaruan token yang aman.
Token Refresh dan Kedaluwarsa adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 4 pelajaran total.
Masalah Kedaluwarsa
Access token berumur pendek aman, tetapi kurang praktis: memaksa pengguna masuk setiap 15 menit memberikan pengalaman pengguna yang buruk.
Solusinya adalah refresh token - kredensial terpisah yang berumur lebih panjang dan digunakan untuk memperoleh access token baru tanpa memasukkan ulang kata sandi.
// access token: 15 minutes
// refresh token: 7-30 daysApa Itu Refresh Token
Refresh token biasanya berupa string acak buram (bukan JWT). Karena berumur panjang, token ini harus disimpan di sisi server agar dapat dicabut.
Buat token ini menggunakan RNG yang aman secara kriptografis.
public static string GenerateRefreshToken()
{
var bytes = new byte[64];
using var rng = RandomNumberGenerator.Create();
rng.GetBytes(bytes);
return Convert.ToBase64String(bytes);
}Menyimpan Refresh Token
Simpan setiap refresh token bersama pemiliknya, masa kedaluwarsa, dan penanda pencabutan. Dengan begitu, Anda dapat membatalkannya saat pengguna keluar atau ketika token dicuri.
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; }
}Menerbitkan Kedua Token Saat Login
Saat login berhasil, kembalikan access token berumur pendek dan refresh token baru. Simpan refresh token tersebut di basis data.
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 });Titik Akhir Refresh
Titik akhir /refresh khusus menerima refresh token dan, jika valid, menerbitkan access token yang benar-benar baru.
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 });
});Rotasi Refresh Token
Rotasi memperkuat alur ini: setiap kali refresh token digunakan, cabut token tersebut dan terbitkan token baru. Token yang dicuri dan sudah pernah digunakan kemudian menjadi tidak berguna.
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();Mendeteksi Penggunaan Ulang Token
Dengan rotasi, Anda dapat mendeteksi pencurian: jika token yang sudah dicabut dikirimkan lagi, anggap itu sebagai pelanggaran dan cabut seluruh keluarga token pengguna.
if (stored.IsRevoked)
{
// This token was already used - likely stolen.
await RevokeAllUserTokens(stored.UserId, db);
return Results.Unauthorized();
}Keluar dan Pencabutan
Keluar cukup dengan mencabut refresh token saat ini. Access token akan kedaluwarsa dengan sendirinya dalam hitungan menit.
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();Tempat Menyimpan Token di Klien
Untuk peramban, pola yang paling aman menyimpan refresh token dalam cookie HttpOnly, Secure agar JavaScript tidak dapat membacanya, sehingga mengurangi risiko pencurian melalui XSS.
Access token berumur pendek dapat disimpan di memori.
Response.Cookies.Append("refresh", refresh.Token, new CookieOptions
{
HttpOnly = true,
Secure = true,
SameSite = SameSiteMode.Strict,
Expires = refresh.ExpiresAt
});Membersihkan Token yang Kedaluwarsa
Refresh token akan terus bertambah. Jalankan tugas latar belakang berkala (misalnya layanan yang di-host) untuk menghapus baris yang kedaluwarsa atau telah dicabut.
await db.RefreshTokens
.Where(r => r.ExpiresAt < DateTime.UtcNow || r.IsRevoked)
.ExecuteDeleteAsync();Memilih Masa Berlaku
Seimbangkan keamanan dan kenyamanan:
- Access token: 5-15 menit - membatasi paparan token yang bocor.
- Refresh token: beberapa jam hingga beberapa minggu, bergantung pada tingkat sensitivitas.
- Gunakan rotasi untuk token yang berlaku lebih dari satu hari.
AccessTokenLifetime = TimeSpan.FromMinutes(15);
RefreshTokenLifetime = TimeSpan.FromDays(7);Pemeriksaan Cepat
Uji pemahaman Anda tentang alur refresh.
Ringkasan
Anda telah menerapkan alur refresh token:
- Terbitkan access token singkat serta refresh token panjang, buram, dan disimpan di server.
- Titik akhir
/refreshmenukar refresh token yang valid dengan access token baru. - Rotasi dan deteksi penggunaan ulang memperkuat perlindungan terhadap pencurian.
- Simpan refresh token dalam cookie HttpOnly dan bersihkan baris yang kedaluwarsa.
Kursus autentikasi JWT telah selesai.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Token Refresh dan Kedaluwarsa” gratis?
Ya — teks lengkap “Token Refresh dan Kedaluwarsa” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Token Refresh dan Kedaluwarsa”?
Implementasikan pembaruan token yang aman. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C# Academy?
Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Token Refresh dan Kedaluwarsa” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?
Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Struktur dan Klaim JWT
- Mengonfigurasi Autentikasi JWT Bearer
- Menerbitkan Token
- Token Refresh dan Kedaluwarsa