ตัวถอดรหัส JWT (JWT Decoder)

วาง JSON Web Token เพื่ออ่าน header และ payload ดูว่าหมดอายุเมื่อไร และเข้าใจทุก claim โทเค็นของคุณไม่เคยออกจากเบราว์เซอร์

ทำงานในเบราว์เซอร์ไม่ต้องสมัครไม่มีการอัปโหลด

การถอดรหัสไม่ใช่การตรวจสอบ ใครก็อ่าน header และ payload ของ JWT ได้ เพราะเป็นเพียงการเข้ารหัสแบบ base64url เครื่องมือนี้แสดงสิ่งที่โทเค็น อ้าง แต่ไม่ได้พิสูจน์ว่าโทเค็นเป็นของจริง ควรตรวจสอบลายเซ็นบนเซิร์ฟเวอร์ของคุณเสมอ

Header

Payload


      

ตรวจสอบลายเซ็น (ไม่บังคับ, HS256/HS384/HS512)

ตรวจสอบลายเซ็น HMAC ด้วย secret ที่คุณป้อน โดยใช้ Web Crypto API ของเบราว์เซอร์ secret จะไม่ออกจากหน้านี้ โทเค็น RSA/ECDSA ต้องใช้ public key ของผู้ออกจึงไม่ได้ตรวจสอบที่นี่

วิธีใช้ ตัวถอดรหัส JWT

  1. วางโทเค็นลงในช่อง โทเค็นที่เข้ารหัส คำว่า Bearer ด้านหน้าจาก Authorization header จะถูกข้าม
  2. header และ payload จะถูกถอดรหัสทันทีและแสดงเป็น JSON ที่จัดรูปแบบแล้ว
  3. อ่านตาราง คำอธิบาย claim: exp, iat และ nbf ถูกแปลงเป็นวันที่ พร้อมบอกเวลา “จะหมดอายุใน” / “หมดอายุไปแล้ว”
  4. ดูแถบสถานะเพื่อหาปัญหาเรื่องวันหมดอายุ และดูคำเตือนสำหรับการตั้งค่าที่เสี่ยง เช่น alg: none
  5. หากต้องการ ป้อน shared secret เพื่อตรวจสอบลายเซ็น HS256, HS384 หรือ HS512 ภายในเครื่อง

ภายใน JWT มีอะไร?

JSON Web Token (RFC 7519) คือสตริง base64url สามส่วนที่เชื่อมด้วยจุด: header.payload.signature ส่วน header ระบุอัลกอริทึมที่ใช้ลงนาม (alg) และชนิดของโทเค็น ส่วน payload เก็บ claim ต่าง ๆ เช่น ผู้ใช้คือใคร และโทเค็นหมดอายุเมื่อไร ส่วน signature คำนวณจากสองส่วนแรกด้วย secret หรือ private key

การถอดรหัสไม่ใช่การตรวจสอบ

header และ payload เป็นเพียงการเข้ารหัส (encode) ไม่ได้เข้ารหัสลับ (encrypt) ใครที่ถือโทเค็นก็อ่านได้ นี่จึงเป็นเหตุผลที่ไม่ควรใส่รหัสผ่านหรือข้อมูลลับใน payload ของ JWT การถอดรหัสบอกว่าโทเค็น อ้างว่า อะไร ส่วนการตรวจสอบลายเซ็น ซึ่งปกติทำบน API server ด้วยไลบรารีอย่าง jose หรือ PyJWT จะพิสูจน์ว่าใครเป็นผู้ออกโทเค็นและโทเค็นไม่ถูกแก้ไข เซิร์ฟเวอร์ต้องตรวจ exp, nbf, iss และ aud ด้วย และปฏิเสธอัลกอริทึมที่ไม่คาดคิด

สรุป registered claim

Claimความหมาย
issIssuer: ผู้สร้างและลงนามโทเค็น
subSubject: โดยทั่วไปคือ ID ของผู้ใช้
audAudience: API ที่โทเค็นนี้มีไว้ใช้
expเวลาหมดอายุ เป็นวินาทีนับจาก Unix epoch
nbfใช้ไม่ได้ก่อนเวลานี้
iatเวลาที่ออกโทเค็น
jtiID เฉพาะของโทเค็น มีประโยชน์สำหรับรายการเพิกถอน

ดีบักข้อผิดพลาด “token expired”

หาก API ปฏิเสธโทเค็นที่ดูเหมือนยังใหม่ ให้เทียบ exp และ nbf กับนาฬิกาของเซิร์ฟเวอร์ นาฬิกาที่คลาดเคลื่อนเล็กน้อยระหว่างเครื่องเป็นเรื่องปกติ ไลบรารีส่วนใหญ่จึงเผื่อเวลา 30-60 วินาที และตรวจด้วยว่า exp เป็นวินาที ค่าที่เป็นมิลลิวินาทีเป็นบั๊กที่พบบ่อย และทำให้วันหมดอายุอยู่ในอนาคตอีกหลายพันปี

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

วาง JWT ของ production ที่นี่ปลอดภัยหรือไม่?
การถอดรหัสเกิดขึ้นในเบราว์เซอร์ของคุณด้วย JavaScript ทั้งหมด โทเค็นไม่ถูกอัปโหลด บันทึก หรือจัดเก็บ แต่เช่นเดียวกับข้อมูลรับรองอื่น ๆ ควรระมัดระวังกับโทเค็นที่ยังใช้งานอยู่ และใช้โทเค็นที่หมดอายุแล้วหรือโทเค็นทดสอบเมื่อต้องแชร์ภาพหน้าจอ
เครื่องมือนี้ตรวจสอบลายเซ็น JWT หรือไม่?
การถอดรหัสอย่างเดียวไม่ได้ตรวจสอบ คุณสามารถเลือกตรวจสอบโทเค็น HS256, HS384 และ HS512 ได้โดยป้อน shared secret โดย HMAC จะคำนวณภายในเครื่องด้วย Web Crypto API ส่วนโทเค็น RS256 และ ES256 ต้องตรวจสอบด้วย public key ของผู้ออกบนเซิร์ฟเวอร์ของคุณ
ทำไมโทเค็นของฉันแสดงว่าหมดอายุ?
claim exp อยู่ในอดีตเมื่อเทียบกับนาฬิกาของคอมพิวเตอร์คุณ ให้ขอโทเค็นใหม่หรือรีเฟรชด้วย refresh token หากเวลาดูไม่ถูกต้อง ให้ตรวจสอบนาฬิกาที่คลาดเคลื่อน หรือค่า exp ที่เขียนเป็นมิลลิวินาที
JWT, JWS และ JWE ต่างกันอย่างไร?
JWT คือรูปแบบของ claim ส่วน JWS คือ JWT ที่ลงนามแล้วซึ่งมีสามส่วน และเป็นสิ่งที่เครื่องมือนี้ถอดรหัส ส่วน JWE คือ JWT ที่เข้ารหัสลับซึ่งมีห้าส่วน ไม่สามารถอ่าน payload ได้หากไม่มีคีย์ถอดรหัส
ทำไม alg “none” จึงอันตราย?
โทเค็นที่ไม่ได้ลงนามสามารถถูกปลอมแปลงโดยใครก็ได้ เซิร์ฟเวอร์ต้องปฏิเสธ alg: none และควรยอมรับเฉพาะอัลกอริทึมที่คาดไว้เท่านั้น

เครื่องมือที่เกี่ยวข้อง