JWT คืออะไร?
JWT (JSON Web Token) คือ token รูปแบบหนึ่งที่เป็นที่นิยมสำหรับซอฟต์แวร์สมัยใหม่ในการทำ authentication โดยข้อมูลจะถูกเข้ารหัส (encoded) ในรูปแบบ JSON (JavaScript Object Notation) และอยู่ในรูปแบบ Stateless (คือไม่มีการจดจำสถานะเมื่อมีการส่ง HTTP Request) JWT คือมาตรฐานในการ authentication รูปแบบหนึ่ง (มาตรฐาน RFC 7519) โดย JWTs คือ token ส่วนทุก ๆ tokens ไม่ใช่ JWT เสมอไป
การทำงานของ JWT (Image source: Alex Loxikov, medium.com)
Note: JWT ออกเสียงว่า "jot" (จ๊อต)
โครงสร้างของ JWT
JWT ประกอบด้วย 3 ส่วน ดังต่อไปนี้
- Header (ส่วนหัว): บอกข้อมูลเกี่ยวกับวิธีการเข้ารหัสและประเภทของข้อมูลที่อยู่ในนั้น
- Payload (เนื้อหา): ข้อมูลเกี่ยวกับผู้ใช้ เช่น ชื่อผู้ใช้ สิทธิ์การเข้าถึง (Claims)
- Signature (ลายเซ็น): ใช้ยืนยันความถูกต้องและป้องกันการปลอมแปลงข้อมูล โดยใช้คีย์ลับ (Secret Key)
ตัวอย่าง Header
{
"alg": "HS256",
"typ": "JWT"
}
ตัวอย่าง Payload
{
"iss": "https://example.com/",
"sub": "1234567890",
"name": "Pita Jaidee",
"iat": 1516239022,
"exp": 1516242622
}
จากโค้ด JSON ด้านบน
- iss: ผู้ส่ง JWT ตัวอย่างนี้ใช้
https://example.com/
- sub: Subject ของ JWT ตัวอย่างนี้ใช้
1234567890
- name: ชื่อผู้ใช้ ตัวอย่างนี้ใช้
Pita Jaidee
- iat: Issued At เวลาที่สร้าง JWT ตัวอย่างนี้ใช้
1516239022
(timestamp) - exp: Expiration Time เวลาที่ JWT หมดอายุ ตัวอย่างนี้ใช้
1516242622
(timestamp)
ตัวอย่าง Signature
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
- HMACSHA256: อัลกอริทึมที่ใช้ในการสร้างลายเซ็น
- base64UrlEncode(header): ส่วนหัวที่เข้ารหัสด้วย base64Url
- base64UrlEncode(payload): เนื้อหาที่เข้ารหัสด้วย base64Url
- secret: คีย์ลับที่ใช้ในการสร้างลายเซ็น
ข้อดีของ JWT
- Stateless: ไม่จำเป็นต้องเก็บสถานะการเชื่อมต่อ (Session) ของผู้ใช้บนเซิร์ฟเวอร์ ทำให้ระบบมีความยืดหยุ่นและรองรับผู้ใช้งานจำนวนมากได้
- Safety (ปลอดภัย): โดยข้อมูลภายใน JWT ถูกเข้ารหัส ทำให้ยากต่อการปลอมแปลง
- Lightweight (มีขนาดเล็ก): เหมาะสำหรับการส่งข้อมูลผ่านเครือข่าย
- Portable & Scalable (ใช้ได้หลายแพลตฟอร์ม): โดยเราสามารถใช้ JWT เพื่อใช้งานกับแพลตฟอร์มอื่น ๆ ไม่ว่าจะเป็น Web, Mobile App, etc โดยไม่ได้ขึ้นอยู่กับแพลตฟอร์มใด แพลตฟอร์มหนึ่งเหมือนกันกับ Session Authen ดังนั้นจึงสามารถขยายและสเกลไปได้หลายแพลตฟอร์ม
การทำงานของ JWT
- Client (เช่น เว็บเบราว์เซอร์) ขอเข้าสู่ระบบโดยส่งข้อมูลประจำตัว (เช่น ชื่อผู้ใช้ รหัสผ่าน) ไปยัง Server
- Server ตรวจสอบข้อมูลประจำตัว หากถูกต้องจะสร้าง JWT ประกอบด้วยข้อมูลผู้ใช้และเซ็นด้วย Secret Key
- Server ทำการส่ง JWT กลับไปยัง Client
- Client บันทึก JWT ไว้ (เช่น ใน Local Storage)
- Client จะเข้าถึงข้อมูลจาก Server จะแนบ JWT ไปกับทุก request
- Server ตรวจสอบความถูกต้องของ JWT ด้วย Secret Key
- หาก JWT ถูกต้อง Server อนุญาตให้เข้าถึงข้อมูลได้
ข้อจำกัดของ JWT
- ไม่เหมาะสำหรับการเก็บข้อมูลขนาดใหญ่
- ไม่เหมาะที่จะเก็บ sensitive data (ห้ามเลยก็ว่าได้)
- ไม่สามารถ revoke JWT ได้โดยตรง
อ้างอิงเพิ่มเติม