ตัวถอดรหัส JWT
วาง JWT (สามส่วนที่เข้ารหัสแบบ base64url คั่นด้วยจุด) แล้วตัวถอดรหัสจะแสดง header, payload และ signature, ถอดรหัสและจัดรูปแบบให้สวยงาม, พร้อมอัลกอริทึมที่ตรวจพบ วันหมดอายุของโทเค็นในเวลาท้องถิ่นของคุณ และว่า nbf (not-before), iat (issued-at) และ exp (expiry) สอดคล้องกันหรือไม่ มีตัวเลือกยืนยัน signature หากคุณมี secret หรือ public key
วิธีถอดรหัส JWT
-
1
วางโทเค็น
สตริง base64url สามตัวคั่นด้วย `.` (header.payload.signature)
-
2
อ่าน header ที่ถอดรหัสแล้ว
อัลกอริทึม ชนิด key ID (`kid`) อัลกอริทึมบอกคุณว่าต้องใช้ชนิดคีย์ใดสำหรับการยืนยัน
-
3
อ่าน payload
claim มาตรฐาน (`iss`, `sub`, `aud`, `exp`, `iat`, `nbf`, `jti`) พร้อม claim ที่กำหนดเองใดก็ตามที่แอปพลิเคชันของคุณออก
-
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 แบบสุ่ม เลือกจำนวน ตัวพิมพ์ใหญ่ ตัวพิมพ์เล็ก หรือแบบผสม แล้วใช้กับเกม โจทย์ หรือกิจกรรมในห้องเรียน
เครื่องมือนี้มีให้บริการในภาษาอื่น
- JWT-avkodare [SV]
- مُفكّك JWT [AR]
- JWT-Dekoder [DE]
- Decodificador JWT [ES]
- Décodeur JWT [FR]
- Decoder JWT [ID]
- JWT 해독기 [KO]
- JWT-decoder [NL]
- Dekoder JWT [PL]
- Mã giải mã JWT [VI]
- JWTデコーダ [JA]
- Decodificador JWT [PT]
- JWT Decoder [EN]
- Decoder JWT [IT]
- Декодировщик JWT [RU]
- JWT Dekoderi [TR]
- JWT 解码器 [ZH]