ตัวถอดรหัส 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/ES512 |
ECDSA public key |
PS256/PS384/PS512 |
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
เครื่องมือที่เกี่ยวข้อง
ตัวสร้างการตั้งค่า Webpack
สร้างไฟล์ webpack.config.js สำหรับ webpack 5 จากแบบฟอร์มสั้นๆ ตั้งค่า entry, โฟลเดอร์ output และ mode จากนั้นเปิด TypeScript, Babel, CSS loader, HtmlWebpackPlugin และ dev server
ตัวแปลง Timestamp
แปลง timestamp ของ Unix ในหน่วยวินาทีหรือมิลลิวินาทีเป็นวันที่ที่อ่านง่ายในเขตเวลา UTC และเขตเวลาหลัก และแปลงวันที่กลับเป็นค่า epoch
เครื่องสุ่มที่อยู่
สร้างระเบียนคล้ายที่อยู่ 1–20 รายการสำหรับแบบจำลองและการทดสอบ ด้วยรูปแบบประเทศแบบย่อ
ตารางอ้างอิง ASCII
ตาราง ASCII ครบตั้งแต่ 0 ถึง 127 พร้อมค่าเลขฐานสิบ ฐานสิบหก ฐานแปด ฐานสอง และรูปแบบการอ้างอิงอักขระแบบตัวเลขของ HTML รวม NUL, LF และ DEL
ตัวลดรูปพีชคณิตบูลีน
ประเมินนิพจน์บูลีนสำหรับทุกชุดอินพุตและดูตารางค่าความจริงที่สมบูรณ์ รองรับตัวแปรสูงสุดห้าตัวและตัวดำเนินการ &, |, !, ^
ตัวสร้างลูกศร CSS
สร้างลูกศร CSS ในเบราว์เซอร์ด้วยทิศทาง สี ขนาด และความหนาของเส้นขอบ แล้วคัดลอกกฎ.
เครื่องมือนี้มีให้บริการในภาษาอื่น
- Decoder JWT [ID]
- Dekoder JWT [PL]
- Decodificador JWT [ES]
- JWT-Dekoder [DE]
- JWTデコーダ [JA]
- JWT-avkodare [SV]
- Décodeur JWT [FR]
- JWT-decoder [NL]
- Decodificador JWT [PT]
- JWT 해독기 [KO]
- Mã giải mã JWT [VI]
- مُفكّك JWT [AR]
- JWT Decoder [EN]
- Decoder JWT [IT]
- Декодировщик JWT [RU]
- JWT Dekoderi [TR]
- JWT 解码器 [ZH]