/อ่าน 11 นาที

JWT คืออะไร? อธิบาย JSON Web Token โครงสร้าง Claims และความปลอดภัย

JWT (JSON Web Token) คือรูปแบบโทเคนขนาดกะทัดรัดสำหรับส่งข้อมูล claims ระหว่างระบบอย่างปลอดภัย นิยมใช้กับการยืนยันตัวตน API, การจัดการเซสชัน และการกำหนดสิทธิ์ในเว็บแอปสมัยใหม่

JWT คืออะไร?

JWT ย่อมาจาก JSON Web Token ซึ่งกำหนดไว้ใน RFC 7519 เป็นรูปแบบโทเคนที่ปลอดภัยกับ URL และใช้แทนชุดข้อมูล claims ในรูปแบบ JSON ที่มีลายเซ็นกำกับ

หลังจากผู้ใช้เข้าสู่ระบบ เซิร์ฟเวอร์สามารถออก JWT ให้ได้ จากนั้นไคลเอนต์จะส่งกลับมาใน header Authorization: Bearer <token> สำหรับคำขอครั้งถัดไป

โครงสร้าง JWT: Header, Payload, Signature

JWT มี 3 ส่วนที่เข้ารหัสแบบ Base64URL และคั่นด้วยจุด:

header.payload.signature
  • Header: ระบุชนิดของโทเคนและอัลกอริทึมที่ใช้ลงลายเซ็น เช่น HS256
  • Payload: เก็บ claims เช่น user ID, roles, issuer, audience และเวลาหมดอายุ
  • Signature: ใช้ตรวจสอบความถูกต้องและความแท้จริง เพื่อให้เซิร์ฟเวอร์รู้ว่าโทเคนถูกแก้ไขหรือไม่

อธิบาย JWT Claims

Registered claims ที่พบบ่อย ได้แก่:

  • iss: ผู้ออกโทเคน
  • sub: หัวเรื่องหรือเจ้าของโทเคน โดยมักเป็น user id
  • aud: ผู้รับหรือระบบปลายทางที่โทเคนนี้ใช้ได้
  • exp: เวลาหมดอายุ
  • iat: เวลาที่ออกโทเคน
  • nbf: เวลาที่เริ่มใช้โทเคนได้

อย่าใส่รหัสผ่าน secret, private key หรือข้อมูลส่วนบุคคลที่อ่อนไหวไว้ใน payload เพราะใครก็ตามที่มีโทเคนสามารถถอดรหัสและอ่าน payload ได้

การยืนยันตัวตนด้วย JWT ทำงานอย่างไร

  1. ผู้ใช้เข้าสู่ระบบด้วยข้อมูลรับรอง
  2. เซิร์ฟเวอร์ตรวจสอบผู้ใช้และออก access token แบบ JWT
  3. ไคลเอนต์เก็บโทเคน โดยควรใช้คุกกี้แบบ secure และ HTTP-only เมื่อทำได้
  4. ไคลเอนต์ส่งโทเคนไปพร้อมคำขอ API
  5. เซิร์ฟเวอร์ตรวจสอบลายเซ็นและ claims ก่อนส่งข้อมูลที่ถูกป้องกันกลับไป

HS256 เทียบกับ RS256

อัลกอริทึมชนิดของกุญแจการใช้งานทั่วไป
HS256Shared secretแอปบริการเดียวหรือระบบภายในที่ควบคุมได้แน่นหนา
RS256คู่กุญแจ public/privateระบบกระจายตัวและการตรวจสอบโดยบุคคลที่สาม

แนวทางความปลอดภัยที่ควรทำ

  • กำหนดอายุ access token ให้สั้นด้วย exp
  • ใช้ refresh token พร้อมการหมุนเวียนและการเพิกถอน token
  • ตรวจสอบลายเซ็น issuer, audience และวันหมดอายุทุกครั้ง
  • ปฏิเสธโทเคนที่ไม่มีลายเซ็น และกำหนดอัลกอริทึมที่อนุญาตไว้อย่างชัดเจน
  • ส่งโทเคนผ่าน HTTPS เท่านั้น
  • ปฏิบัติต่อ JWT เหมือนข้อมูลรับรอง: หลีกเลี่ยงการบันทึกลง log และลบออกจาก error report

เครื่องมือ JWT

ใช้เครื่องมือเหล่านี้เพื่อตรวจสอบและสร้าง JWT ระหว่างทดสอบระบบ auth:

แหล่งอ้างอิง

USTHJP