วิธีใช้งาน
- วางโทเค็นทั้งหมด ซึ่งประกอบด้วยส่วน Base64URL สามส่วนที่คั่นด้วยจุด
- อ่านส่วนหัวและเพย์โหลดที่ถอดรหัสแล้ว ข้อมูลอ้างสิทธิ์ exp, iat และ nbf จะแสดงเป็นวันที่ พร้อมคำเตือนเมื่อโทเค็นหมดอายุแล้วหรือยังไม่มีผล
- หากต้องการตรวจสอบลายเซ็น ให้ป้อนคีย์ลับที่ใช้ร่วมกันสำหรับ HS256, HS384 หรือ HS512 หรือวางคีย์สาธารณะแบบ PEM สำหรับอัลกอริทึมตระกูล RS, PS หรือ ES
- ตรวจสอบว่าข้อมูลอ้างสิทธิ์ผู้ออก (issuer) ผู้รับ (audience) และหัวเรื่อง (subject) ตรงกับที่แอปพลิเคชันของคุณคาดไว้
โครงสร้างของ JWT
JSON Web Token (RFC 7519) ประกอบด้วยสามส่วนที่คั่นด้วยจุด: header.payload.signature ส่วนหัวและเพย์โหลดเป็นออบเจ็กต์ JSON ที่เข้ารหัสเป็น Base64URL แบบไม่มีแพดดิง โทเค็นเกือบทั้งหมดจึงขึ้นต้นด้วย eyJ ซึ่งคือ {" ที่เปิดออบเจ็กต์หลังจากเข้ารหัสแล้ว ลายเซ็นคำนวณจากสองส่วนแรกตามที่ปรากฏในโทเค็นทุกตัวอักษร
- ส่วนหัว: อัลกอริทึมที่ใช้ลงนามใน
algโดยทั่วไปมี"typ": "JWT"และมักมีkidที่ระบุคีย์ - เพย์โหลด: ข้อมูลอ้างสิทธิ์ต่าง ๆ เช่น ผู้ใช้คือใคร ใครเป็นผู้ออกโทเค็น และโทเค็นหมดอายุเมื่อใด
- ลายเซ็น: ลายเซ็นแบบ HMAC, RSA หรือ ECDSA ที่พิสูจน์ว่าส่วนหัวและเพย์โหลดไม่ได้ถูกแก้ไข
โทเค็นที่มีห้าส่วนคือ JWE ที่เข้ารหัสลับไว้ ไม่สามารถอ่านเนื้อหาได้หากไม่มีคีย์สำหรับถอดรหัส
ข้อมูลอ้างสิทธิ์ที่ลงทะเบียนไว้
| ข้อมูลอ้างสิทธิ์ | ชื่อ | ความหมาย |
|---|---|---|
iss | ผู้ออก (Issuer) | ผู้ที่สร้างและลงนามโทเค็น |
sub | หัวเรื่อง (Subject) | ผู้ที่โทเค็นนี้อ้างถึง โดยทั่วไปคือ ID ผู้ใช้ |
aud | ผู้รับ (Audience) | บริการที่โทเค็นนี้มีไว้ใช้งานด้วย |
exp | เวลาหมดอายุ (Expiration time) | หลังจากเวลานี้ต้องปฏิเสธโทเค็น |
nbf | ใช้ได้ตั้งแต่ (Not before) | ก่อนเวลานี้ต้องปฏิเสธโทเค็น |
iat | ออกให้เมื่อ (Issued at) | เวลาที่สร้างโทเค็น |
jti | JWT ID | ตัวระบุที่ไม่ซ้ำกัน ใช้ตรวจจับการนำโทเค็นมาใช้ซ้ำ (replay) |
เวลาเป็นค่าแบบ NumericDate คือจำนวนวินาทีนับตั้งแต่ 1 มกราคม 1970 UTC ไม่ใช่มิลลิวินาที ตัวถอดรหัสจะแสดงเวลาเหล่านี้เป็นวันที่ที่อ่านง่าย และเปรียบเทียบกับนาฬิกาของอุปกรณ์คุณ
การถอดรหัสไม่ใช่การตรวจสอบ
ใครก็ถอดรหัส JWT ได้ เพราะเพย์โหลดเป็นเพียงข้อมูลที่เข้ารหัส (encode) ไว้ ไม่ได้เข้ารหัสลับ (encrypt) อย่าใส่รหัสผ่านหรือข้อมูลลับอื่น ๆ ไว้ในเพย์โหลด ความน่าเชื่อถือมาจากการตรวจสอบลายเซ็นด้วยคีย์ที่ถูกต้องเท่านั้น และเซิร์ฟเวอร์ที่รับโทเค็นควร:
- อนุญาตเฉพาะอัลกอริทึมที่คาดไว้ และปฏิเสธ
"alg": "none"ซึ่งระบุว่าเป็นโทเค็นที่ไม่มีลายเซ็น - ไม่ปล่อยให้ส่วนหัวของโทเค็นเป็นตัวเลือกว่าจะใช้ HMAC หรือ RSA มิฉะนั้นผู้โจมตีอาจลงนามโทเค็นปลอมโดยนำคีย์สาธารณะของคุณมาใช้เป็นคีย์ลับของ HMAC
- ตรวจสอบ
exp,nbf,issและaudในทุกคำขอ
การตรวจสอบลายเซ็นซึ่งเป็นตัวเลือกเสริมในหน้านี้ใช้ Web Crypto API ที่มีอยู่ในเบราว์เซอร์ของคุณ การถอดรหัสและการตรวจสอบเกิดขึ้นบนอุปกรณ์ของคุณ และไม่มีการอัปโหลดข้อมูลใด ๆ โดยหลักทั่วไปแล้ว อย่าวางคีย์ลงนามของระบบจริง (production) หรือโทเค็นที่ยังใช้งานอยู่ลงในเว็บไซต์ที่คุณไม่ไว้วางใจ
คำถามที่พบบ่อย
วาง JWT ลงในตัวถอดรหัสนี้ปลอดภัยหรือไม่
โทเค็นจะถูกถอดรหัสและตรวจสอบด้วย JavaScript ในเบราว์เซอร์ของคุณ และไม่ถูกส่งไปยังเซิร์ฟเวอร์ใด ๆ อย่างไรก็ตาม โทเค็นที่ยังไม่หมดอายุใช้งานได้เหมือนรหัสผ่านสำหรับผู้ที่ถือโทเค็นนั้น เมื่อแชร์ภาพหน้าจอหรือไฟล์บันทึก จึงควรใช้โทเค็นสำหรับทดสอบหรือโทเค็นที่หมดอายุแล้ว
ถอดรหัส JWT โดยไม่มีคีย์ลับได้หรือไม่
ได้ ส่วนหัวและเพย์โหลดเป็นเพียง JSON ที่เข้ารหัสแบบ Base64URL จึงอ่านได้โดยไม่ต้องใช้คีย์ใด ๆ คีย์ลับหรือคีย์สาธารณะจำเป็นเฉพาะเมื่อต้องการตรวจสอบลายเซ็นเท่านั้น
ทำไมตัวถอดรหัสจึงแจ้งว่าโทเค็นหมดอายุแล้ว
exp ของโทเค็นอยู่ก่อนเวลาปัจจุบันบนอุปกรณ์ของคุณ หากโทเค็นควรยังใช้ได้อยู่ ให้ตรวจสอบนาฬิกาของระบบและอายุของโทเค็นที่ผู้ออกโทเค็นกำหนดไว้ตรวจสอบลายเซ็นของอัลกอริทึมใดได้บ้าง
HS256, HS384 และ HS512 ด้วยคีย์ลับที่ใช้ร่วมกัน รวมถึง RS256, RS384, RS512, PS256, PS384, PS512, ES256, ES384 และ ES512 ด้วยคีย์สาธารณะในรูปแบบ PEM
"alg": "none" หมายความว่าอะไร
หมายถึง JWT ที่ไม่มีการรักษาความปลอดภัยและมีลายเซ็นว่างเปล่า ตามที่กำหนดไว้ใน RFC 7518 ใครก็สร้างหรือแก้ไขโทเค็นแบบนี้ได้ เซิร์ฟเวอร์ที่คาดหวังโทเค็นที่มีลายเซ็นจึงต้องปฏิเสธโทเค็นนี้ทุกครั้ง