javascript
JWT(JSON Web Token)简介
文章目錄
- 一、JWT是什么
- 二、跨域認(rèn)證問(wèn)題
- 三、JWT原理
- 四、JWT數(shù)據(jù)結(jié)構(gòu)
- 1、header(頭部)
- 2、Payload(負(fù)載)
- 3、Signature
- 五、JWT是如何工作的
一、JWT是什么
JSON Web Token (JWT)是一個(gè)開(kāi)放標(biāo)準(zhǔn)(RFC 7519),它定義了一種緊湊的、自包含的方式,用于作為JSON對(duì)象在各方之間安全地傳輸信息。該信息可以被驗(yàn)證和信任,因?yàn)樗菙?shù)字簽名的。
二、跨域認(rèn)證問(wèn)題
互聯(lián)網(wǎng)服務(wù)離不開(kāi)用戶認(rèn)證,一般流程如下:
這種模式的問(wèn)題在于,擴(kuò)展性(scaling)不好。單機(jī)當(dāng)然沒(méi)有問(wèn)題,如果是服務(wù)器集群,或者是跨域的服務(wù)導(dǎo)向架構(gòu),就要求 session 數(shù)據(jù)共享,每臺(tái)服務(wù)器都能夠讀取 session。
一種解決方案是 session 數(shù)據(jù)持久化,寫入數(shù)據(jù)庫(kù)或別的持久層。各種服務(wù)收到請(qǐng)求后,都向持久層請(qǐng)求數(shù)據(jù)。這種方案的優(yōu)點(diǎn)是架構(gòu)清晰,缺點(diǎn)是工程量比較大。另外,持久層萬(wàn)一掛了,就會(huì)單點(diǎn)失敗。
另一種方案是服務(wù)器索性不保存 session 數(shù)據(jù)了,所有數(shù)據(jù)都保存在客戶端,每次請(qǐng)求都發(fā)回服務(wù)器。JWT 就是這種方案的一個(gè)代表。
三、JWT原理
JWT原理,服務(wù)器認(rèn)證以后,生成一個(gè) JSON 對(duì)象,發(fā)回給用戶,就像下面這樣
{"姓名": "張三","角色": "管理員","到期時(shí)間": "2018年7月1日0點(diǎn)0分" }以后,用戶與服務(wù)端通信的時(shí)候,都要發(fā)回這個(gè) JSON 對(duì)象。服務(wù)器完全只靠這個(gè)對(duì)象認(rèn)定用戶身份。為了防止用戶篡改數(shù)據(jù),服務(wù)器在生成這個(gè)對(duì)象的時(shí)候,會(huì)加上簽名(詳見(jiàn)后文)。
服務(wù)器就不保存任何 session 數(shù)據(jù)了,也就是說(shuō),服務(wù)器變成無(wú)狀態(tài)了,從而比較容易實(shí)現(xiàn)擴(kuò)展。
四、JWT數(shù)據(jù)結(jié)構(gòu)
實(shí)際返回給前端JWT數(shù)據(jù)結(jié)構(gòu)是這樣
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6I kpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7Hg Q是一個(gè)很長(zhǎng)的字符串,中間以(.)分割。注意JWT沒(méi)有換行的
JWT三部分如下:
Header(頭部) Payload(負(fù)載) Signature(簽名)1、header(頭部)
header典型的由兩部分組成:token的類型(“JWT”)和算法名稱(比如:HMAC SHA256或者RSA等等)。
{"alg": "HS256","typ": "JWT" }然后,用Base64對(duì)這個(gè)JSON編碼就得到JWT的第一部分
2、Payload(負(fù)載)
JWT的第二部分是payload,它包含聲明(要求)。聲明是關(guān)于實(shí)體(通常是用戶)和其他數(shù)據(jù)的聲明。聲明有三種類型: registered, public 和private
- Registered claims : 這里有一組預(yù)定義的聲明,它們不是強(qiáng)制的,但是推薦。比如:iss (issuer), exp (expiration time), sub (subject), aud (audience)等。
- Public claims : 可以隨意定義。
- Private claims : 用于在同意使用它們的各方之間共享信息,并且不是注冊(cè)的或公開(kāi)的聲明。
官方給了7個(gè)字段供選用
除了官方字段,你還可以在這個(gè)部分定義私有字段,下面就是一個(gè)例子。
{"sub": "1234567890","name": "John Doe","admin": true }注意,不要在JWT的payload或header中放置敏感信息,除非它們是加密的。
3、Signature
Signature 部分是對(duì)前兩部分的簽名,防止數(shù)據(jù)篡改。
首先,需要指定一個(gè)密鑰(secret)。這個(gè)密鑰只有服務(wù)器才知道,不能泄露給用戶。然后,使用 Header 里面指定的簽名算法(默認(rèn)是 HMAC SHA256),按照下面的公式產(chǎn)生簽名。
看一張官網(wǎng)的圖就明白了:
五、JWT是如何工作的
在認(rèn)證的時(shí)候,當(dāng)用戶用他們的憑證成功登錄以后,一個(gè)JSON Web Token將會(huì)被返回。此后,token就是用戶憑證了,你必須非常小心以防止出現(xiàn)安全問(wèn)題。一般而言,你保存令牌的時(shí)候不應(yīng)該超過(guò)你所需要它的時(shí)間。
無(wú)論何時(shí)用戶想要訪問(wèn)受保護(hù)的路由或者資源的時(shí)候,用戶代理(通常是瀏覽器)都應(yīng)該帶上JWT,典型的,通常放在Authorization header中,用Bearer schema。
header應(yīng)該看起來(lái)是這樣的:
Authorization: Bearer
服務(wù)器上的受保護(hù)的路由將會(huì)檢查Authorization header中的JWT是否有效,如果有效,則用戶可以訪問(wèn)受保護(hù)的資源。如果JWT包含足夠多的必需的數(shù)據(jù),那么就可以減少對(duì)某些操作的數(shù)據(jù)庫(kù)查詢的需要,盡管可能并不總是如此。
如果token是在授權(quán)頭(Authorization header)中發(fā)送的,那么跨源資源共享(CORS)將不會(huì)成為問(wèn)題,因?yàn)樗皇褂胏ookie。
鳴謝:
http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html https://www.cnblogs.com/cjsblog/p/9277677.html
總結(jié)
以上是生活随笔為你收集整理的JWT(JSON Web Token)简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Netty 框架学习(二):Delimi
- 下一篇: SpringSecruity整合Oaut