การดู : 0

12/04/2026 18:17น.

EP.66 การใช้ Golang ร่วมกับ JSON Web Tokens (JWT) เพื่อจัดการกับระบบการยืนยันตัวตน (Authentication)

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:

  1. การสร้าง Token เมื่อผู้ใช้ล็อกอิน:
    เมื่อผู้ใช้ล็อกอินเข้าสู่ระบบ ระบบจะสร้าง JWT Token และส่งกลับให้ผู้ใช้
  2. การตรวจสอบ Token:
    เมื่อผู้ใช้เชื่อมต่อ WebSocket Server ระบบจะตรวจสอบ JWT Token เพื่อยืนยันตัวตนของผู้ใช้
  3. การจัดการสิทธิ์การเข้าถึง:
    หลังจากยืนยันตัวตนแล้ว ระบบจะใช้ JWT Token เพื่อตรวจสอบสิทธิ์ของผู้ใช้ในการเข้าถึงฟีเจอร์ต่างๆ ของห้องแชท

 

การเพิ่มฟีเจอร์การยืนยันตัวตนด้วย JWT ใน WebSocket Server

ขั้นตอนที่ต้องทำ:

  1. สร้าง JWT Token เมื่อผู้ใช้ล็อกอิน:
    • เราจะใช้ JWT ในการสร้าง Token เมื่อผู้ใช้ทำการล็อกอินเข้าสู่ระบบ
  2. ตรวจสอบ JWT Token เมื่อผู้ใช้เชื่อมต่อ WebSocket:
    • เมื่อผู้ใช้เชื่อมต่อเข้ามาใน WebSocket Server ระบบจะตรวจสอบ JWT Token ที่ส่งมาพร้อมกับคำขอเชื่อมต่อ
  3. จัดการสิทธิ์การเข้าถึง:
    • ระบบจะตรวจสอบข้อมูลจาก JWT Token เช่น ชื่อผู้ใช้และบทบาท เพื่อกำหนดสิทธิ์ต่างๆ ในการเข้าถึงห้องแชท

 

ตัวอย่างโค้ดการใช้ JWT ใน WebSocket Server

  1. การสร้าง 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)
}
  1. การตรวจสอบ 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 ได้