JWT簡介
JWT(json web token)是為了在網(wǎng)絡應用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標準墓臭。
JWT的聲明一般被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息镀虐,以便于從資源服務器獲取資源泪幌。比如用在用戶登錄上。
在傳統(tǒng)的用戶登錄認證中传轰,因為http是無狀態(tài)的俊马,所以都是采用session方式纵竖。用戶登錄成功,服務端會保證一個session腔剂,當然會給客戶端一個sessionId媒区,客戶端會把sessionId保存在cookie中,每次請求都會攜帶這個sessionId掸犬。
圖片來源于網(wǎng)絡博客
cookie+session這種模式通常是保存在內(nèi)存中袜漩,而且服務從單服務到多服務會面臨的session共享問題,隨著用戶量的增多湾碎,開銷就會越大宙攻。而JWT不是這樣的,只需要服務端生成token介褥,客戶端保存這個token座掘,每次請求攜帶這個token递惋,服務端認證解析就可。
圖片來源于網(wǎng)絡博客
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJvcmciOiLku4rml6XlpLTmnaEiLCJuYW1lIjoiRnJlZeeggeWGnCIsImV4cCI6MTUxNDM1NjEwMywiaWF0IjoxNTE0MzU2MDQzLCJhZ2UiOiIyOCJ9.49UF72vSkj-sA4aHHiYN5eoZ9Nb4w5Vb45PsLF7x_NY
第一部分我們稱它為頭部(header),第二部分我們稱其為載荷(payload)溢陪,第三部分是簽證(signature)萍虽。
header
jwt的頭部承載兩部分信息:
聲明類型,這里是jwt
聲明加密的算法 通常直接使用 HMAC SHA256
完整的頭部就像下面這樣的JSON:
{
"typ": "JWT",
"alg": "HS256"
}
然后將頭部進行base64加密(該加密是可以對稱解密的),構成了第一部分:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
playload
載荷就是存放有效信息的地方形真。這個名字像是特指飛機上承載的貨品杉编,這些有效信息包含三個部分
標準中注冊的聲明
公共的聲明
私有的聲明
標準中注冊的聲明?(建議但不強制使用) :
iss: jwt簽發(fā)者
sub: jwt所面向的用戶
aud: 接收jwt的一方
exp: jwt的過期時間,這個過期時間必須要大于簽發(fā)時間
nbf: 定義在什么時間之前咆霜,該jwt都是不可用的.
iat: jwt的簽發(fā)時間
jti: jwt的唯一身份標識邓馒,主要用來作為一次性token,從而回避重放攻擊。
公共的聲明 :
公共的聲明可以添加任何的信息蛾坯,一般添加用戶的相關信息或其他業(yè)務需要的必要信息.但不建議添加敏感信息光酣,因為該部分在客戶端可解密.
私有的聲明 :
私有聲明是提供者和消費者所共同定義的聲明,一般不建議存放敏感信息偿衰,因為base64是對稱解密的挂疆,意味著該部分信息可以歸類為明文信息。
定義一個payload:
{
"name":"Free碼農(nóng)",
"age":"28",
"org":"今日頭條"
}
然后將其進行base64加密下翎,得到Jwt的第二部分:
eyJvcmciOiLku4rml6XlpLTmnaEiLCJuYW1lIjoiRnJlZeeggeWGnCIsImV4cCI6MTUxNDM1NjEwMywiaWF0IjoxNTE0MzU2MDQzLCJhZ2UiOiIyOCJ9
signature
jwt的第三部分是一個簽證信息缤言,這個簽證信息由三部分組成:
header (base64后的)
payload (base64后的)
secret
這個部分需要base64加密后的header和base64加密后的payload使用.連接組成的字符串,然后通過header中聲明的加密方式進行加鹽secret組合加密视事,然后就構成了jwt的第三部分:
49UF72vSkj-sA4aHHiYN5eoZ9Nb4w5Vb45PsLF7x_NY
密鑰secret是保存在服務端的胆萧,服務端會根據(jù)這個密鑰進行生成token和驗證,所以需要保護好俐东。
JWT總結(jié)
1跌穗、因為json的通用性,所以JWT是可以進行跨語言支持的虏辫,像JAVA,JavaScript,NodeJS,PHP等很多語言都可以使用蚌吸。
2、payload部分砌庄,JWT可以在自身存儲一些其他業(yè)務邏輯所必要的非敏感信息羹唠。
3、便于傳輸娄昆,jwt的構成非常簡單佩微,字節(jié)占用很小,所以它是非常便于傳輸?shù)拿妊妗K恍枰诜斩吮4鏁捫畔? 所以它易于應用的擴展哺眯。