JWT 全稱 JSON Web Token,是一個設計規(guī)范,這個規(guī)范允許我們使用JWT在客戶端和服務器之間傳遞安全可靠的信息煌集。換句話說,服務器接收到JWT之后捌省,可以驗證它的合法性苫纤。
1. JWT 的組成
JWT本質上是一個字符串,一個完整的JWT由三部分組成纲缓,頭部(header), 荷載(Payload), 和簽名(Signature)卷拘,中間用.
隔開,如下是一個典型的JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
其中頭部和荷載使用了base64編碼色徘,分別解碼之后得到兩個JSON串:
//頭部
{
"alg": "HS256",
"typ": "JWT"
}
alg字段為加密算法恭金。
//荷載
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
荷載的字段及含義:
- iss: 該JWT的簽發(fā)者
- sub: 該JWT所面向的用戶
- aud: 接收該JWT的一方
- exp(expires): 什么時候過期,這里是一個Unix時間戳
- iat(issued at): 在什么時候簽發(fā)的
而第三部分簽名則不能使用base64解碼出來褂策,該部分用于驗證頭部和荷載數(shù)據(jù)的完整性横腿。
2. 如何生成 JWT
- 生成頭部header
- 生成荷載payload
- 生成簽名signature
signature = encode(base64(header) + '.' + base64(payload), secret) - JWT = header.payload.signatrue
注:encode是header.alg指定的加密算法;secret為密鑰斤寂,需要妥善保存耿焊。
3. 如何驗證一個 JWT 的合法性
在得到一個 JWT 串之后,如何驗證它攜帶的信息是否可靠呢(假設該串為:header.payload.signatyre)遍搞,我們只需要:
- base64 解碼 header 得到加密算法 encode罗侯;
- 計算vercode = encode(header.payload, secret);
- 驗證 vercode 和 signatyre 是否匹配
4. 應用
JWT可作為Token,用于單點登陸溪猿;相比普通的Token钩杰,它的優(yōu)勢在于服務器無需使用額外的存儲空間來保存Token纫塌,因為使用生成JWT時的secret,就可以驗證JWT的合法性讲弄。
JWT的安全性建立在加密方密鑰的安全性之上措左。若服務端使用JWT作為Token來鑒別用戶身份,而密鑰泄漏的話避除,得到密鑰的人便可以為任意用戶生成合法的Token怎披,進而冒充他們與服務端交互。