C# Academy · บทเรียน

โทเค็นรีเฟรชและวันหมดอายุ

นำการต่ออายุโทเค็นที่ปลอดภัยไปใช้

บทเรียน 4 จาก 413 ขั้นตอน

โทเค็นรีเฟรชและวันหมดอายุ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. โครงสร้างและข้ออ้างสิทธิ์ของ JWT
  2. การกำหนดค่าการยืนยันตัวตน JWT Bearer
  3. การออกโทเค็น
  4. โทเค็นรีเฟรชและวันหมดอายุ
← กลับไปที่ C# Academy