12/04/2026 18:17น.

EP.66 การใช้ Golang ร่วมกับ JSON Web Tokens (JWT) เพื่อจัดการกับระบบการยืนยันตัวตน (Authentication)
#WebSocket Authentication
#การจัดการผู้ใช้ด้วย JWT
#การสร้าง JWT Token
#การใช้ JWT ใน Golang
#การยืนยันตัวตน WebSocket
ใน EP.66 นี้เราจะมาดูวิธีการใช้ JSON Web Tokens (JWT) ใน Golang เพื่อจัดการกับระบบการยืนยันตัวตน (Authentication) สำหรับ WebSocket Chat โดยการใช้ JWT จะช่วยให้สามารถสร้างระบบการยืนยันตัวตนที่ปลอดภัยและสามารถจัดการสิทธิ์การเข้าถึงของผู้ใช้ได้อย่างมีประสิทธิภาพ
การใช้ JWT ทำให้การตรวจสอบตัวตนของผู้ใช้ในระบบ WebSocket Chat สามารถทำได้ง่ายและปลอดภัย โดยไม่ต้องมีการเก็บข้อมูลเซสชันของผู้ใช้ในฐานข้อมูล ซึ่งช่วยลดปัญหาความเสี่ยงจากการโจมตีประเภทต่างๆ เช่น Session Hijacking หรือ Cross-Site Request Forgery (CSRF)
ทำไมต้องใช้ JWT สำหรับการยืนยันตัวตนใน WebSocket Chat?
การใช้ JWT สำหรับการยืนยันตัวตนมีข้อดีหลายประการ เช่น:
- ปลอดภัย: โดยไม่ต้องเก็บข้อมูลเซสชันในเซิร์ฟเวอร์และสามารถยืนยันตัวตนได้โดยไม่ต้องเชื่อมโยงกับฐานข้อมูล
- ง่ายต่อการใช้งาน: JWT ใช้งานง่ายและสามารถใช้ในการตรวจสอบตัวตนของผู้ใช้ในระบบที่มีความต้องการการทำงานแบบเรียลไทม์
- สามารถใช้งานได้หลายบริการ: JWT สามารถใช้งานได้ในหลายๆ บริการที่มี API เช่น การยืนยันตัวตนระหว่าง WebSocket และ API อื่นๆ
ข้อดีของการใช้ JWT ใน WebSocket Chat:
- การตรวจสอบตัวตนที่ปลอดภัย: สามารถยืนยันตัวตนได้อย่างปลอดภัยโดยไม่ต้องเก็บข้อมูลเซสชัน
- การจัดการสิทธิ์ผู้ใช้ได้ง่าย: สามารถกำหนดสิทธิ์การเข้าถึงห้องแชทและฟีเจอร์ต่างๆ ตามที่ผู้ใช้ได้รับสิทธิ์
- ลดการโจมตีจากการแอบอ้าง: ไม่มีข้อมูลเซสชันให้โจมตี ทำให้ JWT ปลอดภัยกว่า
โครงสร้างของระบบการยืนยันตัวตนด้วย JWT ใน WebSocket Chat
การใช้ JWT ใน WebSocket Chat จะต้องมีการสร้าง Token สำหรับผู้ใช้ที่ล็อกอินเข้าสู่ระบบ จากนั้น Token นี้จะถูกใช้ในการยืนยันตัวตนของผู้ใช้ในแต่ละการเชื่อมต่อ
ส่วนประกอบหลักของระบบ JWT ใน WebSocket Chat:
- การสร้าง Token เมื่อผู้ใช้ล็อกอิน:
เมื่อผู้ใช้ล็อกอินเข้าสู่ระบบ ระบบจะสร้าง JWT Token และส่งกลับให้ผู้ใช้ - การตรวจสอบ Token:
เมื่อผู้ใช้เชื่อมต่อ WebSocket Server ระบบจะตรวจสอบ JWT Token เพื่อยืนยันตัวตนของผู้ใช้ - การจัดการสิทธิ์การเข้าถึง:
หลังจากยืนยันตัวตนแล้ว ระบบจะใช้ JWT Token เพื่อตรวจสอบสิทธิ์ของผู้ใช้ในการเข้าถึงฟีเจอร์ต่างๆ ของห้องแชท
การเพิ่มฟีเจอร์การยืนยันตัวตนด้วย JWT ใน WebSocket Server
ขั้นตอนที่ต้องทำ:
- สร้าง JWT Token เมื่อผู้ใช้ล็อกอิน:
- เราจะใช้ JWT ในการสร้าง Token เมื่อผู้ใช้ทำการล็อกอินเข้าสู่ระบบ
- ตรวจสอบ JWT Token เมื่อผู้ใช้เชื่อมต่อ WebSocket:
- เมื่อผู้ใช้เชื่อมต่อเข้ามาใน WebSocket Server ระบบจะตรวจสอบ JWT Token ที่ส่งมาพร้อมกับคำขอเชื่อมต่อ
- จัดการสิทธิ์การเข้าถึง:
- ระบบจะตรวจสอบข้อมูลจาก JWT Token เช่น ชื่อผู้ใช้และบทบาท เพื่อกำหนดสิทธิ์ต่างๆ ในการเข้าถึงห้องแชท
ตัวอย่างโค้ดการใช้ JWT ใน WebSocket Server
การสร้าง JWT Token เมื่อผู้ใช้ล็อกอิน
package main
import (
"fmt"
"github.com/dgrijalva/jwt-go"
"time"
)
var mySigningKey = []byte("secret")
func GenerateJWT(userID string) (string, error) {
claims := jwt.MapClaims{
"user_id": userID,
"exp": time.Now().Add(time.Hour * 72).Unix(),
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
tokenString, err := token.SignedString(mySigningKey)
if err != nil {
return "", err
}
return tokenString, nil
}
func main() {
token, err := GenerateJWT("user123")
if err != nil {
fmt.Println("Error generating JWT:", err)
return
}
fmt.Println("Generated Token:", token)
}
การตรวจสอบ JWT Token ใน WebSocket Server
package main
import (
"fmt"
"github.com/dgrijalva/jwt-go"
"log"
"net/http"
"github.com/gorilla/websocket"
)
var mySigningKey = []byte("secret")
func validateJWT(tokenString string) (*jwt.Token, error) {
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
}
return mySigningKey, nil
})
if err != nil {
return nil, err
}
return token, nil
}
func handleConnection(w http.ResponseWriter, r *http.Request) {
tokenString := r.URL.Query().Get("token") // Get token from URL query string
token, err := validateJWT(tokenString)
if err != nil || !token.Valid {
http.Error(w, "Invalid token", http.StatusUnauthorized)
return
}
conn, err := websocket.Upgrade(w, r, nil)
if err != nil {
log.Println("Error upgrading connection:", err)
return
}
defer conn.Close()
fmt.Println("User authenticated and connected")
}
func main() {
http.HandleFunc("/ws", handleConnection)
log.Fatal(http.ListenAndServe(":8080", nil))
}
ในโค้ดนี้, เราสร้าง JWT Token เมื่อผู้ใช้ล็อกอินและตรวจสอบ JWT Token ใน WebSocket Server เพื่อตรวจสอบความถูกต้องของผู้ใช้
การทดสอบระบบการยืนยันตัวตนด้วย JWT
การทดสอบระบบการยืนยันตัวตนที่ใช้ JWT ควรทดสอบดังนี้:
- ทดสอบการสร้างและส่ง JWT Token: ทดสอบว่า JWT ถูกสร้างขึ้นและส่งไปให้ผู้ใช้เมื่อทำการล็อกอิน
- ทดสอบการตรวจสอบ Token: ทดสอบว่าเมื่อผู้ใช้เชื่อมต่อ WebSocket ระบบสามารถตรวจสอบ JWT ได้ถูกต้อง
- ทดสอบการจัดการสิทธิ์การเข้าถึง: ทดสอบว่า JWT Token สามารถใช้ในการกำหนดสิทธิ์การเข้าถึงห้องแชทได้ตามบทบาทของผู้ใช้
ท้าให้ลอง!
ลองเพิ่ม ฟีเจอร์การรีเฟรช JWT Token เมื่อ Token ใกล้หมดอายุ เพื่อให้ผู้ใช้ไม่ต้องล็อกอินใหม่ทุกครั้งเมื่อ Token หมดอายุ
EP ถัดไป:
ใน EP.67 เราจะมาดู การสร้างระบบบันทึกการใช้งาน (Audit Log) ใน WebSocket Server เพื่อให้สามารถตรวจสอบการกระทำต่างๆ ภายใน WebSocket Server ได้