วิธีถอดรหัสและตรวจสอบโทเค็น JWT

· 4 นาทีในการอ่าน

โทเค็น JSON Web Token (JWT) เป็นวิธีที่นิยมที่สุดในการจัดการการรับรองความถูกต้องในแอปพลิเคชันเว็บสมัยใหม่ เมื่อมีบางอย่างผิดปกติด้านการรับรองความถูกต้อง — ผู้ใช้ถูกออกจากระบบโดยไม่มีเหตุผล สิทธิ์ผิด หรือ API ส่งคืน 401 — การถอดรหัส JWT มักเป็นขั้นตอนแรกของการดีบัก

JWT มีอะไร

JWT มีสามส่วนคั่นด้วยจุด:

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U

ส่วนหัว — มีอัลกอริทึม (HS256, RS256 ฯลฯ) และประเภทของโทเค็น

{"alg": "HS256", "typ": "JWT"}

เพย์โหลด — มีการเรียกร้อง (ข้อยืนยัน) เกี่ยวกับผู้ใช้และโทเค็น

{"sub": "1234567890", "name": "Alice", "exp": 1700000000}

ลายเซ็น — ลายนิ้วมือเข้ารหัสที่รับประกันว่าโทเค็นไม่ถูกแก้ไข คุณไม่สามารถอ่านได้โดยไม่มีคีย์ลายเซ็น

การเรียกร้อง JWT ที่พบบ่อย

การเรียกร้อง ชื่อเต็ม เนื้อหา
sub Subject ID หรือตัวระบุผู้ใช้
exp Expiration เวลา Unix ของการสิ้นสุดความถูกต้อง
iat Issued At เวลา Unix ของการสร้าง
iss Issuer ใครสร้างโทเค็น (เซิร์ฟเวอร์การรับรองความถูกต้องของคุณ)
aud Audience โทเค็นนี้สำหรับใคร
nbf Not Before โทเค็นไม่ถูกต้องก่อนวันที่นี้
jti JWT ID ตัวระบุที่ไม่ซ้ำของโทเค็น

วิธีถอดรหัส JWT

  1. วางโทเค็นของคุณ — ป้อน JWT แบบเต็ม (รูปแบบ ส่วนหัว.เพย์โหลด.ลายเซ็น) ในตัวถอดรหัส
  2. ดูส่วนที่ถอดรหัสแล้ว — เครื่องมือแสดงส่วนหัว (อัลกอริทึม) เพย์โหลด (การเรียกร้อง) และลายเซ็นในรูปแบบ JSON ที่จัดรูปแบบ
  3. ตรวจสอบการเรียกร้อง — ตรวจสอบวันที่หมดอายุ ผู้ออก หัวเรื่อง และการเรียกร้องที่กำหนดเองใดๆ

การดีบักด้วย JWT

โทเค็นหมดอายุ? ตรวจสอบการเรียกร้อง exp แปลงเวลา Unix เป็นวันที่ที่อ่านได้ หากผ่านไปแล้ว โทเค็นหมดอายุและต้องรีเฟรช

สิทธิ์ผิด? มองหาการเรียกร้องบทบาทหรือขอบเขตในเพย์โหลด มันแตกต่างกันไปตามการใช้งานแต่มักดูเหมือน "role": "admin" หรือ "scope": "read write"

ปัญหาเอกลักษณ์ผู้ใช้? การเรียกร้อง sub ระบุผู้ใช้ ตรวจสอบว่าตรงกับ ID ที่คาดหวัง

โทเค็นถูกปฏิเสธ? ตรวจสอบการเรียกร้อง aud (audience) หาก API คาดหวัง audience เฉพาะและโทเค็นมีอันอื่น มันจะถูกปฏิเสธ

หมายเหตุด้านความปลอดภัยที่สำคัญ

คำถามที่พบบ่อย

ฉันสามารถตรวจสอบลายเซ็น JWT ด้วยตัวถอดรหัสได้หรือไม่?

ไม่ การตรวจสอบลายเซ็นต้องการความลับของลายเซ็นหรือกุญแจสาธารณะ ที่เก็บไว้ในเซิร์ฟเวอร์ของคุณ ตัวถอดรหัสแสดงให้คุณเห็นว่ามีอะไรในโทเค็น แต่การตรวจสอบเข้ารหัสต้องเกิดขึ้นในแบ็กเอนด์ของคุณ อย่าไว้วางใจ JWT ที่ไม่ได้ตรวจสอบในการผลิต

ปลอดภัยหรือไม่ที่จะวาง JWT ในเครื่องมือออนไลน์?

ปลอดภัย เมื่อเครื่องมือทำงานในเบราว์เซอร์ของคุณ ตัวถอดรหัสในเบราว์เซอร์ประมวลผลโทเค็นในเครื่อง — ไม่มีอะไรถูกส่งไปยังเซิร์ฟเวอร์ หลีกเลี่ยงเครื่องมือที่ส่งคำขอเครือข่ายด้วยโทเค็นของคุณ

การเรียกร้อง exp คืออะไร?

การเรียกร้อง exp (expiration) เป็นเวลา Unix ที่ระบุเมื่อโทเค็นหมดอายุ หลังจากวันที่นี้ โทเค็นควรถูกปฏิเสธ ตรวจสอบการเรียกร้องนี้เสมอเพื่อดีบักปัญหาการรับรองความถูกต้อง

JWT สามารถถูกเข้ารหัสได้หรือไม่?

JWT มาตรฐาน (JWS) ลงนามแต่ไม่ได้เข้ารหัส — ทุกคนสามารถถอดรหัสเพย์โหลดได้ โทเค็น JWE (JSON Web Encryption) ถูกเข้ารหัส แต่ไม่ค่อยพบ อย่าใส่ข้อมูลที่ละเอียดอ่อน (รหัสผ่าน ความลับ) ในเพย์โหลด JWT มาตรฐาน