JSON Web Token หรือ JWT คือมาตรฐานสากล ที่ใช้ในการส่งข้อมูลระหว่างสองฝั่ง ในรูปแบบของวัตถุ JSON โดยมีความปลอดภัยสูง เพราะข้อมูลที่ส่งไปนั้นสามารถตรวจสอบได้ว่าถูกแก้ไขหรือไม่ผ่านการลงลายมือชื่อดิจิทัล
ส่วนประกอบของ JWT
JWT หนึ่งชุดจะประกอบด้วยข้อความ 3 ส่วนที่คั่นด้วยเครื่องหมายจุด (.) คือ Header.Payload.Signature
Header
บอกประเภทของ Token และอัลกอริทึมที่ใช้ในการเข้ารหัส เช่น HMAC SHA256 หรือ RSA
{ "alg": "HS256", "typ": "JWT"
}
Payload
คือข้อมูลที่เราต้องการส่ง เช่น ID ของผู้ใช้, ชื่อ หรือวันหมดอายุของ Token ข้อมูลส่วนนี้ไม่ได้ถูกเข้ารหัสลับ แต่ถูกแปลงเป็น Base64 ดังนั้นห้ามใส่รหัสผ่านหรือข้อมูลที่สำคัญมากไว้ในนี้
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022
}
Signature
ส่วนนี้สำคัญที่สุด ใช้ป้องกันการแก้ไขข้อมูล โดยการนำ Header และ Payload ที่เป็น Base64 มาบวกรวมกับ Secret Key แล้วนำไปผ่านฟังก์ชัน Hash ตามอัลกอริทึมที่ระบุไว้ใน Header
JWT ทำงานอย่างไร ?
- Authentication
ผู้ใช้ล็อกอินด้วย Username / Password - Creation
หากรหัสถูกต้อง Server จะสร้าง JWT โดยใช้ Secret Key และส่งกลับไปให้ Client - Storage
Client เก็บ JWT ไว้ - Authorization
เมื่อ Client ต้องการดึงข้อมูลจาก API จะส่ง JWT ไปใน Header ของ HTTP Request:Authorization: Bearer <token> - Validation
Server ตรวจสอบ Signature ของ Token ถ้าถูกต้องและยังไม่หมดอายุ Server จะอนุญาตให้เข้าถึงข้อมูล
ข้อดีและข้อเสีย
ข้อดี
- Stateless
Server ไม่ต้องเก็บข้อมูล Session ไว้ในหน่วยความจำ เพราะข้อมูลทุกอย่างอยู่ใน Token แล้ว เหมาะมากสำหรับระบบที่ต้องขยายตัว - Cross-Domain
ใช้งานได้ง่ายกับหลายโดเมน หรือระบบ Microservices - Performance
ลดการ Query ฐานข้อมูลเพื่อเช็คสถานะการล็อกอินบ่อย ๆ
ข้อเสีย
- Revocation
การยกเลิก Token ก่อนหมดอายุทำได้ยาก เนื่องจาก Server ไม่ได้เก็บสถานะไว้ - Data Size
ยิ่งใส่ Payload เยอะ ขนาด Token จะยิ่งใหญ่ ทำให้เปลือง Bandwidth - Security Risk
หาก Secret Key รั่วไหล ผู้โจมตีจะสามารถสร้าง Token ปลอมได้ทันที
ข้อควรระวังในการใช้งาน
- HTTPS เท่านั้น
ต้องส่งผ่าน HTTPS เสมอเพื่อป้องกันการถูกดักจับ - อย่าเก็บความลับใน Payload
อย่างที่กล่าวไป Payload แค่ถูกแปลงรหัส ไม่ได้ถูกปกปิด ใครก็ถอดรหัสออกมาดูได้ - ตั้งวันหมดอายุ
ควรกำหนดexpให้เหมาะสม ไม่ควรยาวเกินไป เพื่อลดความเสี่ยงหาก Token หลุดรอดไป
รุปสั้น ๆ JWT คือ “บัตรผ่าน” ที่บอกว่าคุณเป็นใคร มีสิทธิ์ทำอะไร โดยที่ Server ไม่ต้องคอยจำหน้าคุณทุกครั้ง แค่ตรวจเช็ค “ตราประทับ” บนบัตรก็เพียงพอแล้วครับ
อ่านเพิ่มเติม