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