วิธีถอดรหัสและตรวจสอบโทเค็น JWT
โทเค็น 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
- วางโทเค็นของคุณ — ป้อน JWT แบบเต็ม (รูปแบบ ส่วนหัว.เพย์โหลด.ลายเซ็น) ในตัวถอดรหัส
- ดูส่วนที่ถอดรหัสแล้ว — เครื่องมือแสดงส่วนหัว (อัลกอริทึม) เพย์โหลด (การเรียกร้อง) และลายเซ็นในรูปแบบ JSON ที่จัดรูปแบบ
- ตรวจสอบการเรียกร้อง — ตรวจสอบวันที่หมดอายุ ผู้ออก หัวเรื่อง และการเรียกร้องที่กำหนดเองใดๆ
การดีบักด้วย JWT
โทเค็นหมดอายุ? ตรวจสอบการเรียกร้อง exp แปลงเวลา Unix เป็นวันที่ที่อ่านได้ หากผ่านไปแล้ว โทเค็นหมดอายุและต้องรีเฟรช
สิทธิ์ผิด? มองหาการเรียกร้องบทบาทหรือขอบเขตในเพย์โหลด มันแตกต่างกันไปตามการใช้งานแต่มักดูเหมือน "role": "admin" หรือ "scope": "read write"
ปัญหาเอกลักษณ์ผู้ใช้? การเรียกร้อง sub ระบุผู้ใช้ ตรวจสอบว่าตรงกับ ID ที่คาดหวัง
โทเค็นถูกปฏิเสธ? ตรวจสอบการเรียกร้อง aud (audience) หาก API คาดหวัง audience เฉพาะและโทเค็นมีอันอื่น มันจะถูกปฏิเสธ
หมายเหตุด้านความปลอดภัยที่สำคัญ
- JWT ไม่ได้เข้ารหัส — ทุกคนสามารถถอดรหัสเพย์โหลดได้ อย่าใส่รหัสผ่าน คีย์ API หรือความลับอื่นๆ ใน JWT
- ตรวจสอบลายเซ็นในฝั่งเซิร์ฟเวอร์เสมอ — ตัวถอดรหัสแสดงให้คุณเห็นว่าโทเค็นเรียกร้องอะไร แต่เฉพาะการตรวจสอบลายเซ็นเท่านั้นที่พิสูจน์ว่าไม่ถูกแก้ไข
- ตรวจสอบการหมดอายุ — โทเค็นที่หมดอายุควรถูกปฏิเสธเสมอ หากแอปพลิเคชันของคุณยอมรับโทเค็นที่หมดอายุ นั่นเป็นช่องโหว่ด้านความปลอดภัย
คำถามที่พบบ่อย
ฉันสามารถตรวจสอบลายเซ็น JWT ด้วยตัวถอดรหัสได้หรือไม่?
ไม่ การตรวจสอบลายเซ็นต้องการความลับของลายเซ็นหรือกุญแจสาธารณะ ที่เก็บไว้ในเซิร์ฟเวอร์ของคุณ ตัวถอดรหัสแสดงให้คุณเห็นว่ามีอะไรในโทเค็น แต่การตรวจสอบเข้ารหัสต้องเกิดขึ้นในแบ็กเอนด์ของคุณ อย่าไว้วางใจ JWT ที่ไม่ได้ตรวจสอบในการผลิต
ปลอดภัยหรือไม่ที่จะวาง JWT ในเครื่องมือออนไลน์?
ปลอดภัย เมื่อเครื่องมือทำงานในเบราว์เซอร์ของคุณ ตัวถอดรหัสในเบราว์เซอร์ประมวลผลโทเค็นในเครื่อง — ไม่มีอะไรถูกส่งไปยังเซิร์ฟเวอร์ หลีกเลี่ยงเครื่องมือที่ส่งคำขอเครือข่ายด้วยโทเค็นของคุณ
การเรียกร้อง exp คืออะไร?
การเรียกร้อง exp (expiration) เป็นเวลา Unix ที่ระบุเมื่อโทเค็นหมดอายุ หลังจากวันที่นี้ โทเค็นควรถูกปฏิเสธ ตรวจสอบการเรียกร้องนี้เสมอเพื่อดีบักปัญหาการรับรองความถูกต้อง
JWT สามารถถูกเข้ารหัสได้หรือไม่?
JWT มาตรฐาน (JWS) ลงนามแต่ไม่ได้เข้ารหัส — ทุกคนสามารถถอดรหัสเพย์โหลดได้ โทเค็น JWE (JSON Web Encryption) ถูกเข้ารหัส แต่ไม่ค่อยพบ อย่าใส่ข้อมูลที่ละเอียดอ่อน (รหัสผ่าน ความลับ) ในเพย์โหลด JWT มาตรฐาน