像博主一樣從完全不懂到懵懂的一小步拉庶。
為什么要提JWT氏仗?
其實(shí)一開始看到這個名字我是拒絕的夺鲜,就好像讓一個一直努力碼代碼的前端新人來擁抱模塊化編程一樣币励,
我為什么要知道它,為什么它就那么好流炕?
言歸正傳,JWT 全稱 JSON WEB TOKEN剑辫,是一套開放的標(biāo)準(zhǔn)(RFC 7519)揭斧,它定義了一套簡潔的(compact)峻堰、自包含的(self-contained)方案捐名,來讓我們安全地在客戶端和服務(wù)器之間傳遞 JSON 格式的信息。
說白了成艘,就是一種基于 token 的認(rèn)證方案淆两。
基于token
或許在這個意義上拂酣,你需要自行百度了解一些概念:?
SPA 單頁面應(yīng)用婶熬,RESTful風(fēng)格API,CRSF虽另,OAuth 2.0
上述提及的概念比較多饺谬,但是如果不了解一下就會回到全文最開始的悖論。簡而言之商蕴,SPA單頁面應(yīng)用對用戶體驗(yàn)的較之服務(wù)端渲染要好的多,成為前端開發(fā)發(fā)展的一個重要的趨勢苛谷,而隨之而來的安全方面的考慮則變得尤為重要起來格郁。
目前的SPA單頁面應(yīng)用獲取數(shù)據(jù)大多是通過類AJAX的方式傳輸?shù)模铱紤]到負(fù)載均衡的各方面因素锣尉,很難使用原始的服務(wù)端section的方式儲存各類驗(yàn)證信息自沧。所以基于token的驗(yàn)證方式應(yīng)運(yùn)而生。
Token Auth 機(jī)制優(yōu)勢?
1. 支持跨域
2. 無狀態(tài)
3. 更適用于移動應(yīng)用(當(dāng)客戶端是原生應(yīng)用時爱谁,Cookie支持不佳)
4. 安全性更強(qiáng)访敌,可以防范常見的CSRF(跨站請求偽造)
5. 有完善的業(yè)界標(biāo)準(zhǔn)(后文將提到的JWT)
其實(shí)優(yōu)勢自然還有很多寺旺,這里不一一列舉势决,總而言之,Token Auth機(jī)制的好處非常多,尤其是在SPA單頁面應(yīng)用上有著無可替代的位置。
JWT的基本概念
說了那么多廢話耘沼,就是為了主角JWT菠隆,作為Token Auth 機(jī)制的一種業(yè)內(nèi)標(biāo)準(zhǔn)骇径,JWT這種基于json格式傳輸數(shù)據(jù)的驗(yàn)證方式使得其應(yīng)用場景非常之多(json格式的好處不必多說了哈)破衔。
JWT 由三部分組成:header / payload / signature
三個部分中間用點(diǎn)分隔開钱烟,并且都使用 Base64 編碼读第,所以生成的 Token 類似這樣:
ewogICJ0eXAiOiAiSldUIiwKICAiYWxnIjogIkhTMjU2Igp9.ewogImlzcyI6ICJjaGJsb2dzLmNvbSIsCiAiZXhwIjogIjE0NzA3MzAxODIiLAogInVpZCI6ICIxMjM0NWFiY2RlIiwKfQ.9q2eq8sa374ao2uq9607r6qu6
(內(nèi)心os:什么鬼父泳,別急惠窄,待我一一道來)
1. Header?
首先聲明一個 JSON 對象浇坐,對象里有一個 type 屬性,值為 JWT ,以及 alg 屬性觉渴,值為 HS256座韵,表明最終使用的加密算法是 HS256誉碴。
{
? "alg": "HS256",
? "type": "JWT"
}
2. Payload
Payload 里面是 Token 的具體內(nèi)容,這部分內(nèi)容可以自定義蹈丸,JWT有標(biāo)準(zhǔn)字段奋岁,也可以添加其它需要的內(nèi)容闻伶。
標(biāo)準(zhǔn)字段:
iss:Issuer虾攻,發(fā)行者
sub:Subject奇钞,主題
aud:Audience景埃,觀眾
exp:Expiration time,過期時間
nbf:Not before
iat:Issued at完慧,發(fā)行時間
jti:JWT ID
這是一個典型的payload信息屈尼,包含了發(fā)行者(網(wǎng)站)、過期時間和用戶id:
{
"iss": "jianshu.com",
"exp": "1470730182",
"uid": "12345abcde",
}
這部分內(nèi)容同樣要用Base64 編碼鞭执,生成編碼類似如下格式:
ewogImlzcyI6ICJjaGJsb2dzLmNvbSIsCiAiZXhwIjogIjE0NzA3MzAxODIiLAogInVpZCI6ICIxMjM0NWFiY2RlIiwKfQ==
3. Signature
它由前面在 Header 指定的算法 HS256 加密兩個參數(shù)構(gòu)成,第一個參數(shù)是經(jīng)過編碼的 Header 與經(jīng)過編碼的 Payload 通過 . 連接之后的字符串囤热,第二個參數(shù)是生成的密鑰锨苏,會由服務(wù)器保存贞谓。每次服務(wù)器接收到 token 之后裸弦,也是先解密出用于驗(yàn)證的用戶信息以及密鑰晕城,再與自己保存的密鑰對比是否相同窖贤,以此來驗(yàn)證用戶的身份。
將Base64編碼后的Header和Payload用.連接在一起
ewogICJ0eXAiOiAiSldUIiwKICAiYWxnIjogIkhTMjU2Igp9.ewogImlzcyI6ICJjaGJsb2dzLmNvbSIsCiAiZXhwIjogIjE0NzA3MzAxODIiLAogInVpZCI6ICIxMjM0NWFiY2RlIiwKfQ
接下來物咳,可能會寫JWT的工作流程以及如何使用JWT等文章,敬請期待焕济。
文章延伸閱讀