如何才能初步的理解JWT?

像博主一樣從完全不懂到懵懂的一小步。

為什么要提JWT?

其實(shí)一開始看到這個(gè)名字我是拒絕的,就好像讓一個(gè)一直努力碼代碼的前端新人來擁抱模塊化編程一樣,

我為什么要知道它,為什么它就那么好?

言歸正傳,JWT 全稱 JSON WEB TOKEN,是一套開放的標(biāo)準(zhǔn)(RFC 7519),它定義了一套簡潔的(compact)、自包含的(self-contained)方案,來讓我們安全地在客戶端和服務(wù)器之間傳遞 JSON 格式的信息。

說白了,就是一種基于 token 的認(rèn)證方案。

基于token

或許在這個(gè)意義上,你需要自行百度了解一些概念:?

SPA 單頁面應(yīng)用,RESTful風(fēng)格API,CRSF,OAuth 2.0

上述提及的概念比較多,但是如果不了解一下就會(huì)回到全文最開始的悖論。簡而言之,SPA單頁面應(yīng)用對用戶體驗(yàn)的較之服務(wù)端渲染要好的多,成為前端開發(fā)發(fā)展的一個(gè)重要的趨勢,而隨之而來的安全方面的考慮則變得尤為重要起來。

目前的SPA單頁面應(yīng)用獲取數(shù)據(jù)大多是通過類AJAX的方式傳輸?shù)模铱紤]到負(fù)載均衡的各方面因素,很難使用原始的服務(wù)端section的方式儲(chǔ)存各類驗(yàn)證信息。所以基于token的驗(yàn)證方式應(yīng)運(yùn)而生。

Token Auth 機(jī)制優(yōu)勢?

1. 支持跨域

2. 無狀態(tài)

3. 更適用于移動(dòng)應(yīng)用(當(dāng)客戶端是原生應(yīng)用時(shí),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

三個(gè)部分中間用點(diǎn)分隔開,并且都使用 Base64 編碼,所以生成的 Token 類似這樣:

ewogICJ0eXAiOiAiSldUIiwKICAiYWxnIjogIkhTMjU2Igp9.ewogImlzcyI6ICJjaGJsb2dzLmNvbSIsCiAiZXhwIjogIjE0NzA3MzAxODIiLAogInVpZCI6ICIxMjM0NWFiY2RlIiwKfQ.9q2eq8sa374ao2uq9607r6qu6

(內(nèi)心os:什么鬼,別急,待我一一道來)

1. Header?

首先聲明一個(gè) JSON 對象,對象里有一個(gè) 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,過期時(shí)間

nbf:Not before

iat:Issued at,發(fā)行時(shí)間

jti:JWT ID

這是一個(gè)典型的payload信息,包含了發(fā)行者(網(wǎng)站)、過期時(shí)間和用戶id:

{

"iss": "jianshu.com",

"exp": "1470730182",

"uid": "12345abcde",

}

這部分內(nèi)容同樣要用Base64 編碼,生成編碼類似如下格式:

ewogImlzcyI6ICJjaGJsb2dzLmNvbSIsCiAiZXhwIjogIjE0NzA3MzAxODIiLAogInVpZCI6ICIxMjM0NWFiY2RlIiwKfQ==

3. Signature

它由前面在 Header 指定的算法 HS256 加密兩個(gè)參數(shù)構(gòu)成,第一個(gè)參數(shù)是經(jīng)過編碼的 Header 與經(jīng)過編碼的 Payload 通過 . 連接之后的字符串,第二個(gè)參數(shù)是生成的密鑰,會(huì)由服務(wù)器保存。每次服務(wù)器接收到 token 之后,也是先解密出用于驗(yàn)證的用戶信息以及密鑰,再與自己保存的密鑰對比是否相同,以此來驗(yàn)證用戶的身份。

將Base64編碼后的Header和Payload用.連接在一起

ewogICJ0eXAiOiAiSldUIiwKICAiYWxnIjogIkhTMjU2Igp9.ewogImlzcyI6ICJjaGJsb2dzLmNvbSIsCiAiZXhwIjogIjE0NzA3MzAxODIiLAogInVpZCI6ICIxMjM0NWFiY2RlIiwKfQ

接下來,可能會(huì)寫JWT的工作流程以及如何使用JWT等文章,敬請期待。

文章延伸閱讀

深入RESTful無狀態(tài)原則

RESTful_基礎(chǔ)知識(shí)

理解OAuth 2.0

Server 端的認(rèn)證——擁抱 JWT(一)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容