ตัวถอดรหัส JWT

วาง JSON Web Token เพื่อดูส่วนหัวและเพย์โหลดเป็น JSON ที่จัดรูปแบบแล้ว ดูเวลา exp, iat และ nbf ในรูปวันที่ และดูว่าโทเค็นหมดอายุแล้วหรือยัง คุณยังตรวจสอบลายเซ็นภายในเครื่องได้ด้วยคีย์ลับหรือคีย์สาธารณะ

ส่วนหัว (Header)

เพย์โหลด (Payload)

ข้อมูลอ้างสิทธิ์ (Claims)

ลายเซ็น (Signature)

ตรวจสอบลายเซ็น

ทำงานภายในเบราว์เซอร์ของคุณทั้งหมด ไม่มีการอัปโหลดข้อมูลใด ๆ

วิธีใช้งาน

  1. วางโทเค็นทั้งหมด ซึ่งประกอบด้วยส่วน Base64URL สามส่วนที่คั่นด้วยจุด
  2. อ่านส่วนหัวและเพย์โหลดที่ถอดรหัสแล้ว ข้อมูลอ้างสิทธิ์ exp, iat และ nbf จะแสดงเป็นวันที่ พร้อมคำเตือนเมื่อโทเค็นหมดอายุแล้วหรือยังไม่มีผล
  3. หากต้องการตรวจสอบลายเซ็น ให้ป้อนคีย์ลับที่ใช้ร่วมกันสำหรับ HS256, HS384 หรือ HS512 หรือวางคีย์สาธารณะแบบ PEM สำหรับอัลกอริทึมตระกูล RS, PS หรือ ES
  4. ตรวจสอบว่าข้อมูลอ้างสิทธิ์ผู้ออก (issuer) ผู้รับ (audience) และหัวเรื่อง (subject) ตรงกับที่แอปพลิเคชันของคุณคาดไว้

โครงสร้างของ JWT

