ตัวถอดรหัส JWT คืออะไร?
JWT (JSON Web Token) เป็นวิธีมาตรฐานที่ API เว็บสมัยใหม่ใช้แสดง claims สำหรับการยืนยันตัวตนและการอนุญาต เป็นโทเคนที่กระชับและครบในตัว ประกอบด้วยสามส่วน — header ที่อธิบายอัลกอริทึมการเซ็น payload ที่บรรจุ claims จริง (เช่น ID ผู้ใช้ บทบาท และเวลาหมดอายุ) และ signature ที่ทำให้เซิร์ฟเวอร์ผู้รับสามารถตรวจสอบว่าโทเคนไม่ถูกแก้ไข
เครื่องถอดรหัสนี้อ่าน header และ payload ได้ทันที เพื่อให้คุณดีบักปัญหาด้านการยืนยันตัวตน ตรวจสอบว่า API ส่ง claims อะไรบ้าง หรือตรวจสอบว่าโทเคนหมดอายุเมื่อใด — ทั้งหมดโดยไม่ต้องใช้ backend เครื่องมือ CLI หรือวางโทเคนที่ละเอียดอ่อนลงในเซิร์ฟเวอร์ของบุคคลที่สาม เนื่องจากทุกอย่างทำงานในเบราว์เซอร์ของคุณ
เมื่อไหร่ควรใช้เครื่องคำนวณนี้
- แก้ไขปัญหาว่าทำไม API จึงปฏิเสธโทเคน โดยการตรวจสอบ claims และเวลาหมดอายุ
- ตรวจสอบเวลาหมดอายุของโทเคนระหว่างการตรวจสอบปัญหาสนับสนุนหรือการตอบสนองต่อเหตุการณ์
- การตรวจสอบว่าผู้ให้บริการ SSO หรือ OAuth ออกคลังข้อมูลที่แอปพลิเคชันของคุณคาดหวัง
- เรียนรู้โครงสร้างของ JWT เพื่อเตรียมสัมภาษณ์งานหรือการเรียนด้านความปลอดภัย
- ตรวจสอบโทเคนที่จับได้จากเครื่องมือนักพัฒนาของเบราว์เซอร์หรือบันทึกของเซิร์ฟเวอร์เพื่อทำความเข้าใจเนื้อหา
- เปรียบเทียบอัลกอริทึมส่วนหัวระหว่างโทเคนเพื่อแก้ไขปัญหาการยืนยันตัวตนที่ล้มเหลวจากอัลกอริทึมไม่ตรงกัน
ขั้นตอน:
- วาง JWT ของคุณลงในช่องป้อนข้อมูล หรือคลิก "โหลดตัวอย่าง" เพื่อลองใช้
- header และ payload จะถูกถอดรหัสโดยอัตโนมัติขณะที่คุณพิมพ์
- ตรวจสอบ claims เช่น iss, sub, exp และ iat ในรูปแบบที่อ่านได้ง่าย
- claims ประเภทเวลา (exp, iat, nbf) จะถูกแปลงเป็นวันที่ที่อ่านได้โดยอัตโนมัติ
สูตร
JWT = base64Url(header) + "." + base64Url(payload) + "." + base64Url(signature)
การถอดรหัส: แยกด้วย "." ถอดรหัส base64Url ของสองส่วนแรก แล้ว parse เป็น JSON
การตรวจสอบ (ไม่ได้ทำที่นี่): HMACSHA256(base64Url(header) + "." + base64Url(payload), secret) === signature
กรณีใช้งาน
- แก้ไขปัญหาว่าทำไม API จึงปฏิเสธโทเคน โดยการตรวจสอบ claims ของมัน
- ตรวจสอบเวลาหมดอายุของโทเคนระหว่างการตรวจสอบปัญหาสนับสนุน
- ยืนยันว่าผู้ให้บริการ SSO หรือ OAuth ออก claims ตามที่คาดไว้
- เรียนรู้โครงสร้างของ JWT เพื่อเตรียมสัมภาษณ์งานหรือการเรียน
- ตรวจสอบโทเคนที่คัดลอกจากเครื่องมือนักพัฒนาของเบราว์เซอร์หรือบันทึกของเซิร์ฟเวอร์ได้อย่างรวดเร็ว
ประโยชน์หลัก
- ถอดรหัส JWT ใดก็ได้ทันทีโดยไม่ต้องมีแบ็กเอนด์หรือเครื่องมือบรรทัดคำสั่ง
- ทุกอย่างทำงานฝั่งไคลเอนต์ — โทเคนจะไม่ถูกส่งไปยังเซิร์ฟเวอร์เลย
- แปลง claims ประเภทเวลาเป็นวันที่ที่อ่านได้โดยอัตโนมัติ
- ใช้งานฟรี ไม่ต้องสมัครสมาชิก ใช้งานได้กับ JWT ทุกแบบไม่ว่าจะใช้อัลกอริทึมใด
เคล็ดลับ
- ตรวจสอบ 'exp' ก่อนเสมอเมื่อแก้ไขปัญหา "unauthorized" — โทเคนที่หมดอายุคือสาเหตุที่พบบ่อยที่สุด
- เทียบ 'alg' ใน header กับสิ่งที่แบ็กเอนด์ของคุณคาดหวัง เพื่อตรวจจับข้อผิดพลาดจากอัลกอริทึมไม่ตรงกัน
- อย่าเชื่อ payload ที่ถอดรหัสแล้วว่าเป็นหลักฐานยืนยันตัวตนโดยไม่ตรวจสอบลายเซ็นที่ฝั่งเซิร์ฟเวอร์
- ใช้โทเคนอายุสั้นร่วมกับ refresh token แทนที่จะใช้ JWT อายุยาว เพื่อลดความเสียหายหากรั่วไหล
ข้อผิดพลาดที่พบบ่อย
- สันนิษฐานว่า JWT ที่ถอดรหัสแล้วคือ JWT ที่ผ่านการตรวจสอบแล้ว — การถอดรหัสเป็นเพียงการอ่านเนื้อหา ไม่ได้ยืนยันความถูกต้องแท้จริง
- เก็บข้อมูลที่ละเอียดอ่อน (รหัสผ่าน คีย์ลับ) ไว้ใน payload โดยลืมไปว่าใครก็อ่านได้
- วางโทเคนจากระบบจริงลงในตัวถอดรหัสออนไลน์ที่ไม่น่าเชื่อถือ
- สับสนระหว่าง 'exp' (เวลาหมดอายุ) กับ 'iat' (เวลาที่ออกโทเคน) เมื่อแก้ไขปัญหาอายุการใช้งานของโทเคน
คำศัพท์สำคัญ
- Claim: ข้อมูลที่ยืนยันเกี่ยวกับผู้ใช้ เช่น user ID หรือบทบาท
- Header: ส่วนแรกของ JWT ระบุอัลกอริทึมการเซ็นและประเภทของโทเคน
- Payload: ส่วนที่สองของ JWT ที่บรรจุ claims จริง
- Signature: ส่วนที่สามของ JWT ใช้ตรวจสอบว่าโทเคนไม่ถูกเปลี่ยนแปลง
แนวคิดที่เกี่ยวข้อง
- ตัวสร้างแฮช:
- ตัวสร้าง UUID:
- ตัวเขียน/ถอดรหัส Base64:
- ตัวจัดรูปแบบ JSON:
- ตัวตรวจสอบความแข็งแรงของรหัสผ่าน:
ตัวอย่าง
โทเคนที่ขึ้นต้นด้วย eyJhbGciOiJIUzI1NiJ9 จะถอดรหัสเป็น header {"alg":"HS256","typ":"JWT"} — บอกว่าโทเคนนี้เซ็นด้วย HMAC-SHA256
การตีความผลลัพธ์
ตัวถอดรหัสจะแบ่ง JWT ที่ตัวคั่นจุดสองตำแหน่งและถอดรหัสสองส่วนแรกด้วย Base64URL ส่วนหัวจะบอกอัลกอริทึมการลงนาม (เช่น HS256 หรือ RS256) และประเภทของโทเค็น ส่วน payload จะมี claims จริง — ข้อมูลประจำตัวผู้ใช้ สิทธิ์ และการประทับเวลา
claims ประเภทเวลาประทับ (exp, iat, nbf) จะถูกแปลงจาก Unix epoch เป็นวันที่อ่านได้โดยอัตโนมัติ หาก 'exp' แสดงวันที่ในอดีต แสดงว่าโทเค็นหมดอายุและเซิร์ฟเวอร์ส่วนใหญ่จะปฏิเสธ claim 'sub' (subject) มักมีรหัสผู้ใช้ และ 'iss' (issuer) ระบุเซิร์ฟเวอร์ที่สร้างโทเค็น
โปรดจำไว้ว่าการถอดรหัสไม่ใช่การตรวจสอบความถูกต้อง ส่วนลายเซ็นจะแสดงขึ้นแต่ไม่สามารถตรวจสอบได้หากไม่มีคีย์ลับหรือคีย์สาธารณะ payload ที่ถอดรหัสแล้วเป็นเพียงข้อมูลประกอบ — ห้ามเชื่อถือว่าเป็นหลักฐานยืนยันตัวตนโดยไม่มีการตรวจสอบลายเซ็นฝั่งเซิร์ฟเวอร์

