javascript
JSON Web Token (JWT),服务端信息传输安全解决方案
轉(zhuǎn)載自?JSON Web Token (JWT),服務(wù)端信息傳輸安全解決方案
JWT介紹
JSON Web Token(JWT)是一種開放標(biāo)準(zhǔn)(RFC 7519),它定義了一種緊湊獨(dú)立的基于JSON對(duì)象在各方之間安全地傳輸信息的方式。這些信息可以被驗(yàn)證和信任,因?yàn)樗菙?shù)字簽名的。JWTs可以使用一個(gè)密鑰(HMAC算法),或使用RSA的公鑰/私鑰密鑰對(duì)對(duì)信息進(jìn)行簽名。
讓我們進(jìn)一步解釋這個(gè)定義的一些概念。
緊湊
由于其較小的體積,JWTs可以通過URL、POST參數(shù)或HTTP頭部參數(shù)進(jìn)行傳遞,體積小也意味著其傳輸速度會(huì)相當(dāng)快。
獨(dú)立
有效負(fù)載包含了所需要的關(guān)于用戶的所有信息,避免了多次查詢數(shù)據(jù)庫的需要。
JWT的應(yīng)用場(chǎng)景
認(rèn)證
這是使用JWT最常見的場(chǎng)景,一旦用戶登錄后,每個(gè)后續(xù)的請(qǐng)求都會(huì)包含JWT token,允許用戶訪問該token所允許的路由、服務(wù)、資源等。如單點(diǎn)登錄是目前廣泛使用JWT的一項(xiàng)功能,因?yàn)樗拈_銷很小,而且在不同的域名中很容易使用。
信息交換
JWT是一種在多方之間傳遞數(shù)據(jù)比較好的方式,因?yàn)镴WT能使用簽名,能確保發(fā)送者是誰,也可以驗(yàn)證傳遞過來的的信息是否被篡改。
JWT的結(jié)構(gòu)
JWT由以下三部分組成:
Header(頭部)
Payload(載荷)
Signature(簽名)
因此,JWT通常看起來如下。
xxxxx.yyyyy.zzzzzHeader
header通常由兩個(gè)部分組成:token類型(即JWT)和正在使用的散列算法,如HMAC SHA256或RSA。
如:
{"alg": "HS256","typ": "JWT" }這個(gè)JSON經(jīng)過Base64編碼后形成JWT的第一部分。
Payload
載荷包含了對(duì)實(shí)體的申明,用戶和一些其他元信息。申明以下三種。
注冊(cè)的申明
公開的申明
私有的申明
如:
{"sub": "1234567890","name": "John Doe","admin": true }這個(gè)JSON經(jīng)過Base64編碼后形成JWT的第二部分。
Signature
簽名用于驗(yàn)證JWT的發(fā)送者是誰,并確保消息在過程中不會(huì)被篡改。
創(chuàng)建簽名部分,你需要用到編碼后的header、編碼后的payload、密鑰、在header中指定的算法。
如下使用HMAC SHA256算法創(chuàng)建簽名的方式:
HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)講完了上面3個(gè)部門,最后就是由這3部分組成了。每個(gè)部分經(jīng)過base64編碼后,以.分隔。它能很容易的在HTML和HTTP環(huán)境中傳遞,也比像類似xml標(biāo)準(zhǔn)格式這樣的更緊湊。
如果想使用JWT并將這些概念應(yīng)用到實(shí)踐中,您可以使用官網(wǎng)首頁下面的調(diào)試器來解碼、驗(yàn)證和生成JWTs。
JWT的工作原理
在身份驗(yàn)證中,當(dāng)用戶成功地使用他們的憑證登錄時(shí),將返回一個(gè)JWT的token,并且必須在本地保存(通常在本地保存,但也可以使用cookie),而不是在服務(wù)器中創(chuàng)建會(huì)話并返回cookie的傳統(tǒng)方法。
當(dāng)用戶想要訪問受保護(hù)的路由或資源時(shí),用戶代理應(yīng)該發(fā)送token,通常是在使用Bearer模式的Authorization頭參數(shù)中。標(biāo)題的內(nèi)容應(yīng)該如下所示:
Authorization: Bearer <token>這是一個(gè)無狀態(tài)的身份驗(yàn)證機(jī)制,因?yàn)橛脩魻顟B(tài)永遠(yuǎn)不會(huì)保存在服務(wù)器內(nèi)存中。服務(wù)器的受保護(hù)路由將在授權(quán)頭中檢查有效的JWT,如果它存在,用戶將被允許訪問受保護(hù)的資源。由于JWTs是獨(dú)立的,所以所有必要的信息都在那里,減少了多次查詢數(shù)據(jù)庫的需求。
這使得完全可以依賴無狀態(tài)的數(shù)據(jù)api,甚至向下游服務(wù)發(fā)出請(qǐng)求。哪個(gè)域名api服務(wù)并不重要,因?yàn)镃ORS攻擊不會(huì)成為一個(gè)問題,因?yàn)樗皇褂胏ookie。
工作流程如下:
JWT的優(yōu)點(diǎn)
因?yàn)镴SON數(shù)據(jù)格式的通用性,所以JWT是可以跨語言的,主流語言都可以支持。
payload部分可以存儲(chǔ)其他業(yè)務(wù)邏輯所必要的非敏感信息。
JWT構(gòu)成簡(jiǎn)單,字節(jié)占用很小,所以非常便于傳輸?shù)摹?/span>
不需要在服務(wù)端保存會(huì)話信息,易于應(yīng)用的擴(kuò)展和安全等。
JWT的使用注意
不要在payload存放敏感信息,因?yàn)樵摬糠质强山饷艿摹?/span>
保存好secret私鑰十分重要。
盡量使用https協(xié)議
JWT參考網(wǎng)站
官網(wǎng):https://jwt.io/
官方介紹:https://jwt.io/introduction/
支持類庫:https://jwt.io/#libraries-io
RFC 7519規(guī)范:https://tools.ietf.org/html/rfc7519
明天帶來JWT的Java實(shí)戰(zhàn)。
總結(jié)
以上是生活随笔為你收集整理的JSON Web Token (JWT),服务端信息传输安全解决方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 结余是什么意思 结余是什么的意思
- 下一篇: 腌的咸鲅鱼怎么做好吃 咸鲅鱼的简单做法