JSON Web Token (RFC 7519) ประกอบด้วยสามส่วนที่คั่นด้วยจุด: header.payload.signature ส่วนหัวและเพย์โหลดเป็นออบเจ็กต์ JSON ที่เข้ารหัสเป็น Base64URL แบบไม่มีแพดดิง โทเค็นเกือบทั้งหมดจึงขึ้นต้นด้วย eyJ ซึ่งคือ {" ที่เปิดออบเจ็กต์หลังจากเข้ารหัสแล้ว ลายเซ็นคำนวณจากสองส่วนแรกตามที่ปรากฏในโทเค็นทุกตัวอักษร

  • ส่วนหัว: อัลกอริทึมที่ใช้ลงนามใน alg โดยทั่วไปมี "typ": "JWT" และมักมี kid ที่ระบุคีย์
  • เพย์โหลด: ข้อมูลอ้างสิทธิ์ต่าง ๆ เช่น ผู้ใช้คือใคร ใครเป็นผู้ออกโทเค็น และโทเค็นหมดอายุเมื่อใด
  • ลายเซ็น: ลายเซ็นแบบ HMAC, RSA หรือ ECDSA ที่พิสูจน์ว่าส่วนหัวและเพย์โหลดไม่ได้ถูกแก้ไข

โทเค็นที่มีห้าส่วนคือ JWE ที่เข้ารหัสลับไว้ ไม่สามารถอ่านเนื้อหาได้หากไม่มีคีย์สำหรับถอดรหัส

ข้อมูลอ้างสิทธิ์ที่ลงทะเบียนไว้

ข้อมูลอ้างสิทธิ์ชื่อความหมาย
issผู้ออก (Issuer)ผู้ที่สร้างและลงนามโทเค็น
subหัวเรื่อง (Subject)ผู้ที่โทเค็นนี้อ้างถึง โดยทั่วไปคือ ID ผู้ใช้
audผู้รับ (Audience)บริการที่โทเค็นนี้มีไว้ใช้งานด้วย
expเวลาหมดอายุ (Expiration time)หลังจากเวลานี้ต้องปฏิเสธโทเค็น
nbfใช้ได้ตั้งแต่ (Not before)ก่อนเวลานี้ต้องปฏิเสธโทเค็น
iatออกให้เมื่อ (Issued at)เวลาที่สร้างโทเค็น
jtiJWT IDตัวระบุที่ไม่ซ้ำกัน ใช้ตรวจจับการนำโทเค็นมาใช้ซ้ำ (replay)

เวลาเป็นค่าแบบ NumericDate คือจำนวนวินาทีนับตั้งแต่ 1 มกราคม 1970 UTC ไม่ใช่มิลลิวินาที ตัวถอดรหัสจะแสดงเวลาเหล่านี้เป็นวันที่ที่อ่านง่าย และเปรียบเทียบกับนาฬิกาของอุปกรณ์คุณ

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

ใครก็ถอดรหัส JWT ได้ เพราะเพย์โหลดเป็นเพียงข้อมูลที่เข้ารหัส (encode) ไว้ ไม่ได้เข้ารหัสลับ (encrypt) อย่าใส่รหัสผ่านหรือข้อมูลลับอื่น ๆ ไว้ในเพย์โหลด ความน่าเชื่อถือมาจากการตรวจสอบลายเซ็นด้วยคีย์ที่ถูกต้องเท่านั้น และเซิร์ฟเวอร์ที่รับโทเค็นควร:

  • อนุญาตเฉพาะอัลกอริทึมที่คาดไว้ และปฏิเสธ "alg": "none" ซึ่งระบุว่าเป็นโทเค็นที่ไม่มีลายเซ็น
  • ไม่ปล่อยให้ส่วนหัวของโทเค็นเป็นตัวเลือกว่าจะใช้ HMAC หรือ RSA มิฉะนั้นผู้โจมตีอาจลงนามโทเค็นปลอมโดยนำคีย์สาธารณะของคุณมาใช้เป็นคีย์ลับของ HMAC
  • ตรวจสอบ exp, nbf, iss และ aud ในทุกคำขอ

การตรวจสอบลายเซ็นซึ่งเป็นตัวเลือกเสริมในหน้านี้ใช้ Web Crypto API ที่มีอยู่ในเบราว์เซอร์ของคุณ การถอดรหัสและการตรวจสอบเกิดขึ้นบนอุปกรณ์ของคุณ และไม่มีการอัปโหลดข้อมูลใด ๆ โดยหลักทั่วไปแล้ว อย่าวางคีย์ลงนามของระบบจริง (production) หรือโทเค็นที่ยังใช้งานอยู่ลงในเว็บไซต์ที่คุณไม่ไว้วางใจ

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

วาง JWT ลงในตัวถอดรหัสนี้ปลอดภัยหรือไม่

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

ถอดรหัส JWT โดยไม่มีคีย์ลับได้หรือไม่

ได้ ส่วนหัวและเพย์โหลดเป็นเพียง JSON ที่เข้ารหัสแบบ Base64URL จึงอ่านได้โดยไม่ต้องใช้คีย์ใด ๆ คีย์ลับหรือคีย์สาธารณะจำเป็นเฉพาะเมื่อต้องการตรวจสอบลายเซ็นเท่านั้น

ทำไมตัวถอดรหัสจึงแจ้งว่าโทเค็นหมดอายุแล้ว
ค่า exp ของโทเค็นอยู่ก่อนเวลาปัจจุบันบนอุปกรณ์ของคุณ หากโทเค็นควรยังใช้ได้อยู่ ให้ตรวจสอบนาฬิกาของระบบและอายุของโทเค็นที่ผู้ออกโทเค็นกำหนดไว้
ตรวจสอบลายเซ็นของอัลกอริทึมใดได้บ้าง

HS256, HS384 และ HS512 ด้วยคีย์ลับที่ใช้ร่วมกัน รวมถึง RS256, RS384, RS512, PS256, PS384, PS512, ES256, ES384 และ ES512 ด้วยคีย์สาธารณะในรูปแบบ PEM

"alg": "none" หมายความว่าอะไร

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