安全問題
WebSocket作為一種通訊協定引入到Web套用中,並不會解決Web套用中存在的安全問題,因此WebSocket套用的安全實作是由開發者或伺服端負責。這就要求開發者了解WebSocket套用潛在的安全風險,以及如何做到安全開發規避這些安全問題。
認證步驟
使用JWT進行身份認證是一種常見的做法,因為它可以方便地在客戶端和伺服器之間傳遞使用者的身份資訊。在WebSocket通訊中,可以透過URL地址傳遞令牌參數來實作JWT身份認證。
以下是實作這一過程的一般步驟:
使用者登入 :使用者透過傳統的HTTP請求登入系統,提供使用者名稱和密碼。
生成JWT :伺服器驗證使用者的憑據後,生成一個JWT。這個令牌包含了使用者的身份資訊和一些額外的聲明(如角色、許可權等),並且被伺服器的金鑰簽名。
發送JWT :伺服器將JWT發送回客戶端。
客戶端儲存JWT :客戶端(通常是瀏覽器)需要安全地儲存這個JWT,比如使用LocalStorage、SessionStorage或者Cookies。
建立WebSocket連線 :客戶端使用WebSocket協定發起連線請求。在連線URL中,透過查詢參數的方式附加JWT令牌。例如:
ws://wss.tinywan.com/socket?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
伺服器驗證JWT :伺服器接收到WebSocket連線請求後,解析URL中的令牌參數,並驗證JWT的有效性。這包括檢查簽名、過期時間以及任何其他伺服器關心的聲明。
建立連線 :如果JWT驗證成功,伺服器接受WebSocket連線請求,建立WebSocket連線。否則,伺服器可以拒絕連線。
後續通訊 :一旦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]);