เครื่องมือถอดรหัส JWT
ถอดรหัส JSON Web Token ใด ๆ เพื่อตรวจสอบ header, payload และ claim ในรูปแบบที่อ่านง่าย — และเลือกตรวจสอบลายเซ็น HMAC (HS256/384/512) ได้ตามต้องการ ทุกอย่างทำงานภายในเบราว์เซอร์ของคุณ
วิธีใช้ เครื่องมือถอดรหัส JWT
- 1
วางโทเค็นของคุณ
วาง JSON Web Token ที่เข้ารหัสแล้วลงในช่องป้อนข้อมูล ตัวถอดรหัสจะแยกมันออกเป็น header, payload และลายเซ็นให้โดยอัตโนมัติ
- 2
อ่านค่า claim
ตรวจสอบ header และ payload ที่ถอดรหัสแล้วในรูปแบบ JSON ที่จัดรูปสวยงาม และดู claim ที่ลงทะเบียนไว้ เช่น เวลาหมดอายุและเวลาที่ออกโทเค็น ซึ่งแสดงเป็นวันที่ที่อ่านง่าย
- 3
ตรวจสอบลายเซ็น
สำหรับโทเค็น HMAC ให้ป้อน secret สำหรับเซ็นเพื่อยืนยันว่าลายเซ็นถูกต้องและโทเค็นไม่ถูกแก้ไขดัดแปลง
- 4
คัดลอกสิ่งที่คุณต้องการ
คัดลอก JSON ของ header หรือ payload ที่จัดรูปแล้วไปยังคลิปบอร์ดเพื่อนำไปใช้ในการทดสอบ การเขียนเอกสาร หรือการดีบัก
ทำความเข้าใจ JSON Web Token: โครงสร้าง claim และข้อควรระวัง
สามส่วนคั่นด้วยจุด
JSON Web Token คือสตริงยาวสตริงเดียวที่มีจุดสองจุดอยู่ภายใน ซึ่งแบ่งมันออกเป็นสามส่วน ได้แก่ header, payload และลายเซ็น สองส่วนแรกแต่ละส่วนเป็นอ็อบเจ็กต์ JSON ขนาดเล็กที่ถูกเข้ารหัสแบบ Base64URL ซึ่งเป็น Base64 เวอร์ชันที่ปลอดภัยสำหรับ URL โดยสลับอักขระสองสามตัวและตัดส่วน padding ออก เพื่อให้โทเค็นเดินทางผ่าน header และ query string ได้อย่างราบรื่น ส่วนที่สามคือลายเซ็น ซึ่งคำนวณจากสองส่วนแรก
เมื่อคุณวางโทเค็นลงไป ตัวถอดรหัสจะแยกมันตรงจุดและถอดรหัส Base64URL สองส่วนแรกกลับมาเป็น JSON ที่อ่านได้ คุณจะเห็น header และ payload ตรงตามที่ผู้ออกโทเค็นเขียนไว้ทุกประการ และเหตุผลที่ทำเช่นนี้ได้เลยคือหัวใจของทุกอย่างที่จะตามมา นั่นคือส่วนเหล่านั้นเพียงแค่ถูกเข้ารหัสเท่านั้น ไม่ได้ถูกเข้ารหัสลับ
Header: อัลกอริทึมและประเภท
Header เป็นส่วนที่เล็กที่สุด โดยทั่วไปมันจะประกาศประเภท — JWT — และที่สำคัญกว่านั้นคืออัลกอริทึมสำหรับเซ็นในฟิลด์ alg ค่าที่พบบ่อยคือ HS256 ซึ่งใช้ HMAC กับ secret ที่ใช้ร่วมกัน และ RS256 หรือ ES256 ซึ่งใช้คู่กุญแจแบบอสมมาตรที่กุญแจส่วนตัวเป็นผู้เซ็นและกุญแจสาธารณะเป็นผู้ตรวจสอบ อัลกอริทึมนี้บอกผู้ตรวจสอบว่าลายเซ็นถูกสร้างขึ้นมาอย่างไร และจึงรู้ว่าจะตรวจสอบมันอย่างไร
ฟิลด์ alg ยังเกี่ยวข้องกับความปลอดภัยด้วย โทเค็นที่อ้างอัลกอริทึมเป็น none หรือผู้โจมตีที่สลับโทเค็นจากอัลกอริทึมแบบอสมมาตรไปเป็นแบบสมมาตรเพื่อหลอกให้ผู้ตรวจสอบที่ไม่รอบคอบใช้กุญแจสาธารณะเป็น secret ของ HMAC ล้วนเป็นการโจมตีในรูปแบบคลาสสิก ผู้ตรวจสอบที่ทำงานถูกต้องจะตรึงอัลกอริทึมที่คาดหวังไว้ แทนที่จะเชื่อตามที่ header ระบุอย่างไม่ลืมหูลืมตา
Payload และ claim ที่ลงทะเบียนไว้
Payload เป็นที่บรรจุ claim ซึ่งคือข้อความที่โทเค็นกล่าวอ้าง มีชุดชื่อ claim ที่ลงทะเบียนไว้ซึ่งถูกกำหนดเป็นมาตรฐาน เพื่อให้ระบบต่าง ๆ เข้าใจความหมายของมันตรงกัน claim ผู้ออก (iss) ระบุว่าใครเป็นผู้สร้างโทเค็น claim ผู้ถือ (sub) ระบุว่าโทเค็นเกี่ยวกับใครหรือสิ่งใด (มักเป็น ID ผู้ใช้) และ claim ผู้รับ (aud) ระบุผู้รับที่ตั้งใจไว้ นอกเหนือจากนี้ คุณมักจะพบ claim เฉพาะของแอปพลิเคชัน เช่น บทบาทหรือ tenant
ตัวถอดรหัสนี้นำ claim ที่ลงทะเบียนไว้มาแสดงในรูปแบบที่มีป้ายกำกับและอ่านง่ายสำหรับคน คุณจึงไม่ต้องจดจำชื่อย่อที่เข้าใจยากเหล่านั้นให้ขึ้นใจ การได้เห็นผู้ออก ผู้ถือ และผู้รับสะกดออกมาชัดเจน มักเป็นทั้งหมดที่คุณต้องการเมื่อกำลังตรวจดูโทเค็นด้วยตาเปล่าระหว่างการดีบัก เพื่อยืนยันว่ามันเป็นโทเค็นที่ถูกต้องสำหรับบริการที่ถูกต้อง
claim เกี่ยวกับเวลา: exp, iat และ nbf
มี claim สามตัวที่ควบคุมอายุของโทเค็น และทั้งหมดเป็น Unix timestamp ที่วัดเป็นวินาที — ไม่ใช่มิลลิวินาที ซึ่งเป็นบั๊กคลาดเคลื่อนพันเท่าที่เกิดขึ้นบ่อยสำหรับนักพัฒนา JavaScript ที่คุ้นเคยกับเวลาในหน่วยมิลลิวินาที claim เวลาหมดอายุ (exp) คือช่วงเวลาที่หลังจากนั้นโทเค็นต้องถูกปฏิเสธ claim เวลาที่ออก (iat) บันทึกว่าโทเค็นถูกสร้างเมื่อใด และ claim เริ่มใช้ได้ (nbf) ระบุช่วงเวลาแรกสุดที่โทเค็นเริ่มใช้งานได้
ตัวถอดรหัสจะแปลงค่าเหล่านี้เป็นวันที่ที่อ่านง่าย และบอกคุณว่าโทเค็นกำลังใช้งานได้ ยังไม่เริ่มใช้งาน หรือหมดอายุแล้ว ตามนาฬิกาของอุปกรณ์คุณ รายละเอียดข้อสุดท้ายนี้สำคัญ หากนาฬิกาของคอมพิวเตอร์คุณผิด คำตัดสินว่าใช้งานได้หรือหมดอายุก็อาจชวนให้เข้าใจผิด และในระบบ production การที่นาฬิกาของเซิร์ฟเวอร์คลาดเคลื่อนกันก็เป็นสาเหตุที่พบบ่อยที่ทำให้โทเค็นที่เพิ่งออกใหม่ถูกปฏิเสธว่ายังไม่เริ่มใช้งาน
การถอดรหัสไม่ใช่การตรวจสอบ
นี่คือสิ่งสำคัญที่สุดเพียงสิ่งเดียวที่ต้องเข้าใจให้ขึ้นใจ ใคร ๆ ก็ถอดรหัส JWT ได้ — เพราะมันเป็นเพียง Base64URL — ดังนั้นการอ่าน claim บอกคุณเพียงว่าโทเค็นกล่าวอะไร ไม่ได้บอกว่าโทเค็นนั้นเป็นของแท้หรือไม่ ความเชื่อถือเกิดขึ้นได้จากการตรวจสอบลายเซ็นเทียบกับกุญแจเท่านั้น ซึ่งพิสูจน์ว่าโทเค็นถูกออกโดยฝ่ายที่ถือ secret หรือกุญแจส่วนตัว และไม่ถูกแก้ไขนับตั้งแต่นั้น
สำหรับโทเค็น HMAC (HS256, HS384, HS512) เครื่องมือนี้สามารถคำนวณลายเซ็นใหม่จาก header, payload และ secret ที่คุณป้อน แล้วนำไปเปรียบเทียบกับลายเซ็นของโทเค็น เพื่อยืนยันความเป็นของแท้สำหรับ secret นั้น ส่วนอัลกอริทึมแบบอสมมาตรอย่าง RS256 และ ES256 ต้องใช้กุญแจสาธารณะของผู้ออก จึงถูกถอดรหัสแต่ไม่ได้ตรวจสอบที่นี่ ที่สำคัญยิ่งคือ การตัดสินใจให้สิทธิ์ที่แท้จริงต้องตรวจสอบลายเซ็นฝั่งเซิร์ฟเวอร์ อย่าเชื่อ claim ของโทเค็นเพียงเพราะถอดรหัสมาได้ในโค้ดฝั่งไคลเอนต์เด็ดขาด
Payload ไม่ใช่ความลับ
เนื่องจาก payload เพียงแค่ถูกเข้ารหัส claim ทุกตัวภายในจึงมองเห็นได้อย่างชัดเจนโดยใครก็ตามที่ได้โทเค็นไป ไม่ว่าจะเป็นเบราว์เซอร์ พร็อกซีใด ๆ หรือผู้ใช้เอง JWT เป็นที่ที่เหมาะอย่างยิ่งสำหรับข้อมูลตัวตนและการให้สิทธิ์ที่ไม่ใช่ความลับ และเป็นที่ที่แย่อย่างยิ่งสำหรับสิ่งใดก็ตามที่เป็นความลับ อย่าใส่รหัสผ่าน secret ของ API หมายเลขบัตรเครดิต หรือข้อมูลส่วนบุคคลที่เป็นความลับไว้ใน payload โดยคิดว่าการเข้ารหัสจะปกป้องมันได้ มันปกป้องไม่ได้
ลายเซ็นปกป้องความครบถ้วนสมบูรณ์ ไม่ใช่ความลับ มันป้องกันการแก้ไขดัดแปลง แต่ไม่ได้ทำอะไรเพื่อซ่อนเนื้อหา หากคุณจำเป็นต้องใช้โทเค็นที่เข้ารหัสลับซึ่ง payload อ่านไม่ได้จริง ๆ นั่นเป็นโครงสร้างที่ต่างออกไปและหนักกว่า (JWE) — JWT มาตรฐานนั้นถูกเซ็น ไม่ได้ถูกเข้ารหัสลับ จงเก็บความลับไว้บนเซิร์ฟเวอร์ และอ้างอิงถึงมันด้วยตัวระบุที่ไม่เปิดเผยความหมายในโทเค็นแทน
การดีบักโทเค็นอย่างปลอดภัย
ในงานประจำวัน ตัวถอดรหัสโดดเด่นมากสำหรับการดีบักกระบวนการยืนยันตัวตน ทั้งการยืนยันว่าผู้ใช้ที่ถูกต้องอยู่ใน claim ผู้ถือ การตรวจสอบว่าผู้รับตรงกับบริการที่กำลังปฏิเสธคำขอ การยืนยันว่ามี scope หรือบทบาทอยู่ครบ และการอ่านเวลาหมดอายุเพื่อดูว่า 401 นั้นเป็นเพียงเพราะโทเค็นเก่าหรือไม่ การคัดลอก header หรือ payload ที่จัดรูปแล้วลงในรายงานบั๊กหรือ test fixture ก็ทำได้ในคลิกเดียว
ทุกอย่างเกิดขึ้นภายในเบราว์เซอร์ของคุณ — โทเค็นและ secret ใด ๆ ที่คุณพิมพ์จะไม่ถูกอัปโหลด บันทึก หรือจัดเก็บ — จึงปลอดภัยที่จะตรวจดูโทเค็นจากระบบ production จริง ถึงกระนั้น จงปฏิบัติต่อโทเค็นเสมือนเป็นข้อมูลรับรองตัวตนตามที่มันเป็น โทเค็นที่ใช้งานได้และยังไม่หมดอายุคือกุญแจที่ใช้งานได้จริงของบัญชีหนึ่ง ดังนั้นจงหลีกเลี่ยงการวางมันลงในเครื่องมือที่ไม่น่าเชื่อถือ และควรใช้โทเค็นที่หมดอายุแล้วหรือโทเค็นทดสอบเมื่อต้องการแบ่งปันเป็นตัวอย่าง
คำถามที่พบบ่อย
JSON Web Token (JWT) คืออะไร
การถอดรหัส JWT จะเปิดเผยรหัสผ่านหรือ secret หรือไม่
การตรวจสอบลายเซ็นที่นี่ทำงานอย่างไร
claim exp และ iat หมายความว่าอย่างไร
โทเค็นของฉันถูกส่งไปยังเซิร์ฟเวอร์หรือไม่
เครื่องมือที่เกี่ยวข้อง
ทำงานต่อด้วยเครื่องมือที่มีประโยชน์เหล่านี้