โครงสร้างและข้ออ้างสิทธิ์ของ JWT
ทำความเข้าใจส่วนหัว เพย์โหลด และลายเซ็น
โครงสร้างและข้ออ้างสิทธิ์ของ JWT เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
JWT คืออะไร
JSON Web Token (JWT) คือรูปแบบโทเค็นขนาดกะทัดรัดที่ปลอดภัยสำหรับ URL ใช้ส่งข้อมูลอ้างสิทธิ์ระหว่างสองฝ่ายอย่างปลอดภัย ใน ASP.NET Core รูปแบบนี้เป็นวิธีที่ใช้กันมากที่สุดในการยืนยันตัวตนของ API แบบไร้สถานะ
JWT เป็นเพียงสตริงที่ประกอบด้วยสามส่วนซึ่งเข้ารหัสแบบ Base64Url และเชื่อมด้วยจุด: header.payload.signature
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0Iiwicm9sZSI6ImFkbWluIn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5cส่วนหัว
ส่วนหัวอธิบายวิธีลงลายเซ็นให้โทเค็น ส่วนหัวเป็นออบเจ็กต์ JSON ขนาดเล็กที่ถูกเข้ารหัสแบบ Base64Url เป็นส่วนแรก
alg ระบุอัลกอริทึมสำหรับลงลายเซ็น (เช่น HS256, RS256) และ typ มักเป็น JWT เสมอ
{
"alg": "HS256",
"typ": "JWT"
}ข้อมูลบรรทุก
ข้อมูลบรรทุกประกอบด้วยข้อมูลอ้างสิทธิ์ ซึ่งเป็นข้อความเกี่ยวกับผู้ใช้และข้อมูลเมทาดาทาของโทเค็น โดยอยู่ในส่วนที่สอง
สำคัญ: ข้อมูลบรรทุกถูกเพียงเข้ารหัสรูปแบบเท่านั้น ไม่ได้เข้ารหัสเพื่อปกปิดข้อมูล ทุกคนสามารถถอดรหัสได้ ดังนั้นอย่าเก็บข้อมูลลับไว้ที่นี่
{
"sub": "1234",
"name": "Alice",
"role": "admin",
"exp": 1735689600
}ลายเซ็น
ลายเซ็นรับรองว่าโทเค็นไม่ได้ถูกแก้ไข เซิร์ฟเวอร์จะคำนวณลายเซ็นจากส่วนหัวที่เข้ารหัส ข้อมูลบรรทุกที่เข้ารหัส และกุญแจลับ
หากมีใครเปลี่ยนอักขระในข้อมูลบรรทุกแม้แต่ตัวเดียว ลายเซ็นจะไม่ตรงกันอีกต่อไปและการตรวจสอบจะล้มเหลว
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secretKey
)ข้อมูลอ้างสิทธิ์มาตรฐาน
ชื่อข้อมูลอ้างสิทธิ์บางชื่อถูกกำหนดให้เป็นมาตรฐานโดยข้อกำหนด JWT (RFC 7519) ชื่อเหล่านี้ใช้คีย์สั้น ๆ สามตัวอักษร:
iss- ผู้ออกsub- หัวข้อ (รหัสผู้ใช้)aud- กลุ่มผู้รับexp- เวลาหมดอายุ (วินาทีแบบ Unix)nbf- ยังไม่ถูกต้องก่อนเวลานี้iat- เวลาที่ออกให้
{
"iss": "https://api.myapp.com",
"aud": "myapp-clients",
"sub": "42",
"exp": 1735689600,
"iat": 1735686000
}ข้อมูลอ้างสิทธิ์แบบกำหนดเอง
นอกเหนือจากชุดมาตรฐานแล้ว คุณสามารถเพิ่มข้อมูลอ้างสิทธิ์แบบกำหนดเองตามที่แอปพลิเคชันต้องการได้ เช่น บทบาท สิทธิ์ รหัสผู้เช่า อีเมล และอื่น ๆ
ควรรักษาขนาดข้อมูลบรรทุกให้เล็ก เนื่องจากข้อมูลอ้างสิทธิ์ทุกรายการจะถูกส่งไปกับทุกคำขอ
{
"sub": "42",
"email": "alice@myapp.com",
"role": "admin",
"tenant_id": "acme",
"permissions": ["orders:read", "orders:write"]
}ข้อมูลอ้างสิทธิ์ใน ASP.NET Core
ใน .NET ข้อมูลอ้างสิทธิ์จะแสดงด้วยชนิด System.Security.Claims.Claim ข้อมูลอ้างสิทธิ์แต่ละรายการเป็นคู่ ประเภท / ค่า
เมื่อ JWT ผ่านการตรวจสอบความถูกต้อง ASP.NET Core จะแปลงแต่ละรายการในส่วนข้อมูลเป็น Claim ใน ClaimsPrincipal ของผู้ใช้
var claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier, "42"),
new Claim(ClaimTypes.Name, "Alice"),
new Claim(ClaimTypes.Role, "admin"),
new Claim("tenant_id", "acme")
};ClaimsPrincipal และ ClaimsIdentity
ผู้ใช้ที่ผ่านการยืนยันตัวตนจะแสดงด้วย ClaimsPrincipal ซึ่งครอบคลุมออบเจ็กต์ ClaimsIdentity อย่างน้อยหนึ่งรายการ โดยแต่ละรายการเก็บชุดข้อมูลอ้างสิทธิ์ไว้
ในตัวควบคุม คุณเข้าถึงข้อมูลนี้ผ่าน User
// Inside a controller action
var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
bool isAdmin = User.IsInRole("admin");
string? tenant = User.FindFirst("tenant_id")?.Value;การจับคู่ประเภทข้อมูลอ้างสิทธิ์
โดยค่าเริ่มต้น ตัวจัดการ JWT จะจับคู่คีย์ JWT แบบสั้นกับประเภทข้อมูลอ้างสิทธิ์รูปแบบ URI แบบยาว เช่น sub จะกลายเป็น ClaimTypes.NameIdentifier
หากต้องการคงชื่อแบบสั้นเดิมไว้ ให้ปิดใช้งานการจับคู่ข้อมูลขาเข้าเพียงครั้งเดียวเมื่อเริ่มต้นระบบ
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
// Now User.FindFirst("sub") returns the raw 'sub' claimทำไมไม่ใช้คุกกี้เซสชันไปเลย
JWT มีข้อมูลครบในตัวเอง: เซิร์ฟเวอร์สามารถตรวจสอบความถูกต้องได้โดยใช้เพียงคีย์สำหรับลงนาม โดยไม่ต้องค้นหาฐานข้อมูลหรือใช้ที่เก็บเซสชันฝั่งเซิร์ฟเวอร์
คุณสมบัตินี้ทำให้ JWT เหมาะอย่างยิ่งสำหรับ API ที่ปรับขนาดในแนวนอนและไมโครเซอร์วิส ซึ่งโหนดใดก็สามารถตรวจสอบโทเค็นเดียวกันได้
// Client sends the token on every request:
// Authorization: Bearer eyJhbGciOiJIUzI1Ni...ข้อแลกเปลี่ยน: การเพิกถอน
เนื่องจาก JWT มีข้อมูลครบในตัวเองและเชื่อถือได้จนกว่าจะหมดอายุ คุณจึงไม่สามารถ เพิกถอน JWT ได้โดยง่ายก่อนถึงเวลาที่ระบุใน exp
วิธีรับมือที่ใช้กันทั่วไปคือกำหนดให้โทเค็นเข้าถึงมีอายุสั้น และใช้คู่กับโทเค็นรีเฟรช ซึ่งจะกล่าวถึงภายหลังในหลักสูตรนี้
// Short-lived access token
exp = iat + 15 * 60; // 15 minutesตรวจสอบความเข้าใจ
ทดสอบความเข้าใจเกี่ยวกับโครงสร้างของ JWT
ทบทวน
คุณได้เรียนรู้โครงสร้างของ JWT และการทำงานของข้อมูลอ้างสิทธิ์ใน ASP.NET Core:
- JWT ประกอบด้วย
header.payload.signatureโดยแต่ละส่วนเข้ารหัสแบบ Base64Url - ส่วนข้อมูลมีข้อมูลอ้างสิทธิ์ที่ลงทะเบียนไว้และกำหนดเอง ซึ่งเข้ารหัสไว้แต่ไม่ได้เข้ารหัสลับ
- ลายเซ็นรับรองความถูกต้องครบถ้วนของข้อมูลโดยใช้ข้อมูลลับหรือคู่คีย์
- .NET แปลงข้อมูลอ้างสิทธิ์เป็น
ClaimsPrincipalซึ่งคุณอ่านได้ผ่านUser
ต่อไปคุณจะกำหนดค่า ASP.NET Core เพื่อตรวจสอบความถูกต้องของโทเค็นเหล่านี้
เรียนรู้ C# ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 93
- บทเรียน
- 346
คำถามที่พบบ่อย
บทเรียน “โครงสร้างและข้ออ้างสิทธิ์ของ JWT” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “โครงสร้างและข้ออ้างสิทธิ์ของ JWT” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “โครงสร้างและข้ออ้างสิทธิ์ของ JWT”
ทำความเข้าใจส่วนหัว เพย์โหลด และลายเซ็น คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “โครงสร้างและข้ออ้างสิทธิ์ของ JWT” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม
ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- โครงสร้างและข้ออ้างสิทธิ์ของ JWT
- การกำหนดค่าการยืนยันตัวตน JWT Bearer
- การออกโทเค็น
- โทเค็นรีเฟรชและวันหมดอายุ