JWT怎么應(yīng)用

這篇文章主要介紹“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)變。

JWT概述

??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è)字符串,它由三部分組成,頭部、載荷與簽名。

應(yīng)用場(chǎng)景

  • 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ī)制

??基于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

JWT的構(gòu)成

??第一部分我們稱它為頭部(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)的資源。

Token的身份認(rèn)證&服務(wù)器的身份認(rèn)證

基于服務(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)

成都網(wǎng)頁設(shè)計(jì)公司