การดู : 226

08/05/2026 06:51น.

EP.124 Security & Authentication ขั้นสูงสำหรับ WebSocket (JWT, Token Strategy & Secure Handshake)

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)

  1. Client Login ผ่าน REST API
  2. Server ส่ง JWT (Short-lived) กลับมา
  3. 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_required event ผ่าน 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