JWT(JSON Web Token)是一個開放的行業(yè)標準,它定義了一種簡潔的,自包含的協(xié)議格式,用于在通信雙方傳遞json對象,傳遞的信息經(jīng)過數(shù)字簽名可以被驗證和信任。JWT可以使用HMAC算法或使用RSA的公鑰/私鑰對來簽名,防止被篡改
JWT令牌的優(yōu)點
1.JWT基于json,非常方便解析
2.可以在令牌中自定義豐富的內(nèi)容,易于擴展
3.通過非對稱加密算法及數(shù)字簽名技術(shù),JWT防止篡改,安全性高
JWT令牌結(jié)構(gòu):
JWT令牌由Header、PAyload、Signature三部分組成,每部分中間使用點(.)分隔,比如
xxxxx.yyyyy.zzzzz
1.Header
頭部包括令牌的類型(即JWT)及使用的哈希算法(如HMAC、HA256、RSA)
{“alg”:"HS256","typ":"JWT"}
2.Payload
負載,內(nèi)容也是一個json對象,他是存放有效信息的地方,它可以存放jwt提供的現(xiàn)成字段
例如:iss(簽發(fā)者),exp(過期時間戳),sub(面向的用戶)
{"sub","1234567890","name":"456","admin":"true"}
3.Signture
第三部分是簽名,此部分用于防止jwt內(nèi)容被篡改。這個部分使用base64url將前兩部分進行編碼,編碼后使用點(.)連接組成字符串,最后使用header中聲明簽名算法進行簽名
一個例子:
HMACSHA256(
base64UrlEncode(header)+ "."+base64UrlEncode(payload)+"."+secret)
base64UrlEncode(header):JWT第一部分
base64UrlEncode(payload):JWT第二部分
secret:簽名所使用的私鑰
JWT三部分只有第三部分是加密的,通過數(shù)字簽名機制,我們既可以保證數(shù)據(jù)完整性,也可以對數(shù)據(jù)來源進行身份驗證。
什么是簽名?
簽名是數(shù)字簽名,發(fā)送方將消息原文使用摘要算法生成摘要,再使用私鑰對摘要進行加密,生成數(shù)字簽名。
傳輸是數(shù)字簽名,發(fā)送方將信息原文使用摘要算法生成摘要,再用私鑰對摘要進行加密,生成數(shù)字簽名
1.發(fā)送方使用私鑰對內(nèi)容進行數(shù)字簽名
2.將內(nèi)容附帶數(shù)字簽名發(fā)送給對方
3.對方收到內(nèi)容和數(shù)字簽名,使用公鑰進行驗簽(相當于解密過程的過程),如果發(fā)現(xiàn)不一致則說明傳輸過程被篡改