在現代網頁應用程式中,使用者驗證與授權是一個非常重要的議題。JSON Web Token (JWT) 是一種開放標準(RFC 7519),它用來傳遞訊息並且可以確保訊息的完整性以及發送者的身份。JWT通常被用在單一登入系統、API認證以及機密資料的交換。本文將詳細介紹JWT的基本概念、結構、安全性特徵以及如何使用JWT進行驗證。
JWT的結構
一個典型的JWT由三個部分組成,每個部分以點號「.」分隔:
- Header – 這個部分包含了JWT的類型(`typ=JWT`)以及使用的簽名演算法(例如 `alg=HS256`)。
- Payload – 這部分包含了實體資訊,有兩種類型的有效負載:標準聲明(reserved claims)和定義自訂的聲明。標準聲明包含iss(簽發者)、sub(主題)、aud(受衆)、exp(過期時間戳)、nbf(生效前時間戳)、iat(簽發時間戳)和jti(JWT標識符)。
- Signature – 這是為了保護JWT不被篡改而產生的。它的生成方式如下:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
這裡`secret`是服務端持有的私密金鑰,`header`和`payload`是經過Base64編碼後的字串。
JWT的安全性考量
雖然JWT提供了許多好處,但它並不是完全安全的,開發人員需要特別注意以下幾點:
- 過期的Token – 確保所有的JWT都有合理的過期時間,避免永不過期的Token。
- 加密的內容 – 敏感資料不應該放在有效負載中,因為它是未經加密的。如果需要加密的資料,可以使用JWE(JSON Web Encryption)標準。
- 私密的金鑰 – 保存JWT簽名的私密金鑰必須嚴格保密,否則攻擊者可能會攔截JWT並修改其內容或延長其有效期限。
- 防重播攻擊 – 每次用戶端請求時,服務器都應該重新計算JWT的有效性,而不是盲目信任收到的JWT。
- 額外的安全特性 – 考慮使用額外的安全特性,如加鹽哈希(salted hashes)、時間戳記(timestamps)或其他反欺詐措施。
JWT的使用案例
當您想要實現下列需求時,JWT可能是適合的解決方案:
- 單一登錄系統(Single Sign On)
- API認證,允許客戶端使用JWT訪問受保護的資源。
- 在不同域之間傳遞使用者資訊。
- 作為OAuth 2.0協議的一部分,用於授權碼模式(Authorization Code Grant Type)或隱式授予模式(Implicit Grant Type)。
JWT的實作範例
下面是一個簡化的範例,展示瞭如何在Node.js環境下使用JWT進行用戶端的認證流程:
首先,我們需要在服務端建立一個API來創建和管理JWT。假設我們有一個已登錄的使用者,我們想為他創建一個有效的JWT:
const jwt = require('jsonwebtoken');
// ...其他依賴庫...
function createToken(userId) {
let payload = {
subject: userId, // 用戶ID
iat: Math.floor(Date.now() / 1000), // 簽發時間
exp: Math.floor(Date.now() / 1000) + (60 * 60), // 1小時後到期
};
return jwt.sign(payload, 'your_private_key', { algorithm: 'HS256' });
}
module.exports = { createToken };
接著,當前端用戶端成功通過身份驗證後,服務器會返回一個有效的JWT給用戶端:
app.post('/login', function(req, res) {
if (validCredentials(req.body)) {
var token = createToken(userIdFromReqBody);
res.send({token});
} else {
res.status(401).send('Invalid credentials!');
}
});
最後,用戶端收到JWT之後,可以在每一個對應的路徑上加上`Authorization: Bearer `頭部參數來存取受保護的資源:
fetch('/protectedResource', {
method: 'GET',
headers: new Headers({
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + your_jwt
})
});
總結來說,JWT提供了一個輕量級且靈活的標準來處理應用程式的認證問題。然而,在使用JWT時,務必遵守最佳實踐和安全準則,以便更好地保護您的應用程式免受潛在的威脅。