ตัวถอดรหัส JWT

วาง JWT (สามส่วนที่เข้ารหัสแบบ base64url คั่นด้วยจุด) แล้วตัวถอดรหัสจะแสดง header, payload และ signature, ถอดรหัสและจัดรูปแบบให้สวยงาม, พร้อมอัลกอริทึมที่ตรวจพบ วันหมดอายุของโทเค็นในเวลาท้องถิ่นของคุณ และว่า nbf (not-before), iat (issued-at) และ exp (expiry) สอดคล้องกันหรือไม่ มีตัวเลือกยืนยัน signature หากคุณมี secret หรือ public key

วิธีถอดรหัส JWT

  1. 1

    วางโทเค็น

    สตริง base64url สามตัวคั่นด้วย `.` (header.payload.signature)

  2. 2

    อ่าน header ที่ถอดรหัสแล้ว

    อัลกอริทึม ชนิด key ID (`kid`) อัลกอริทึมบอกคุณว่าต้องใช้ชนิดคีย์ใดสำหรับการยืนยัน

  3. 3

    อ่าน payload

    claim มาตรฐาน (`iss`, `sub`, `aud`, `exp`, `iat`, `nbf`, `jti`) พร้อม claim ที่กำหนดเองใดก็ตามที่แอปพลิเคชันของคุณออก

  4. 4

    ยืนยัน (ตัวเลือก)

    ให้ HMAC secret (สำหรับ HS256/384/512) หรือ public key (สำหรับ RS256, ES256 ฯลฯ) เพื่อยืนยันว่า signature ถูกต้อง

กายวิภาคของ JWT

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFsaWNlIiwiaWF0IjoxNjAwMDAwMDAwfQ
.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

แต่ละส่วนเข้ารหัสแบบ base64url (ไม่ใช่ base64 มาตรฐาน) header เป็น JSON เช่น {"alg":"HS256","typ":"JWT"} payload เป็น JSON เช่น {"sub":"1234567890","name":"Alice","iat":1600000000} และ signature คือ HMAC หรือ RSA signature ของ header.payload

claim มาตรฐาน (RFC 7519)

Claim ชื่อ หมายเหตุ
iss ผู้ออก ใครเป็นผู้สร้างโทเค็น
sub หัวข้อ โทเค็นเกี่ยวกับใคร
aud ผู้รับ โทเค็นมีไว้สำหรับใคร
exp เวลาหมดอายุ Unix timestamp ถูกปฏิเสธหลังจากเวลานี้
nbf ไม่ก่อนเวลา Unix timestamp ถูกปฏิเสธก่อนเวลานี้
iat ออกเมื่อ Unix timestamp ของการสร้างโทเค็น
jti JWT ID ตัวระบุที่ไม่ซ้ำสำหรับรายการเพิกถอน

อัลกอริทึมที่รองรับ

ค่า alg ชนิดคีย์
HS256/HS384/HS512 HMAC secret ที่แชร์ร่วมกัน
RS256/RS384/RS512 RSA public key
ES256/ES384 ECDSA public key
PS256/PS384 RSA-PSS public key
EdDSA / Ed25519 Edwards curve
none อย่าเชื่อค่านี้เด็ดขาด, โทเค็นที่ไม่ได้ลงนาม

กับดัก alg: none

ไลบรารี JWT ยุคแรกอนุญาตโทเค็น "alg": "none" และยอมรับว่าถูกต้องอย่างไร้เดียงสา ให้ทำเสมอ:

  • กำหนด whitelist อัลกอริทึมที่แอปพลิเคชันของคุณยอมรับ
  • ปฏิเสธ alg: none โดยไม่มีเงื่อนไข
  • ปฏิเสธ alg: HS256 เมื่อโค้ดยืนยันของคุณคาดหวัง RS256 (การโจมตีแบบ “algorithm confusion”)

JWT ไม่ใช่อะไร

  • ไม่ได้เข้ารหัส header และ payload เข้ารหัสแบบ base64 ซึ่งถอดได้ง่ายมาก อย่าใส่ secret ใน JWT โดยไม่ห่อด้วย JWE
  • ไม่สามารถเพิกถอนได้โดยค่าเริ่มต้น เมื่อออกแล้ว JWT จะใช้ได้จนถึง exp สำหรับการเพิกถอนคุณต้องมี blacklist หรือวันหมดอายุสั้น + refresh token
  • ไม่ใช่ตัวแทน session cookie ในทุกกรณีการใช้งาน opaque token ที่เก็บฝั่งเซิร์ฟเวอร์มักเรียบง่ายและปลอดภัยกว่า

