一、JWT Token是什麼?
JSON Web Token(JWT)是一種開放標準(RFC 7519),它定義了一種緊湊且自包含的方式來安全地傳輸信息。JWT以JSON格式表示,並使用數字簽名或消息驗證代碼(MAC)來驗證其完整性。
一個 JWT Token 由令牌頭、有效負載和簽名組成,令牌頭包含表示令牌類型和所使用的演算法的元數據,有效負載是令牌的主體,包含聲明的信息,如用戶ID、角色等。簽名是對頭部和載荷的簽名,由秘密密鑰和指定的演算法生成。
二、如何使用JWT Token避免盜用?
1、設置令牌過期時間
在將JWT Token傳輸到客戶端之前,應該設置一個合適的過期時間,以確保令牌不會被無限制地使用。通常情況下,過期時間設置為一定的時間,例如30分鐘或1小時。
//使用JWT庫生成Token,過期時間為1小時 const jwt = require('jsonwebtoken'); const token = jwt.sign({ user_id: 123 }, 'secret', { expiresIn: '1h' });
在接收到令牌時,應該驗證令牌過期時間是否已過,如果過期時間已過,則應該認為令牌無效。
//使用JWT庫驗證Token是否過期 const jwt = require('jsonwebtoken'); const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMjMsImlhdCI6MTYxNTkyNDIzOH0.tze9EslmRYGc6EZl26fW0iafuDXbKZnmPf93eST2Umc'; const secret = 'secret'; try { const decodedToken = jwt.verify(token, secret); const { user_id } = decodedToken; console.log(user_id); } catch (err) { console.log('Token已過期'); }
2、限制Token的使用次數
通過限制Token的使用次數,可以防止在一定時間內使用同一個Token持續發送請求,降低被盜用的風險。通過在有效負載中添加「Issued At」(發布時間)聲明和「Nonce」(一次性數字)聲明,可以實現該功能。
//使用JWT庫生成Token,限制使用次數為5次 const jwt = require('jsonwebtoken'); const token = jwt.sign({ user_id: 123, iat: new Date().getTime(), nonce: '12345' }, 'secret', { expiresIn: '1h' });
在接收到令牌時,應該驗證令牌中的「Issued At」和「Nonce」聲明,如果兩個聲明與之前接收到的令牌相同,則應該認為令牌無效。
//使用JWT庫驗證Token的Issued At和Nonce聲明 const jwt = require('jsonwebtoken'); const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMjMsImlhdCI6MTYxNTkyNDIzOCwibm9uY2UiOiIxMjM0NSJ9.Od1NqFQp_L2z3pE4QRv6-nzt8mLX5zmhyZhApY6oeOc'; const secret = 'secret'; try { const decodedToken = jwt.verify(token, secret); const { user_id, iat, nonce } = decodedToken; if (iat !== prev_token_iat || nonce !== prev_token_nonce) { console.log('Token已失效'); } else { console.log(user_id); } } catch (err) { console.log('Token已過期'); }
3、限制Token的訪問範圍
通過限制Token的訪問範圍,可以僅允許特定的客戶端或IP地址使用Token,從而降低被盜用的風險。可以在有效負載中為每個客戶端或IP地址添加一個唯一標識符,然後僅允許具有該標識符的請求使用Token。
//使用JWT庫生成Token,限制訪問範圍為IP地址為192.168.0.1的客戶端 const jwt = require('jsonwebtoken'); const token = jwt.sign({ user_id: 123, client_id: '12345', ip_address: '192.168.0.1' }, 'secret', { expiresIn: '1h' });
在接收到令牌時,應該驗證令牌中的客戶端標識符和IP地址是否與請求中的相同,如果不同,則應該認為令牌無效。
//使用JWT庫驗證Token的客戶端標識符和IP地址 const jwt = require('jsonwebtoken'); const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMjMsImNsaWVudF9pZCI6IjEyMzQ1IiwiaXNfYWRkcmVzcyI6IjE5Mi4xNjguMC4xIn0.rXXPOnfzrYoTkw_bI60moQK5N6SnB9-8hQVw-VJtmCM'; const secret = 'secret'; if (client_id === prev_token_client_id && ip_address === prev_token_ip_address) { const decodedToken = jwt.verify(token, secret); const { user_id } = decodedToken; console.log(user_id); } else { console.log('Token已失效'); }
三、結論
通過設置令牌過期時間、限制Token的使用次數和訪問範圍,可以在一定程度上避免JWT Token被盜用的風險。但是,仍然需要對應用程序的安全性進行全面評估和測試,以避免其他潛在的漏洞。
原創文章,作者:WYYGP,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/332681.html