วัฏจักรของ Token (Token Lifecycle)
เอกสารนี้อธิบายวงจรชีวิตของ Token ในระบบ RawPush ตั้งแต่การสร้าง การตรวจสอบ ไปจนถึงการหมดอายุ เพื่อให้คุณเข้าใจการจัดการ Session ได้อย่างครบถ้วน
1. ช่วงเวลาเกิด (Generation)
- ความรับผิดชอบ: ฝั่ง Backend ของคุณ
- กระบวนการ: เมื่อผู้ใช้ (User/Client) ล็อกอินเข้าสู่ระบบของคุณ Backend จะสร้าง Token พร้อมกำหนดเวลาหมดอายุ (
exp) และแนบ ID ที่ไม่ซ้ำกัน (jti) เพื่อป้องกัน Replay Attack - ข้อแนะนำ: ควรตั้ง expiration อยู่ระหว่าง 5 - 15 นาที ให้เพียงพอต่อการส่ง Token ไปให้ Frontend โหลดหน้าเว็บและ connect WebSocket จนสำเร็จ
- ❌ ไม่แนะนำให้ตั้งอายุนานเป็นสัปดาห์ เพราะหาก Token หลุดไป ผู้อื่นสามารถนำไปใช้ซ้ำได้ (แม้จะมี JTI ป้องกันอยู่ แต่การจำกัดอายุสั้นๆ ยังคงปลอดภัยกว่า)
2. ช่วงเวลาใช้งาน (Consumption / Validation)
ความรับผิดชอบ: ระบบ RawPush
กระบวนการ: เมื่อ Client connect WebSocket และส่ง Command
authพร้อม Token เข้ามา ระบบ RawPush จะตรวจสอบ 3 ขั้นตอน:- Signature Checker: คำนวณ HMAC-SHA256 จาก Payload ด้วย Secret Key แล้วเทียบกับ Signature ที่ส่งมา (ว่า Token นี้สร้างโดย Backend ของคุณจริงหรือไม่)
- Time Checker: ตรวจสอบ Timestamp
expว่า Token ยังไม่หมดอายุ ณ เวลาปัจจุบัน - JTI Checker: ตรวจสอบ
jtiใน Memory ว่า JTI นี้ เคยถูกใช้งานแล้ว หรือยัง หากเคยใช้แล้วจะถูกปฏิเสธทันที (Replay Attack block)
สิ่งที่ควรรู้: การตรวจสอบ
jtiและexpจะเกิดขึ้น แค่ตอน connect ครั้งแรก (Authentication Phase) เท่านั้น เมื่อผ่านการ authenticate เข้ามาสู่ระบบแล้ว Session จะคงอยู่ (Session established) ต่อเนื่องไปโดยไม่มีข้อจำกัดเวลา ตราบใดที่ยังมีการเชื่อมต่ออยู่ หรือจนกว่าจะถูก disconnect
3. ช่วงเวลาตาย (Expiration & Disconnection)
เมื่อ WebSocket connect สำเร็จแล้ว Session จะคงอยู่ต่อเนื่องแม้ Token ที่ใช้ตอน authenticate จะหมดอายุไปแล้ว
- คำถาม: ถ้าผู้ใช้ถูกลบ Account ไปแล้ว แต่ยังเปิด Browser ทิ้งไว้ จะยังรับข้อมูล Real-time ได้อยู่หรือไม่?
- คำตอบ: ใช่ หาก Developer ไม่ได้จัดการส่วนนี้ แต่ในทางปฏิบัติ เมื่อ Backend ตรวจพบว่าผู้ใช้ถูก Ban หรือ Logout แล้ว Backend ควรส่ง HTTP Request มาหา RawPush เพื่อ disconnect (ยังไม่มี API ส่วนนี้ แต่อนาคตจะรองรับการ disconnect รายคน — [ปัจจุบันใช้การเปลี่ยน Policy หรือรอ Timeout])
🚧 สิ่งที่ทำลาย Connection ทันที
- Network ขาดหาย: มือถือเข้าลิฟต์ เน็ตตัด Wi-Fi หลุด (สาเหตุอันดับ 1)
- Heartbeat Timeout: ถ้า Client ไม่ตอบ Ping ของ RawPush นานเกินกำหนด จะถูก disconnect (Clean disconnect)
- Revoke Key: หากคุณกด Revoke เปลี่ยน Secret Key ใน Dashboard — Connection ทั้งหมดที่ใช้ Key เดิม จะถูก disconnect ทันที (Mass Disconnect)
