您好,登錄后才能下訂單哦!
這篇文章主要介紹“JWT的數據結構是什么”,在日常操作中,相信很多人在JWT的數據結構是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”JWT的數據結構是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
JWT,全名為Json Web Token,是一種自包含令牌。
簡單的說,就是基于JSON,在web環境下傳輸一個規定格式的字符串令牌。
廣義上講JWT,這是一個Web安全傳輸信息方式。狹義上來說,直接指傳遞的令牌字符串。
首先,我們需要知道,JWT無法用于數據加密。一般是用來身份提供者和服務者之間傳遞被認證的用戶身份信息,以便于從資源服務器獲取到資源。
也可以增加一些額外的其它業務邏輯所必須的聲明信息,該token也可直接被用于認證,也可被加密。
所以,可以推斷出,在以下場景中使用JWT是比較合適的。
授權:這是最常見的使用場景,解決單點登錄問題。因為JWT使用起來輕便,開銷小,服務端不用記錄用戶狀態信息(無狀態),所以使用比較廣泛;
信息交換:JWT是在各個服務之間安全傳輸信息的好方法。因為JWT可以簽名,例如,使用公鑰/私鑰對兒 - 可以確定請求方是合法的。此外,由于使用標頭和有效負載計算簽名,還可以驗證內容是否未被篡改。
JWT官網有一張圖描述了JWT的認證流程
流程說明:
1,瀏覽器發起請求登陸,攜帶用戶名和密碼;
2,服務端驗證身份,根據算法,將用戶標識符打包生成 token,
3,服務器返回JWT信息給瀏覽器,JWT不包含敏感信息;
4,瀏覽器發起請求獲取用戶資料,把剛剛拿到的 token一起發送給服務器;
5,服務器發現數據中有 token,驗明正身;
6,服務器返回該用戶的用戶資料;
JWT字符串的格式:
header.payload.signature
JWT通常由三部分組成,按照順序: 頭信息(header), 有效載荷(payload)和簽名(signature)。
header是一串描述JWT元數據的JSON字符串,例如:
{"alg":"HS256","typ":"JWT"}
HS256 表示使用了 HMAC-SHA256 來生成簽名。
最后使用Base64URL算法將上述JSON對象轉換為字符串保存。
其他還有一些簽名算法,可以去官網查看。
Payload 部分也是一個 JSON 對象,用來存放實際需要傳遞的數據。JWT 規定了7個官方字段,供選用。
iss (issuer):簽發人 exp (expiration time):過期時間(jwt的過期時間,這個過期時間必須要大于簽發時間) sub (subject):主題 aud (audience):受眾 nbf (Not Before):生效時間(定義在什么時間之前,該jwt都是不可用的.) iat (Issued At):簽發時間 jti (JWT ID):編號(jwt的唯一身份標識,主要用來作為一次性token,從而回避重放攻擊。)
當然,除了前面的字符串,這里也就是我們傳輸數據的地方。可以自定義字段傳輸。例如:
{ "微信公眾號": "程序編程之旅", "姓名": "諳憶" }
當然,我這里就是推廣下公眾號,前面的key用了中文名,你別這么玩就行。
注意哦,這部分的數據默認是不加密的。所以,如果有敏感信息,注意再使用加密算法把數據加密后傳輸即可。
這個JSON對象傳輸時,也要使用Base64URL算法轉成字符串。
簽名哈希部分是對上面兩部分數據簽名,通過指定的算法生成哈希,以確保數據不會被篡改。
首先,需要指定一個密碼(secret)。該密碼保存在服務器中,并且不能向用戶公開。然后,使用標頭中指定的簽名算法(默認情況下為HMAC SHA256)根據以下公式生成簽名。
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
token看起來像這樣:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI
客戶端接收服務器返回的JWT,將其存儲在Cookie或localStorage中。
此后,客戶端將在與服務器交互中都會帶JWT。如果將它存儲在Cookie中,就可以自動發送,但是不會跨域,因此一般是將它放入HTTP請求的Header Authorization字段中。
當跨域時,也可以將JWT放置于POST請求的數據主體中。
1、JWT默認不加密,所以可能導致數據泄露,但可以加密。生成原始令牌后,可以使用該令牌再次對其進行加密。
2、當JWT未加密時,一些私密數據無法通過JWT傳輸。
3、JWT不僅可用于認證,還可用于信息交換。善用JWT有助于減少服務器請求數據庫的次數。
4、JWT的最大缺點是服務器不保存會話狀態,所以在使用期間不可能取消令牌或更改令牌的權限。也就是說,一旦JWT簽發,在有效期內將會一直有效。
5、JWT本身包含認證信息,因此一旦信息泄露,任何人都可以獲得令牌的所有權限。為了減少盜用,JWT的有效期不宜設置太長。對于某些重要操作,用戶在使用時應該每次都進行身份驗證。
6、為了減少盜用和竊取,JWT不建議使用HTTP協議來傳輸代碼,而是使用加密的HTTPS協議進行傳輸,防止服務器返回給用戶的JWT被攔截。
看著上面6點,我的建議是,無論有沒有敏感數據,對于用戶認證信息數據做一層加密。最大程度上避免數據泄露造成問題。
最后,強調一點:JWT不是用來加密的,只是用來驗證用戶的真實性以及請求來源的真實性。
到此,關于“JWT的數據結構是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。