1烫止、JWT 簡介
Json web token (JWT)奈泪,是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境聲明而執(zhí)行的一種基于 JSON 的開放標(biāo)準(zhǔn)绒北。特別適用于分布式站點(diǎn)的單點(diǎn)登錄 (SSO)黎侈,用于認(rèn)證用戶身份信息。
1.1闷游、起源
JWT 的起源還有從傳統(tǒng)的 session 認(rèn)證說起峻汉。
1.1.1、傳統(tǒng) session 認(rèn)證及其弊病
http 協(xié)議本身是無狀態(tài)的協(xié)議脐往,正常的若要識別用戶身份信息俱济,就需要每次 http 請求都攜帶用戶賬戶和密碼信息,這顯然不合理钙勃。傳統(tǒng)的 session 認(rèn)證模式如下:
傳統(tǒng)的 seesion 認(rèn)證存在的問題:
1)用戶信息存儲在內(nèi)存中蛛碌,用戶規(guī)模大之后增加服務(wù)器開銷;
2)由于登錄信息存儲在內(nèi)存中辖源,限制了登錄機(jī)器蔚携,不利于分布式站點(diǎn)。
1.1.2克饶、JWT 認(rèn)證流程
常規(guī)的 JWT 認(rèn)證流程如下如:
相比于 session 認(rèn)證酝蜒,JWT 省去了服務(wù)器存儲用戶信息的過程。
1.2矾湃、JWT 格式
下圖是 JWT 的格式與內(nèi)容 https://jwt.io :
如上圖亡脑,左邊的為一個 JWT 示例,它是由點(diǎn)號拼接三個字符串組合而成。紅色的是 header 部分霉咨,紫色的是 payload 部分蛙紫,藍(lán)色的 signature 部分。
JWT 格式是:
xxxx
.yyyy
.zzzz
1.2.1 header 部分
JWT 的頭部包含兩部分信息:
1)類型聲明途戒,這里是 JWT坑傅;
2)聲明的加密算法,這里是 HS256喷斋。
上圖的右邊紅色部分如下:
{
"alg": "HS256",
"typ": "JWT"
}
通過 base64
加密之后唁毒,形成圖片中左邊的第一段字符串 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
。
1.2.2 payload 部分
JWT 的載荷部分存放有效信息星爪,一般由三部分組成:
1)標(biāo)準(zhǔn)注冊聲明浆西;
2)公用聲明;
3)私有聲明顽腾。
標(biāo)準(zhǔn)注冊聲明
iss: jwt簽發(fā)者
sub: jwt所面向的用戶
aud: 接收jwt的一方
exp: jwt的過期時間室谚,這個過期時間必須要大于簽發(fā)時間
nbf: 定義在什么時間之前,該jwt都是不可用的.
iat: jwt的簽發(fā)時間
jti: jwt的唯一身份標(biāo)識崔泵,主要用來作為一次性token,從而回避重放攻擊
一般常用于校驗(yàn)的有 iat
秒赤,exp
,nbf
校驗(yàn) token 是否過期憎瘸。
公有聲明
該出可以存放任何信息入篮,例如個性化校驗(yàn)的身份信息等。
私有聲明
由于改部分是通過 base64 進(jìn)行加密的幌甘,可以反解潮售,不建議存儲任何隱秘信息。
JWT 的第二部分字符串是通過 base64
算法對 payload 信息進(jìn)行加密锅风。
1.2.3 signature
JWT 的簽名部分酥诽,有圖片中顯示的可以看出該部分是服務(wù)器利用頭部的加密算法和私鑰對頭部和載荷部分的信息進(jìn)行加密。
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
your-secret-key)
通過加密皱埠,形成 token 的第三部分字符串肮帐。
1.3、JWT 常見校驗(yàn)流程
其中設(shè)置 payload 校驗(yàn)規(guī)則一般是檢查
nbf
边器、exp
以及用戶自定義的一些字段训枢。
2、單點(diǎn)登錄介紹
2.1忘巧、基于 cookie 的單點(diǎn)登錄
一般服務(wù)器在用戶登錄之后恒界,會將 JWT 字符串作為登錄請求的 Cookie 的一部分返回給用戶,這樣在 Cookie 失效或者被刪除之前砚嘴,用戶每次訪問引用十酣,應(yīng)用都會借口到含有 JWT 字符串信息的 Cookie涩拙,此時便可以取出 JWT 進(jìn)行校驗(yàn)。
為了在多個域名下共享登錄信息耸采,例如:
abc.mycompany.com;
dfs.mycompany.com;
dfs.mycompany.com兴泥;
login.mycompany.com;
當(dāng)用戶在 login.mycompany.com 登錄之后洋幻,可以設(shè)置如下 Cookie:
Set-Cookie: jwt=lll.zzz.xxx; HttpOnly; max-age=980000; domain=.mycompany.com
將 domain 設(shè)置為 .mycompany.com
,這樣所有滿足 *.mycompany.com
的域名都可以結(jié)構(gòu)該 Cookie翅娶,并獲取 JWT文留。
2.2、多頂級域名下的單點(diǎn)登錄
基于 cookie 的單點(diǎn)登錄模式有一個弊病在于竭沫,其對應(yīng)的多個站點(diǎn)的頂級域名必須相同燥翅。為了解決多頂級域名的站點(diǎn)單點(diǎn)登錄,內(nèi)部開發(fā)了一套登錄模塊蜕提,其架構(gòu)如下:
單點(diǎn)登錄的流程如下:
轉(zhuǎn)載整理自
[1]: 什么是 JWT -- JSON WEB TOKEN
[2]: 八幅漫畫理解使用 JSON Web Token 設(shè)計單點(diǎn)登錄系統(tǒng)