JWT คืออะไร? คำอธิบายที่สมบูรณ์ของโทเค็นเว็บ JSON
ตอบด่วน
JWT คือสตริงสามส่วน Base64URL encode คั่นจุด: header.payload.signature header ระบุ algorithm, payload มี claims (user ID, roles, expiration), signature พิสูจน์ความถูกต้อง ใช้ JWT Decoder ฟรีของเราเพื่อตรวจเนื้อหา token
การแนะนำ
JWT (JSON Web Token) เป็นรูปแบบ token กระชับ URL-safe กำหนดโดย RFC 7519 สำหรับส่งข้อมูลระหว่างฝ่ายอย่างปลอดภัยเป็น JSON object JWT ใช้ authentication ใน web app: หลัง login server ออก JWT ที่ client ส่งใน request ถัดไป JWT stateless —server ไม่ต้อง lookup token ในฐานข้อมูล; token มี claims และ signature
ทีละขั้นตอน
-
ทำความเข้าใจกับโครงสร้างสามส่วน
JWT มีสามส่วน: ส่วนหัว (อัลกอริทึมและประเภท) เพย์โหลด (การอ้างสิทธิ์) และลายเซ็น (พิสูจน์ความสมบูรณ์) แต่ละส่วนมีการเข้ารหัส Base64URL และคั่นด้วยจุด: eyJhbGciOi...J9.eyJzdWIi...J9.signature ใครก็ตามที่มีโทเค็นสามารถอ่านสองส่วนแรกได้ เฉพาะลายเซ็นเท่านั้นที่ต้องใช้รหัสลับ
-
เรียนรู้การกล่าวอ้างมาตรฐาน
เพย์โหลดมีการอ้างสิทธิ์ — ข้อความเกี่ยวกับเรื่องนี้ การกล่าวอ้างมาตรฐาน: 'sub' (หัวเรื่อง/ID ผู้ใช้), 'iat' (ออก ณ เวลาประทับ), 'exp' (หมดอายุ), 'nbf' (ไม่ใช่ก่อนหน้า), 'iss' (ผู้ออก), 'aud' (ผู้ชม) การอ้างสิทธิ์แบบกำหนดเองอาจรวมถึงบทบาท สิทธิ์ หรือข้อมูลอื่น ๆ
-
ทำความเข้าใจอัลกอริธึมการลงนาม
JWT ใช้การลงนามแบบสมมาตร (HS256 — ความลับที่แชร์) หรือไม่สมมาตร (RS256, ES256 — คู่คีย์สาธารณะ/ส่วนตัว) ลายเซ็นป้องกันการปลอมแปลง: การเปลี่ยนส่วนใดส่วนหนึ่งของโทเค็นจะทำให้ลายเซ็นเป็นโมฆะ เฉพาะผู้ถือรหัสลับ/ส่วนตัวเท่านั้นที่สามารถสร้างโทเค็นที่ถูกต้องได้
-
ใช้ JWT สำหรับการรับรองความถูกต้อง
หลังจากเข้าสู่ระบบ เซิร์ฟเวอร์จะสร้าง JWT และส่งไปยังไคลเอนต์ ไคลเอนต์รวม JWT ไว้ในส่วนหัวการอนุญาต (โทเค็นผู้ถือ) สำหรับคำขอครั้งต่อไป เซิร์ฟเวอร์จะตรวจสอบลายเซ็นและตรวจสอบการหมดอายุ — ไม่จำเป็นต้องค้นหาฐานข้อมูล
ตัวอย่าง
JWT โครงสร้าง
ป้อนข้อมูล: JWT ทั่วไป
เอาท์พุต: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyMSIsImV4cCI6MTY5MzYxMjgwMH0.signature
ส่วนหัวที่ถอดรหัสแล้ว
ป้อนข้อมูล: ส่วนแรกถอดรหัสแล้ว
เอาท์พุต: {"alg": "HS256", "typ": "JWT"}
เพย์โหลดที่ถอดรหัสแล้ว
ป้อนข้อมูล: ส่วนที่สองถอดรหัส
เอาท์พุต: {"sub": "user1", "name": "Alice", "iat": 1693526400, "exp": 1693612800}
ปัญหาทั่วไป
- การถอดรหัสและการตรวจสอบ —การถอดรหัส JWT (การอ่านเนื้อหา) ไม่ได้พิสูจน์ว่าเป็นของแท้ ตรวจสอบฝั่งเซิร์ฟเวอร์ลายเซ็นด้วยรหัสลับทุกครั้งก่อนที่จะเชื่อถือการอ้างสิทธิ์
- การจัดเก็บ JWT ใน localStorage - ทำให้เข้าถึงได้ด้วย JavaScript ซึ่งเสี่ยงต่อการโจมตี XSS เก็บไว้ในคุกกี้ httpOnly เพื่อความปลอดภัยที่ดีขึ้น
- โทเค็นที่มีอายุการใช้งานยาวนาน —หากโทเค็นถูกขโมย โทเค็นนั้นจะยังคงใช้ได้จนกว่าจะหมดอายุ ใช้โทเค็นการเข้าถึงที่มีอายุสั้น (15-60 นาที) พร้อมโทเค็นการรีเฟรชสำหรับเซสชันที่ยาวนาน
- ข้อมูลที่ละเอียดอ่อนในเพย์โหลด — ใครก็ตามที่มีโทเค็นสามารถอ่านเพย์โหลดได้ (คือ Base64 ไม่ได้เข้ารหัส) อย่าใส่รหัสผ่าน บัตรเครดิต หรือความลับในเพย์โหลด
เคล็ดลับ
- ตรวจสอบฝั่งเซิร์ฟเวอร์ลายเซ็น JWT เสมอก่อนที่จะเชื่อถือการอ้างสิทธิ์ใดๆ การถอดรหัสเพียงอย่างเดียวไม่ใช่การตรวจสอบสิทธิ์
- ใช้โทเค็นการเข้าถึงที่มีอายุสั้น (15-60 นาที) พร้อมโทเค็นการรีเฟรชสำหรับเซสชันที่ยาวนาน เพื่อลดความเสียหายจากการขโมยโทเค็น
- จัดเก็บ JWT ในคุกกี้ httpOnly, Secure, SameSite แทนที่จะเป็น localStorage เพื่อป้องกันการโจมตี XSS
- ใช้ตัวถอดรหัส JWT ของเราเพื่อตรวจสอบเนื้อหาโทเค็นเพื่อการแก้ไขข้อบกพร่อง โทเค็นของคุณจะไม่มีวันออกจากเบราว์เซอร์ของคุณ