08/05/2026 06:51น.

EP.124 Security & Authentication ขั้นสูงสำหรับ WebSocket (JWT, Token Strategy & Secure Handshake)
#WebSocket
#Go
#JWT WebSocket
#WebSocket Authentication
#WebSocket Security
เมื่อ WebSocket Server ของคุณเริ่มมีผู้ใช้งานจำนวนมาก หรือถูกใช้งานกับข้อมูลสำคัญ เช่น
- Chat & Collaboration
- Financial / Trading Data
- IoT / Device Control
- Multiplayer Game
- Internal Enterprise Systems
คำถามที่สำคัญไม่ใช่แค่ว่า “มันเร็วแค่ไหน?” แต่คือ❗ “มันปลอดภัยพอสำหรับ Production หรือยัง?”
บทความนี้จะพาคุณลงลึก WebSocket Security ในระดับที่ใช้จริงในระบบ Enterprise & Large-scale Production
🎯 เป้าหมายของบทความนี้
หลังอ่านจบ คุณจะเข้าใจ:
- วิธีทำ Authentication สำหรับ WebSocket ที่ถูกต้อง
- การใช้ JWT & Token Strategy อย่างปลอดภัย
- วิธีป้องกัน WebSocket Hijacking
- การออกแบบ Secure Handshake ที่ใช้ได้จริงใน Production
- แนวคิด Auth ≠ Authorization ในระบบ Real-time
🧠 ความเข้าใจผิดที่พบบ่อยเกี่ยวกับ WebSocket Security
❌ “WebSocket ปลอดภัยอยู่แล้ว เพราะเริ่มจาก HTTP”
❌ “เช็ค user ตอน connect ครั้งเดียวก็พอ”
❌ “ใช้ Cookie Auth เหมือนเว็บปกติได้”
ความจริงคือ
WebSocket คือ Long-lived Connection
- เชื่อมต่อครั้งเดียว → ใช้งานยาว
- ไม่มี Same-Origin Policy แบบ fetch/XHR
- ถ้า Auth พลาดตั้งแต่ Handshake → เสี่ยงทั้ง Session
🔥 WebSocket ที่ Auth ผิด = เปิดประตูทิ้งไว้ทั้งวัน
🔑 Authentication สำหรับ WebSocket (แนวทางที่ถูกต้อง)
❌ สิ่งที่ไม่ควรทำ
- ส่ง
username/passwordผ่าน WebSocket message - Auth หลังจากเชื่อมต่อแล้ว
- เชื่อถือ client-side data
- ใช้ Cookie เพียงอย่างเดียว
✅ แนวทางที่ถูกต้อง
- Authenticate ตั้งแต่ Handshake
- Reject connection ทันทีหาก Auth ไม่ผ่าน
- ใช้ Token-based Authentication
🪪 JWT & Token Strategy สำหรับ WebSocket
รูปแบบที่แนะนำ (Best Practice)
- Client Login ผ่าน REST API
- Server ส่ง JWT (Short-lived) กลับมา
- Client ใช้ JWT ตอนเชื่อมต่อ WebSocket
ตัวอย่างการส่ง Token
ผ่าน Query String:
wss://api.example.com/ws?token=JWT_TOKEN
หรือผ่าน Header:
Authorization: Bearer <JWT>
✅ แนะนำใช้ Header หาก Load Balancer / Ingress รองรับ
⚠️ Query String ต้องระวังเรื่อง Logging
🧩 ตัวอย่างตรวจ JWT ตอน Handshake (Go)
func authenticate(r *http.Request) (*User, error) {
token := r.URL.Query().Get("token")
if token == "" {
return nil, errors.New("missing token")
}
claims, err := validateJWT(token)
if err != nil {
return nil, err
}
return &User{
ID: claims.UserID,
Role: claims.Role,
}, nil
}
❗ ถ้า Auth ไม่ผ่าน → Reject connection ทันที
อย่าเปิด WebSocket แล้วค่อยเช็คทีหลัง
⏳ Token Expiration & Refresh Strategy
ปัญหาที่เกิดจริง
- WebSocket เชื่อมต่อยาว
- JWT มีอายุสั้น
- Token หมดอายุระหว่าง Session
แนวทางที่ใช้จริงใน Production
- ใช้ Short-lived JWT
- Refresh Token ผ่าน REST API
- ส่ง
reauth_requiredevent ผ่าน WebSocket - หากไม่ re-auth → disconnect อย่างปลอดภัย
❌ ห้ามใช้ JWT อายุยาวเพื่อแก้ปัญหานี้
🧨 WebSocket Hijacking คืออะไร?
รูปแบบการโจมตีที่พบบ่อย
- Attacker inject script
- Browser ส่ง Cookie อัตโนมัติ
- Attacker เปิด WebSocket แทน user
- Server คิดว่าเป็น user ตัวจริง
WebSocket ไม่ถูกป้องกันโดย Same-Origin Policy
🛡️ วิธีป้องกัน WebSocket Hijacking (จำเป็นทุกระบบ)
1. ตรวจสอบ Origin ทุกครั้ง
func checkOrigin(r *http.Request) bool {
origin := r.Header.Get("Origin")
return origin == "https://yourdomain.com"
}
❗ ห้าม return true ตลอดใน Production
2. ห้ามใช้ Cookie เพียว ๆ
- Cookie ถูกส่งอัตโนมัติ
- เสี่ยง CSRF + Hijacking
✅ ใช้ Token-based Auth เท่านั้น
3. Bind Token กับ Context
เช่น:
- user_id
- device_id
- session_id
- ip (optional)
เพื่อป้องกัน Token Replay
🤝 Secure Handshake Design (Enterprise Grade)
สิ่งที่ Secure Handshake ควรมี:
- JWT Validation
- Origin Check
- Rate Limit ต่อ IP
- Permission Check
- Reject Unknown Protocol
Flow ที่แนะนำ
Client → Handshake
→ Validate JWT
→ Check Origin
→ Check Permission
→ Accept / Reject
🚨 Rate Limiting & Brute-force Protection
ภัยที่ต้องป้องกัน
- Connection Flood
- Token Brute-force
- Reconnect Spam
แนวทางที่ใช้จริง
- Limit connections ต่อ IP
- Redis-based Rate Limiter
- Exponential Backoff ฝั่ง Client
🔐 Authorization ภายใน WebSocket (สำคัญมาก)
Authentication ≠ Authorization
ตัวอย่างช่องโหว่ที่พบบ่อย
- user ส่ง message เข้า admin room ❌
- user subscribe event ที่ไม่ควรเห็น ❌
แนวทางที่ถูกต้อง
- ตรวจ role / permission ทุก event
- Validate ทุก message
- อย่าเชื่อ client-side event type
🧪 Security Checklist ก่อนขึ้น Production
✅ ใช้ WSS:// เท่านั้น
✅ Validate JWT ตอน Handshake
✅ ตรวจ Origin
✅ Token มี Expiration
✅ ไม่ส่งข้อมูลสำคัญใน Plain Text
✅ Rate Limit Connections
✅ Log Security Events
✅ Monitor Reconnect Anomaly
🚀 ท้าให้ลอง (Security Audit)
ลอง Audit WebSocket ของคุณ:
- ตัด Cookie Auth ออก
- เพิ่ม JWT Validation ตอน connect
- ลอง connect จาก domain อื่น
- ลองใช้ token หมดอายุ
- ลองยิง reconnect ถี่ ๆ
ถ้าระบบยังปลอดภัย → คุณกำลังเข้าใกล้ Enterprise-grade WebSocket Security แล้ว 🔐
🔮 EP ถัดไป EP.125 TLS / WSS และ Certificate Management สำหรับ WebSocket
ตอนถัดไปเราจะเจาะลึก:
- HTTPS vs WSS
- TLS Handshake
- Certificate Rotation
- Let’s Encrypt & Production Setup
- Zero-downtime Certificate Renewal