當前位置: 妍妍網 > 碼農

WebSocket教程:JWT身份驗證參數方式有哪些?

2024-05-18碼農

安全問題

WebSocket作為一種通訊協定引入到Web套用中,並不會解決Web套用中存在的安全問題,因此WebSocket套用的安全實作是由開發者或伺服端負責。這就要求開發者了解WebSocket套用潛在的安全風險,以及如何做到安全開發規避這些安全問題。

認證步驟

使用JWT進行身份認證是一種常見的做法,因為它可以方便地在客戶端和伺服器之間傳遞使用者的身份資訊。在WebSocket通訊中,可以透過URL地址傳遞令牌參數來實作JWT身份認證。

以下是實作這一過程的一般步驟:

  1. 使用者登入 :使用者透過傳統的HTTP請求登入系統,提供使用者名稱和密碼。

  2. 生成JWT :伺服器驗證使用者的憑據後,生成一個JWT。這個令牌包含了使用者的身份資訊和一些額外的聲明(如角色、許可權等),並且被伺服器的金鑰簽名。

  3. 發送JWT :伺服器將JWT發送回客戶端。

  4. 客戶端儲存JWT :客戶端(通常是瀏覽器)需要安全地儲存這個JWT,比如使用LocalStorage、SessionStorage或者Cookies。

  5. 建立WebSocket連線 :客戶端使用WebSocket協定發起連線請求。在連線URL中,透過查詢參數的方式附加JWT令牌。例如: ws://wss.tinywan.com/socket?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

  6. 伺服器驗證JWT :伺服器接收到WebSocket連線請求後,解析URL中的令牌參數,並驗證JWT的有效性。這包括檢查簽名、過期時間以及任何其他伺服器關心的聲明。

  7. 建立連線 :如果JWT驗證成功,伺服器接受WebSocket連線請求,建立WebSocket連線。否則,伺服器可以拒絕連線。

  8. 後續通訊 :一旦WebSocket連線建立,客戶端和伺服器就可以透過這個連線進行雙向通訊。在某些實作中,JWT可能在每次WebSocket訊息發送時都包含在內,以便於持續驗證使用者身份。

請註意,JWT令牌應該始終透過安全的方式傳遞,比如使用 wss:// (WebSocket Secure,即WebSocket協定的加密版本)來避免中間人攻擊。此外,JWT不應該包含敏感資訊,因為它們可以被解碼(盡管不含金鑰無法偽造)。

令牌認證

在WebSocket通訊中加入Token主要是為了實作身份驗證和授權,確保只有經過驗證的使用者可以建立WebSocket連線。由於 WebSocket API 本身不支持直接在連線時設定HTTP頭部,因此需要采用一些變通的方法來傳遞Token。

1. 連結地址參數傳遞Token

這種方法簡單直接,但安全性較低,因為Token會暴露在URL中,容易被截獲。

var ws = new WebSocket("ws://wss.tinywan.com?authorization="+ACCESS_TOKEN);
ws.onopen = function(evt{
ws.send("認證授權和實作思路");
};

2. TCP建立連線後發送Token

var ws = new WebSocket("ws://wss.tinywan.com");
ws.addEventListener('open', (event) => {
ws.send('Authorization: Bearer ' + ACCESS_TOKEN);
});

3. 使用WebSocket子協定(Sec-WebSocket-Protocol)

利用WebSocket的子協定特性傳遞Token。這種方法需要伺服器端支持並正確處理子協定。

const access_token = localStorage.getItem('access_token');
var ws = new WebSocket("ws://wss.tinywan.com",[access_token]);