JWT 詳解
JWT是為了在網(wǎng)絡(luò)應(yīng)用中柠逞,前后端交付中,進(jìn)行頁面?zhèn)髦档囊环N手段璧亮。
該TOKEN 設(shè)計(jì)緊湊萧诫,安全,適用于分布式站點(diǎn)的單點(diǎn)登錄枝嘶。
起源
傳統(tǒng)的HTTP協(xié)議是無狀態(tài)的帘饶,一個(gè)用戶,只能保存一份用戶信息群扶。
這份登錄信息及刻,會(huì)在傳遞的時(shí)候,無狀態(tài)的傳遞給瀏覽器竞阐,告訴其保存為cookie缴饭。以便下次的時(shí)候,告訴那個(gè)用戶骆莹。
即傳統(tǒng)的給予session的前后端認(rèn)證茴扁。
基于Token的鑒權(quán)機(jī)制⊥舸基于token的鑒權(quán)機(jī)制,類似于HTTP也是無狀態(tài)的毁习,不需要服務(wù)端保留智嚷,用戶的信息。意味著token認(rèn)證機(jī)制纺且,不需要考慮在那臺(tái)機(jī)器上登錄了盏道。
具體的流程如下
- 用戶使用用戶名密碼請(qǐng)求服務(wù)器。
- 服務(wù)器驗(yàn)證载碌,用戶信息猜嘱。
- 服務(wù)器通過認(rèn)證打洼,頒發(fā)token
- 客戶端保存token涯竟。每次請(qǐng)求附帶token罗丰。
- 服務(wù)器端驗(yàn)證token值榛丢,并返回?cái)?shù)據(jù)筋蓖。
JWT 長什么樣子
由三部分組成拼窥。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
構(gòu)成
第一部分我們稱它為頭部(header),第二部分我們稱其為載荷(payload, 類似于飛機(jī)上承載的物品)殖演,第三部分是簽證(signature).
頭部
聲明類型假栓,這里是jwt
聲明加密的算法 通常直接使用 HMAC SHA256
對(duì)頭部進(jìn)行加密
{
'typ': 'JWT',
'alg': 'HS256'
}
然后進(jìn)行base64加密
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
playload
保存有效信息的地方。
通常包含三個(gè)部分
標(biāo)準(zhǔn)中注冊(cè)的聲明
公共的聲明
私有的聲明
標(biāo)準(zhǔn)中注冊(cè)的聲明
iss: jwt簽發(fā)者
sub: jwt所面向的用戶
aud: 接收jwt的一方
exp: jwt的過期時(shí)間点晴,這個(gè)過期時(shí)間必須要大于簽發(fā)時(shí)間
nbf: 定義在什么時(shí)間之前感凤,該jwt都是不可用的.
iat: jwt的簽發(fā)時(shí)間
jti: jwt的唯一身份標(biāo)識(shí),主要用來作為一次性token,從而回避重放攻擊粒督。
公共的聲明 :
公共的聲明可以添加任何的信息陪竿,一般添加用戶的相關(guān)信息或其他業(yè)務(wù)需要的必要信息.但不建議添加敏感信息,因?yàn)樵摬糠衷诳蛻舳丝山饷?
私有的聲明 :
私有聲明是提供者和消費(fèi)者所共同定義的聲明屠橄,一般不建議存放敏感信息族跛,因?yàn)閎ase64是對(duì)稱解密的,意味著該部分信息可以歸類為明文信息仇矾。
signature
用于驗(yàn)證jwt是否發(fā)生了改變庸蔼。
通過秘鑰加密,實(shí)現(xiàn)jwt是否發(fā)生了更改
// javascript
var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);
var signature = HMACSHA256(encodedString, 'secret'); // TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
這樣通過加密實(shí)現(xiàn)了base64位的加密
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
應(yīng)用
Authorization 加上 Bearer 標(biāo)注
[圖片上傳失敗...(image-8b52c9-1591108370379)]