像博主一樣從完全不懂到懵懂的一小步。
為什么要提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等文章,敬請期待。
文章延伸閱讀