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,從而回避重放攻擊
一般常用于校驗的有 iat,exp,nbf 校驗 token 是否過期。
公有聲明
該出可以存放任何信息,例如個性化校驗的身份信息等。
私有聲明
由于改部分是通過 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 常見校驗流程

其中設(shè)置 payload 校驗規(guī)則一般是檢查
nbf、exp 以及用戶自定義的一些字段。
2、單點(diǎn)登錄介紹
2.1、基于 cookie 的單點(diǎn)登錄
一般服務(wù)器在用戶登錄之后,會將 JWT 字符串作為登錄請求的 Cookie 的一部分返回給用戶,這樣在 Cookie 失效或者被刪除之前,用戶每次訪問引用,應(yīng)用都會借口到含有 JWT 字符串信息的 Cookie,此時便可以取出 JWT 進(jì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)