เครื่องมือนี้ทำอะไร
JSON Web Token (JWT, RFC 7519) คือสตริงขนาดกะทัดรัดที่ปลอดภัยสำหรับ URL มีสามส่วนคั่นด้วยจุด ได้แก่ header ที่ระบุอัลกอริทึมการลงนาม payload ที่เก็บ claim และลายเซ็นของสองส่วนแรก API ใช้ JWT เป็น bearer token และผู้ให้บริการยืนยันตัวตนใช้เป็น ID token
เครื่องมือนี้สร้างและลงนามโทเค็นจาก payload JSON รองรับ:
- HS256, HS384, HS512: HMAC ด้วย secret ร่วม เป็นข้อความหรือ Base64
- RS256, RS384, RS512 และ PS256, PS384, PS512: ลายเซ็น RSA ด้วยคีย์ส่วนตัว PEM
- ES256, ES384, ES512: ลายเซ็น ECDSA ด้วยคีย์ส่วนตัว EC
วิธีใช้
- เขียน payload เป็นออบเจกต์ JSON หรือคลิก ตัวอย่าง
- เลือก อัลกอริทึม แล้วพิมพ์ secret หรือวางคีย์ส่วนตัว PEM ที่ด้านบนของช่องอินพุต
- หากต้องการ ตั้ง iat เป็นเวลาปัจจุบัน เพิ่มวันหมดอายุ (exp) หรือฟิลด์ header เพิ่มเติม เช่น key ID
- คัดลอกโทเค็นจากเอาต์พุต แล้ววางในตัวถอดรหัส JWT เพื่อตรวจดู
ตัวอย่าง
เมื่อ secret คือ your-256-bit-secret payload ด้านล่างที่ลงนามด้วย HS256 จะได้โทเค็นตัวอย่างที่คุ้นเคยจาก jwt.io:
{"sub":"1234567890","name":"John Doe","iat":1516239022}
header จะถูกเขียนเป็น {"alg":"HS256","typ":"JWT"} เสมอ ตามด้วยฟิลด์ที่คุณเพิ่ม และ alg จะตรงกับอัลกอริทึมที่เลือกเสมอ
แนวปฏิบัติที่ดี
ทำให้โทเค็นมีอายุสั้นด้วย claim exp และตั้ง iss กับ aud เพื่อไม่ให้โทเค็นของบริการหนึ่งถูกนำไปใช้ซ้ำกับอีกบริการ ฝั่งเซิร์ฟเวอร์ต้องตรวจลายเซ็นโดยระบุรายการอัลกอริทึมที่อนุญาตอย่างชัดเจนและปฏิเสธ none เสมอ secret ของ HMAC ควรยาวและสุ่ม อย่างน้อยเท่ากับความยาวผลแฮช (32 ไบต์สำหรับ HS256)
คำถามที่พบบ่อย
› ควรเลือกอัลกอริทึมไหน
เลือกแบบที่เซิร์ฟเวอร์ของคุณใช้ตรวจสอบ HS256 ใช้ secret ร่วมกันและพบบ่อยภายในระบบเดียว RS256 และ ES256 ลงนามด้วยคีย์ส่วนตัวและใครก็ตรวจสอบได้ด้วยคีย์สาธารณะ เหมาะกับโทเค็นที่หลายบริการต้องตรวจ ลายเซ็น ES256 สั้นกว่า RS256 มาก
› รองรับคีย์ส่วนตัวรูปแบบใดบ้าง
คีย์ PEM แบบ PKCS#8 (BEGIN PRIVATE KEY), PKCS#1 RSA (BEGIN RSA PRIVATE KEY) และ SEC1 EC (BEGIN EC PRIVATE KEY) คีย์ที่เข้ารหัสไว้ต้องส่งออกแบบไม่มีรหัสผ่านก่อน สำหรับ ES256, ES384 และ ES512 คีย์ต้องอยู่บนเส้นโค้ง P-256, P-384 หรือ P-521 ตามลำดับ
› payload ของ JWT เป็นความลับหรือไม่
ไม่ header และ payload ถูกเข้ารหัสแบบ Base64URL เท่านั้น ใครที่มีโทเค็นก็อ่านได้ ลายเซ็นป้องกันการแก้ไข ไม่ได้ป้องกันการอ่าน อย่าใส่รหัสผ่านหรือข้อมูลลับอื่นใน payload ของ JWT
› secret หรือคีย์ส่วนตัวของฉันถูกบันทึกหรือส่งไปที่ไหนหรือไม่
ไม่ การลงนามทำในเบราว์เซอร์ด้วย Web Crypto API secret หรือคีย์อยู่ในหน่วยความจำของหน้านี้เท่านั้น ไม่ถูกบันทึก ไม่ถูกเขียนลงแถบที่อยู่ และไม่รวมในลิงก์แชร์ แต่ก็ไม่ควรวางคีย์ของระบบจริงในหน้าเว็บที่คุณไม่ได้ควบคุม