基于 JWT 的單點(diǎn)登錄設(shè)計

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) 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)證流程如下如:


JWT 認(rèn)證

相比于 session 認(rèn)證酝蜒,JWT 省去了服務(wù)器存儲用戶信息的過程。

1.2矾湃、JWT 格式

下圖是 JWT 的格式與內(nèi)容 https://jwt.io

JWT 格式

如上圖亡脑,左邊的為一個 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秒赤,expnbf 校驗(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)流程

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)登錄系統(tǒng)架構(gòu)

單點(diǎn)登錄的流程如下:


單點(diǎn)登錄路程

轉(zhuǎn)載整理自
[1]: 什么是 JWT -- JSON WEB TOKEN
[2]: 八幅漫畫理解使用 JSON Web Token 設(shè)計單點(diǎn)登錄系統(tǒng)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末森书,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子谎势,更是在濱河造成了極大的恐慌凛膏,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脏榆,死亡現(xiàn)場離奇詭異猖毫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)须喂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門吁断,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人坞生,你說我怎么就攤上這事仔役。” “怎么了是己?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵又兵,是天一觀的道長。 經(jīng)常有香客問我卒废,道長寒波,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任升熊,我火速辦了婚禮俄烁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘级野。我一直安慰自己页屠,他們只是感情好粹胯,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辰企,像睡著了一般风纠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上牢贸,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天竹观,我揣著相機(jī)與錄音,去河邊找鬼潜索。 笑死臭增,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的竹习。 我是一名探鬼主播誊抛,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼整陌!你這毒婦竟也來了拗窃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤泌辫,失蹤者是張志新(化名)和其女友劉穎随夸,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體震放,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逃魄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了澜搅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伍俘。...
    茶點(diǎn)故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖勉躺,靈堂內(nèi)的尸體忽然破棺而出癌瘾,到底是詐尸還是另有隱情,我是刑警寧澤饵溅,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布妨退,位于F島的核電站,受9級特大地震影響蜕企,放射性物質(zhì)發(fā)生泄漏咬荷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一轻掩、第九天 我趴在偏房一處隱蔽的房頂上張望幸乒。 院中可真熱鬧,春花似錦唇牧、人聲如沸罕扎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腔召。三九已至杆查,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間臀蛛,已是汗流浹背亲桦。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浊仆,地道東北人客峭。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像氧卧,于是被迫代替她去往敵國和親桃笙。 傳聞我的和親對象是個殘疾皇子氏堤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容