/อ่าน 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 idaud: ผู้รับหรือระบบปลายทางที่โทเคนนี้ใช้ได้exp: เวลาหมดอายุiat: เวลาที่ออกโทเคนnbf: เวลาที่เริ่มใช้โทเคนได้
อย่าใส่รหัสผ่าน secret, private key หรือข้อมูลส่วนบุคคลที่อ่อนไหวไว้ใน payload เพราะใครก็ตามที่มีโทเคนสามารถถอดรหัสและอ่าน payload ได้
การยืนยันตัวตนด้วย JWT ทำงานอย่างไร
- ผู้ใช้เข้าสู่ระบบด้วยข้อมูลรับรอง
- เซิร์ฟเวอร์ตรวจสอบผู้ใช้และออก access token แบบ JWT
- ไคลเอนต์เก็บโทเคน โดยควรใช้คุกกี้แบบ secure และ HTTP-only เมื่อทำได้
- ไคลเอนต์ส่งโทเคนไปพร้อมคำขอ API
- เซิร์ฟเวอร์ตรวจสอบลายเซ็นและ claims ก่อนส่งข้อมูลที่ถูกป้องกันกลับไป
HS256 เทียบกับ RS256
| อัลกอริทึม | ชนิดของกุญแจ | การใช้งานทั่วไป |
|---|---|---|
| HS256 | Shared secret | แอปบริการเดียวหรือระบบภายในที่ควบคุมได้แน่นหนา |
| RS256 | คู่กุญแจ public/private | ระบบกระจายตัวและการตรวจสอบโดยบุคคลที่สาม |
แนวทางความปลอดภัยที่ควรทำ
- กำหนดอายุ access token ให้สั้นด้วย
exp - ใช้ refresh token พร้อมการหมุนเวียนและการเพิกถอน token
- ตรวจสอบลายเซ็น issuer, audience และวันหมดอายุทุกครั้ง
- ปฏิเสธโทเคนที่ไม่มีลายเซ็น และกำหนดอัลกอริทึมที่อนุญาตไว้อย่างชัดเจน
- ส่งโทเคนผ่าน HTTPS เท่านั้น
- ปฏิบัติต่อ JWT เหมือนข้อมูลรับรอง: หลีกเลี่ยงการบันทึกลง log และลบออกจาก error report
เครื่องมือ JWT
ใช้เครื่องมือเหล่านี้เพื่อตรวจสอบและสร้าง JWT ระหว่างทดสอบระบบ auth:
แหล่งอ้างอิง
- Jones, M., Bradley, J., and Sakimura, N. (2015). RFC 7519: JSON Web Token (JWT). IETF. https://datatracker.ietf.org/doc/html/rfc7519
- Sheffer, Y., Hardt, D., and Jones, M. (2020). RFC 8725: JSON Web Token Best Current Practices. IETF. https://datatracker.ietf.org/doc/html/rfc8725
- OWASP Foundation. JSON Web Token Cheat Sheet for Java. https://cheatsheetseries.owasp.org/cheatsheets/JSON_Web_Token_for_Java_Cheat_Sheet.html