โทเค็นรีเฟรชและวันหมดอายุ
นำการต่ออายุโทเค็นที่ปลอดภัยไปใช้
โทเค็นรีเฟรชและวันหมดอายุ เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
ปัญหาเรื่องการหมดอายุ
โทเค็นเข้าถึงที่มีอายุสั้นปลอดภัยแต่ไม่สะดวก เพราะการบังคับให้ผู้ใช้เข้าสู่ระบบทุก 15 นาทีทำให้ประสบการณ์ผู้ใช้แย่
วิธีแก้คือ โทเค็นรีเฟรช ซึ่งเป็นข้อมูลรับรองอีกชุดที่มีอายุยาวกว่าและใช้รับโทเค็นเข้าถึงใหม่โดยไม่ต้องป้อนรหัสผ่านอีกครั้ง
// access token: 15 minutes
// refresh token: 7-30 daysโทเค็นรีเฟรชคืออะไร
โดยทั่วไปโทเค็นรีเฟรชคือ สตริงสุ่มที่ไม่มีความหมายภายใน ไม่ใช่ JWT เนื่องจากมีอายุยาว จึงต้องจัดเก็บไว้ฝั่งเซิร์ฟเวอร์เพื่อให้สามารถเพิกถอนได้
สร้างโทเค็นนี้ด้วย RNG ที่ปลอดภัยทางการเข้ารหัส
public static string GenerateRefreshToken()
{
var bytes = new byte[64];
using var rng = RandomNumberGenerator.Create();
rng.GetBytes(bytes);
return Convert.ToBase64String(bytes);
}การจัดเก็บโทเค็นรีเฟรช
บันทึกโทเค็นรีเฟรชแต่ละรายการพร้อมเจ้าของ วันหมดอายุ และเครื่องหมายการเพิกถอน วิธีนี้ทำให้คุณยกเลิกโทเค็นได้เมื่อผู้ใช้ออกจากระบบหรือโทเค็นถูกขโมย
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; }
}การออกโทเค็นทั้งสองเมื่อเข้าสู่ระบบ
เมื่อเข้าสู่ระบบสำเร็จ ให้ส่งโทเค็นเข้าถึงที่มีอายุสั้น และโทเค็นรีเฟรชใหม่กลับไป พร้อมบันทึกโทเค็นรีเฟรชไว้ในฐานข้อมูล
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 โดยเฉพาะจะรับโทเค็นรีเฟรช และหากโทเค็นถูกต้องก็จะออกโทเค็นเข้าถึงใหม่เอี่ยม
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 });
});การหมุนเวียนโทเค็นรีเฟรช
การหมุนเวียนช่วยเพิ่มความปลอดภัยให้ขั้นตอนการทำงาน: ทุกครั้งที่ใช้โทเค็นรีเฟรช ให้เพิกถอนโทเค็นนั้นและออกโทเค็นใหม่ โทเค็นที่ถูกขโมยและถูกใช้ไปแล้วจะไม่สามารถใช้งานได้อีก
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();การตรวจจับการใช้โทเค็นซ้ำ
การหมุนเวียนช่วยให้ตรวจจับการขโมยได้: หากมีการนำโทเค็นที่ถูกเพิกถอนไปแล้วมาใช้อีก ให้ถือว่าเกิดการละเมิดความปลอดภัยและเพิกถอนกลุ่มโทเค็นทั้งหมดของผู้ใช้
if (stored.IsRevoked)
{
// This token was already used - likely stolen.
await RevokeAllUserTokens(stored.UserId, db);
return Results.Unauthorized();
}การออกจากระบบและการเพิกถอน
การออกจากระบบเพียงเพิกถอนโทเค็นรีเฟรชปัจจุบัน โทเค็นเข้าถึงจะหมดอายุเองภายในไม่กี่นาที
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();ตำแหน่งจัดเก็บโทเค็นบนไคลเอนต์
สำหรับเบราว์เซอร์ รูปแบบที่ปลอดภัยที่สุดคือจัดเก็บโทเค็นรีเฟรชไว้ใน คุกกี้ HttpOnly และปลอดภัย เพื่อไม่ให้ JavaScript อ่านได้ ซึ่งช่วยลดความเสี่ยงจากการขโมยด้วย XSS
โทเค็นเข้าถึงที่มีอายุสั้นอาจเก็บไว้ในหน่วยความจำได้
Response.Cookies.Append("refresh", refresh.Token, new CookieOptions
{
HttpOnly = true,
Secure = true,
SameSite = SameSiteMode.Strict,
Expires = refresh.ExpiresAt
});การล้างโทเค็นที่หมดอายุ
โทเค็นรีเฟรชจะสะสมเพิ่มขึ้น ให้เรียกใช้งานเบื้องหลังเป็นระยะ เช่น บริการที่ทำงานอยู่เบื้องหลัง เพื่อลบแถวข้อมูลที่หมดอายุหรือถูกเพิกถอน
await db.RefreshTokens
.Where(r => r.ExpiresAt < DateTime.UtcNow || r.IsRevoked)
.ExecuteDeleteAsync();การเลือกอายุการใช้งาน
สร้างสมดุลระหว่างความปลอดภัยกับความสะดวก:
- โทเค็นเข้าถึง: 5-15 นาที จำกัดความเสี่ยงจากโทเค็นที่รั่วไหล
- โทเค็นรีเฟรช: ตั้งแต่หลายชั่วโมงถึงหลายสัปดาห์ ขึ้นอยู่กับความอ่อนไหวของข้อมูล
- ใช้การหมุนเวียนกับโทเค็นที่มีอายุเกินหนึ่งวัน
AccessTokenLifetime = TimeSpan.FromMinutes(15);
RefreshTokenLifetime = TimeSpan.FromDays(7);ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจเกี่ยวกับขั้นตอนการรีเฟรช
ทบทวน
คุณได้ใช้งานขั้นตอนโทเค็นรีเฟรชแล้ว:
- ออกโทเค็นเข้าถึงอายุสั้นพร้อมโทเค็นรีเฟรชอายุยาวที่ไม่มีความหมายภายในและจัดเก็บไว้ฝั่งเซิร์ฟเวอร์
- จุดปลายทาง
/refreshแลกโทเค็นรีเฟรชที่ถูกต้องเป็นโทเค็นเข้าถึงใหม่ - การหมุนเวียนและการตรวจจับการใช้ซ้ำช่วยเพิ่มความปลอดภัยจากการขโมย
- จัดเก็บโทเค็นรีเฟรชในคุกกี้ HttpOnly และล้างแถวข้อมูลที่หมดอายุ
เท่านี้ก็จบหลักสูตรการยืนยันตัวตนด้วย JWT
เรียนรู้ C# ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 93
- บทเรียน
- 346
คำถามที่พบบ่อย
บทเรียน “โทเค็นรีเฟรชและวันหมดอายุ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “โทเค็นรีเฟรชและวันหมดอายุ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “โทเค็นรีเฟรชและวันหมดอายุ”
นำการต่ออายุโทเค็นที่ปลอดภัยไปใช้ คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “โทเค็นรีเฟรชและวันหมดอายุ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม
ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- โครงสร้างและข้ออ้างสิทธิ์ของ JWT
- การกำหนดค่าการยืนยันตัวตน JWT Bearer
- การออกโทเค็น
- โทเค็นรีเฟรชและวันหมดอายุ