ข้อผิดพลาดที่พบบ่อย

  • เชื่อ header kid และ alg มาจากตัวโทเค็นเอง เซิร์ฟเวอร์ที่ถูกบุกรุกสามารถตั้งค่าได้ตามใจ ให้ตรวจสอบกับรายการที่กำหนดไว้เสมอ
  • เพิกเฉยต่อความคลาดเคลื่อนของ nbf และ iat การคลาดเคลื่อนของนาฬิกาหมายความว่า iat > now อาจเกิดขึ้นได้ ให้เผื่อเวลาเล็กน้อย (30-60s)
  • บันทึก JWT ทั้งหมด payload มักมี user ID อีเมล สิทธิ์, PII ที่ไม่ควรไปจบลงใน stdout
  • ใช้ HS256 กับ secret ที่อ่อนแอ secret 16 อักขระสามารถถูกเดาแบบ brute-force ได้ในไม่กี่นาที ใช้เอนโทรปีสุ่มอย่างน้อย 256 บิต

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

ไม่ การถอดรหัสทำงานในเบราว์เซอร์ของคุณ โทเค็นยังคงอยู่ในเครื่อง, สำคัญเพราะ JWT มักมีข้อมูลเซสชัน user ID และสิทธิ์

ได้ หากคุณวาง HMAC secret ที่แชร์ร่วมกันหรือ public key ที่เข้ารหัสแบบ PEM การยืนยันจะเกิดขึ้นในเบราว์เซอร์ของคุณ คีย์ไม่เคยออกจากเครื่องของคุณ

หมายความว่าโทเค็นไม่ได้ลงนาม อย่ายอมรับโทเค็นเช่นนี้ใน production เด็ดขาด, สามารถปลอมแปลงได้ง่ายมาก มี CVE ระดับสูงหลายรายการที่เกี่ยวกับไลบรารีที่ยอมรับ alg: none โดยค่าเริ่มต้น

การลงนาม JWT พิสูจน์ความถูกต้องแท้จริง ไม่ใช่การรักษาความลับ header และ payload เข้ารหัสแบบ base64url ซึ่งย้อนกลับได้ สำหรับความลับ ให้ใช้ JWE (JSON Web Encryption) ห่อ JWT หรือหลีกเลี่ยงการใส่ข้อมูลที่ละเอียดอ่อนใน payload

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

ตารางอ้างอิง ASCII

ตาราง ASCII ครบตั้งแต่ 0 ถึง 127 พร้อมค่าเลขฐานสิบ ฐานสิบหก ฐานแปด ฐานสอง และรูปแบบการอ้างอิงอักขระแบบตัวเลขของ HTML รวม NUL, LF และ DEL

อ้างอิงตัวอักษร HTML

รายการที่สามารถค้นหาได้ขององค์ประกอบ HTML พร้อมรหัสชื่อและรหัสตัวเลข รวมถึงฟังก์ชันสำเนาด้วยคลิกเดียวสำหรับตัวอักษรพิเศษและสัญลักษณ์ต่างๆ

ตารางอ้างอิงแป้นพิมพ์ลัด

ค้นหาแป้นพิมพ์ลัดเริ่มต้นตามเอกสารของ VS Code, Chrome และ Bash ที่ใช้ GNU Readline บน macOS, Windows และ Linux

ตัวตรวจสอบอีเมล

ตรวจสอบที่อยู่อีเมล: ตรวจไวยากรณ์ RFC 5322 ค้นหา MX เรกคอร์ดแบบเรียลไทม์ พร้อมรายละเอียดส่วนท้องถิ่น โดเมน และความยาว ไม่มีการส่งอีเมลใด ๆ

เครื่องมือสร้าง EditorConfig

สร้างไฟล์ .editorconfig ด้วยกฎสไตล์และขนาดการเยื้อง การจบบรรทัด ชุดอักขระ และช่องว่างของคุณ เพื่อให้การจัดรูปแบบสอดคล้องกันในทุก IDE และโปรแกรมแก้ไข

เครื่องสร้างตัวอักษรสุ่ม

สร้างตัวอักษร A-Z แบบสุ่ม เลือกจำนวน ตัวพิมพ์ใหญ่ ตัวพิมพ์เล็ก หรือแบบผสม แล้วใช้กับเกม โจทย์ หรือกิจกรรมในห้องเรียน

เครื่องมือนี้มีให้บริการในภาษาอื่น