這篇文章主要介紹“JWT怎么應(yīng)用”,在日常操作中,相信很多人在JWT怎么應(yīng)用問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”JWT怎么應(yīng)用”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)撫遠(yuǎn)免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了1000多家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
??JSON WEB TOKEN, 是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標(biāo)準(zhǔn)((RFC 7519).該token被設(shè)計(jì)為緊湊且安全的,特別適用于分布式站點(diǎn)的單點(diǎn)登錄(SSO)場(chǎng)景。
??JWT的聲明一般被用來在身份提供者和服務(wù)提供者間傳遞被認(rèn)證的用戶身份信息,以便于從資源服務(wù)器獲取資源,也可以增加一些額外的其它業(yè)務(wù)邏輯所必須的聲明信息,該token也可直接被用于認(rèn)證,也可被加密。
??一個(gè)JWT實(shí)際上就是一個(gè)字符串,它由三部分組成,頭部、載荷與簽名。
Authorization (授權(quán)) : 這是使用JWT的最常見場(chǎng)景。一旦用戶登錄,后續(xù)每個(gè)請(qǐng)求都將包含JWT,允許用戶訪問該令牌允許的路由、服務(wù)和資源。單點(diǎn)登錄是現(xiàn)在廣泛使用的JWT的一個(gè)特性,因?yàn)樗拈_銷很小,并且可以輕松地跨域使用。
Information Exchange (信息交換) : 對(duì)于安全的在各方之間傳輸信息而言,JSON Web Tokens無疑是一種很好的方式。因?yàn)镴WT可以被簽名,例如,用公鑰/私鑰對(duì),你可以確定發(fā)送人就是它們所說的那個(gè)人。另外,由于簽名是使用頭和有效負(fù)載計(jì)算的,您還可以驗(yàn)證內(nèi)容沒有被篡改。
??基于token的鑒權(quán)機(jī)制類似于http協(xié)議也是無狀態(tài)的,它不需要在服務(wù)端去保留用戶的認(rèn)證信息或者會(huì)話信息。這就意味著基于token認(rèn)證機(jī)制的應(yīng)用不需要去考慮用戶在哪一臺(tái)服務(wù)器登錄了,這就為應(yīng)用的擴(kuò)展提供了便利。
流程上是這樣的:
用戶使用用戶名密碼來請(qǐng)求服務(wù)器
服務(wù)器進(jìn)行驗(yàn)證用戶的信息
服務(wù)器通過驗(yàn)證發(fā)送給用戶一個(gè)token
客戶端存儲(chǔ)token,并在每次請(qǐng)求時(shí)附送上這個(gè)token值
服務(wù)端驗(yàn)證token值,并返回?cái)?shù)據(jù)
這個(gè)token必須要在每次請(qǐng)求時(shí)傳遞給服務(wù)端,它應(yīng)該保存在請(qǐng)求頭里, 另外,服務(wù)端要支持CORS(跨來源資源共享)策略,一般我們?cè)诜?wù)端這么做就可以了Access-Control-Allow-Origin: *。
JWT是由三段信息構(gòu)成的,將這三段信息文本用.鏈接一起就構(gòu)成了Jwt字符串。就像這樣:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
??第一部分我們稱它為頭部(header),第二部分我們稱其為載荷(payload, 類似于飛機(jī)上承載的物品),第三部分是簽證(signature).
header(頭部)
由兩部分組成:
token的類型(“JWT”)
算法名稱(比如:HMAC SHA256或者RSA等等)
完整的頭部就像下面這樣的JSON:
{ 'typ': 'JWT', 'alg': 'HS256' }
然后將頭部進(jìn)行base64加密(該加密是可以對(duì)稱解密的),構(gòu)成了第一部分.
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
playload(載荷)
載荷就是存放有效信息的地方。聲明有三種類型:
Registered claims:標(biāo)準(zhǔn)中注冊(cè)的聲明
Public claims: 公共的聲明
Private claims:私有的聲明
標(biāo)準(zhǔn)中注冊(cè)的聲明 (建議但不強(qiáng)制使用) :
iss: jwt簽發(fā)者
sub: jwt所面向的用戶
aud: 接收jwt的一方
exp: jwt的過期時(shí)間,這個(gè)過期時(shí)間必須要大于簽發(fā)時(shí)間
nbf: 定義在什么時(shí)間之前,該jwt都是不可用的.
iat: jwt的簽發(fā)時(shí)間
jti: jwt的唯一身份標(biāo)識(shí),主要用來作為一次性token,從而回避重放攻擊。
公共的聲明 :
公共的聲明可以添加任何的信息,一般添加用戶的相關(guān)信息或其他業(yè)務(wù)需要的必要信息.但不建議添加敏感信息,因?yàn)樵摬糠衷诳蛻舳丝山饷?
私有的聲明 :
私有聲明是提供者和消費(fèi)者所共同定義的聲明,一般不建議存放敏感信息,因?yàn)閎ase64是對(duì)稱解密的,意味著該部分信息可以歸類為明文信息。
定義payload:
{ "sub": "123456", "name": "John", "admin": true }
然后將其進(jìn)行base64加密,得到Jwt的第二部分。
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9
signature(簽證)
jwt的第三部分是一個(gè)簽證信息,這個(gè)簽證信息由三部分組成:
header (base64后的)
payload (base64后的)
secret
這個(gè)部分需要base64加密后的header和base64加密后的payload使用.連接組成的字符串,然后通過header中聲明的加密方式進(jìn)行加鹽secret組合加密,然后就構(gòu)成了jwt的
第三部分。
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),secret)
將這三部分用.連接成一個(gè)完整的字符串,構(gòu)成了最終的jwt:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
注意:secret是保存在服務(wù)器端的,jwt的簽發(fā)生成也是在服務(wù)器端的,secret就是用來進(jìn)行jwt的簽發(fā)和jwt的驗(yàn)證,所以,它就是你服務(wù)端的私鑰,在任何場(chǎng)景都不應(yīng)該流露出去。一旦客戶端得知這個(gè)secret, 那就意味著客戶端是可以自我簽發(fā)jwt了。
如何應(yīng)用
一般是在請(qǐng)求頭里加入Authorization,并加上Bearer標(biāo)注:
headers: { 'Authorization': 'Bearer ' + token }
服務(wù)端會(huì)驗(yàn)證token,如果驗(yàn)證通過就會(huì)返回相應(yīng)的資源。
基于服務(wù)器的身份認(rèn)證
先來看一下以前我們是怎么做的
HTTP協(xié)議是無狀態(tài)的,也就是說,如果我們已經(jīng)認(rèn)證了一個(gè)用戶,那么他下一次請(qǐng)求的時(shí)候,服務(wù)器不知道我是誰,我們必須再次認(rèn)證。
傳統(tǒng)的做法是將已經(jīng)認(rèn)證過的用戶信息存儲(chǔ)在服務(wù)器上,比如Session。用戶下次請(qǐng)求的時(shí)候帶著Session ID,然后服務(wù)器以此檢查用戶是否認(rèn)證過。
基于服務(wù)器的身份認(rèn)證方式存在一些問題:
Sessions: 每次用戶認(rèn)證通過以后,服務(wù)器需要?jiǎng)?chuàng)建一條記錄保存用戶信息,通常是在內(nèi)存中,隨著認(rèn)證通過的用戶越來越多,服務(wù)器的在這里的開銷就會(huì)越來越大。
Scalability: 由于Session是在內(nèi)存中的,這就帶來一些擴(kuò)展性的問題。
CORS: 當(dāng)我們想要擴(kuò)展我們的應(yīng)用,讓我們的數(shù)據(jù)被多個(gè)移動(dòng)設(shè)備使用時(shí),我們必須考慮跨資源共享問題。當(dāng)使用AJAX調(diào)用從另一個(gè)域名下獲取資源時(shí),我們可能會(huì)遇到禁止請(qǐng)求的問題。
CSRF: 用戶很容易受到CSRF攻擊。
JWT與Session的差異
相同點(diǎn),它們都是存儲(chǔ)用戶信息;然而,Session是在服務(wù)器端的,而JWT是在客戶端的。
Session方式存儲(chǔ)用戶信息的最大問題在于要占用大量服務(wù)器內(nèi)存,增加服務(wù)器的開銷。
而JWT方式將用戶狀態(tài)分散到了客戶端中,可以明顯減輕服務(wù)端的內(nèi)存壓力。
Session的狀態(tài)是存儲(chǔ)在服務(wù)器端,客戶端只有session id;而Token的狀態(tài)是存儲(chǔ)在客戶端。
基于Token的身份認(rèn)證是如何工作的
基于Token的身份認(rèn)證是無狀態(tài)的,服務(wù)器或者Session中不會(huì)存儲(chǔ)任何用戶信息。
沒有會(huì)話信息意味著應(yīng)用程序可以根據(jù)需要擴(kuò)展和添加更多的機(jī)器,而不必?fù)?dān)心用戶登錄的位置。
雖然這一實(shí)現(xiàn)可能會(huì)有所不同,但其主要流程如下:
用戶攜帶用戶名和密碼請(qǐng)求訪問
服務(wù)器校驗(yàn)用戶憑據(jù)
應(yīng)用提供一個(gè)token給客戶端
客戶端存儲(chǔ)token,并且在隨后的每一次請(qǐng)求中都帶著它
服務(wù)器校驗(yàn)token并返回?cái)?shù)據(jù)
注意 :
每一次請(qǐng)求都需要token
Token應(yīng)該放在請(qǐng)求header中
我們還需要將服務(wù)器設(shè)置為接受來自所有域的請(qǐng)求,用Access-Control-Allow-Origin: *
用Token的好處
無狀態(tài)和可擴(kuò)展性:Tokens存儲(chǔ)在客戶端。完全無狀態(tài),可擴(kuò)展。我們的負(fù)載均衡器可以將用戶傳遞到任意服務(wù)器,因?yàn)樵谌魏蔚胤蕉紱]有狀態(tài)或會(huì)話信息。
安全:Token不是Cookie。(The token, not a cookie.)每次請(qǐng)求的時(shí)候Token都會(huì)被發(fā)送。而且,由于沒有Cookie被發(fā)送,還有助于防止CSRF攻擊。即使在你的實(shí)現(xiàn)中將token存儲(chǔ)到客戶端的Cookie中,這個(gè)Cookie也只是一種存儲(chǔ)機(jī)制,而非身份認(rèn)證機(jī)制。沒有基于會(huì)話的信息可以操作,因?yàn)槲覀儧]有會(huì)話!
還有一點(diǎn),token在一段時(shí)間以后會(huì)過期,這個(gè)時(shí)候用戶需要重新登錄。這有助于我們保持安全。還有一個(gè)概念叫token撤銷,它允許我們根據(jù)相同的授權(quán)許可使特定的token甚至一組token無效。
JWT與OAuth的區(qū)別
OAuth3是一種授權(quán)框架 ,JWT是一種認(rèn)證協(xié)議
無論使用哪種方式切記用HTTPS來保證數(shù)據(jù)的安全性
OAuth3用在使用第三方賬號(hào)登錄的情況(比如使用weibo, qq, github登錄某個(gè)app),而JWT是用在前后端分離, 需要簡(jiǎn)單的對(duì)后臺(tái)API進(jìn)行保護(hù)時(shí)使用。
到此,關(guān)于“JWT怎么應(yīng)用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
網(wǎng)站標(biāo)題:JWT怎么應(yīng)用
當(dāng)前URL:http://muchs.cn/article32/iheopc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、建站公司、靜態(tài)網(wǎng)站、電子商務(wù)、企業(yè)建站、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)