JWT?Json?Web?Token全面詳解
概述
最近學(xué)習(xí)了一下JWT,全名為Json Web Token,是一種自包含令牌。
在這里,我整理了一下網(wǎng)上資源。在文章最后,有一個使用Java實現(xiàn)JWT生成和驗證的完整案例。
簡單的說,就是基于JSON,在web環(huán)境下傳輸一個規(guī)定格式的字符串令牌。
廣義上講JWT,這是一個Web安全傳輸信息方式。狹義上來說,直接指傳遞的令牌字符串。
JWT官網(wǎng)地址:https://jwt.io/ ,在這里,你可以體驗一下形成的JWT字符串。
應(yīng)用場景
首先,我們需要知道,JWT無法用于數(shù)據(jù)加密。一般是用來身份提供者和服務(wù)者之間傳遞被認證的用戶身份信息,以便于從資源服務(wù)器獲取到資源。
也可以增加一些額外的其它業(yè)務(wù)邏輯所必須的聲明信息,該token也可直接被用于認證,也可被加密。
所以,可以推斷出,在以下場景中使用JWT是比較合適的。
- 授權(quán):這是最常見的使用場景,解決單點登錄問題。因為JWT使用起來輕便,開銷小,服務(wù)端不用記錄用戶狀態(tài)信息(無狀態(tài)),所以使用比較廣泛;
- 信息交換:JWT是在各個服務(wù)之間安全傳輸信息的好方法。因為JWT可以簽名,例如,使用公鑰/私鑰對兒 - 可以確定請求方是合法的。此外,由于使用標(biāo)頭和有效負載計算簽名,還可以驗證內(nèi)容是否未被篡改。
JWT認證過程
JWT官網(wǎng)有一張圖描述了JWT的認證流程
流程說明:
- 1,瀏覽器發(fā)起請求登陸,攜帶用戶名和密碼;
- 2,服務(wù)端驗證身份,根據(jù)算法,將用戶標(biāo)識符打包生成 token,
- 3,服務(wù)器返回JWT信息給瀏覽器,JWT不包含敏感信息;
- 4,瀏覽器發(fā)起請求獲取用戶資料,把剛剛拿到的 token一起發(fā)送給服務(wù)器;
- 5,服務(wù)器發(fā)現(xiàn)數(shù)據(jù)中有 token,驗明正身;
- 6,服務(wù)器返回該用戶的用戶資料;
JWT的數(shù)據(jù)結(jié)構(gòu)
JWT字符串的格式:
header.payload.signature
JWT通常由三部分組成,按照順序: 頭信息(header), 有效載荷(payload)和簽名(signature)。
header
header是一串描述JWT元數(shù)據(jù)的JSON字符串,例如:
{"alg":"HS256","typ":"JWT"}
HS256 表示使用了 HMAC-SHA256 來生成簽名。
最后使用Base64URL算法將上述JSON對象轉(zhuǎn)換為字符串保存。
其他還有一些簽名算法,可以去官網(wǎng)查看。
payload
Payload 部分也是一個 JSON 對象,用來存放實際需要傳遞的數(shù)據(jù)。JWT 規(guī)定了7個官方字段,供選用。
iss (issuer):簽發(fā)人 exp (expiration time):過期時間(jwt的過期時間,這個過期時間必須要大于簽發(fā)時間) sub (subject):主題 aud (audience):受眾 nbf (Not Before):生效時間(定義在什么時間之前,該jwt都是不可用的.) iat (Issued At):簽發(fā)時間 jti (JWT ID):編號(jwt的唯一身份標(biāo)識,主要用來作為一次性token,從而回避重放攻擊。)
當(dāng)然,除了前面的字符串,這里也就是我們傳輸數(shù)據(jù)的地方??梢宰远x字段傳輸。例如:
{ "微信公眾號": "程序編程之旅", "姓名": "諳憶" }
當(dāng)然,我這里就是推廣下公眾號,前面的key用了中文名,你別這么玩就行。
注意哦,這部分的數(shù)據(jù)默認是不加密的。所以,如果有敏感信息,注意再使用加密算法把數(shù)據(jù)加密后傳輸即可。
這個JSON對象傳輸時,也要使用Base64URL算法轉(zhuǎn)成字符串。
signature
簽名哈希部分是對上面兩部分數(shù)據(jù)簽名,通過指定的算法生成哈希,以確保數(shù)據(jù)不會被篡改。
首先,需要指定一個密碼(secret)。該密碼保存在服務(wù)器中,并且不能向用戶公開。然后,使用標(biāo)頭中指定的簽名算法(默認情況下為HMAC SHA256)根據(jù)以下公式生成簽名。
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
token看起來像這樣:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI
JWT的用法
客戶端接收服務(wù)器返回的JWT,將其存儲在Cookie或localStorage中。
此后,客戶端將在與服務(wù)器交互中都會帶JWT。如果將它存儲在Cookie中,就可以自動發(fā)送,但是不會跨域,因此一般是將它放入HTTP請求的Header Authorization字段中。
當(dāng)跨域時,也可以將JWT放置于POST請求的數(shù)據(jù)主體中。
JWT的優(yōu)缺點
1、JWT默認不加密,所以可能導(dǎo)致數(shù)據(jù)泄露,但可以加密。生成原始令牌后,可以使用該令牌再次對其進行加密。
2、當(dāng)JWT未加密時,一些私密數(shù)據(jù)無法通過JWT傳輸。
3、JWT不僅可用于認證,還可用于信息交換。善用JWT有助于減少服務(wù)器請求數(shù)據(jù)庫的次數(shù)。
4、JWT的最大缺點是服務(wù)器不保存會話狀態(tài),所以在使用期間不可能取消令牌或更改令牌的權(quán)限。也就是說,一旦JWT簽發(fā),在有效期內(nèi)將會一直有效。
5、JWT本身包含認證信息,因此一旦信息泄露,任何人都可以獲得令牌的所有權(quán)限。為了減少盜用,JWT的有效期不宜設(shè)置太長。對于某些重要操作,用戶在使用時應(yīng)該每次都進行身份驗證。
6、為了減少盜用和竊取,JWT不建議使用HTTP協(xié)議來傳輸代碼,而是使用加密的HTTPS協(xié)議進行傳輸,防止服務(wù)器返回給用戶的JWT被攔截。
看著上面6點,我的建議是,無論有沒有敏感數(shù)據(jù),對于用戶認證信息數(shù)據(jù)做一層加密。最大程度上避免數(shù)據(jù)泄露造成問題。
最后,強調(diào)一點:JWT不是用來加密的,只是用來驗證用戶的真實性以及請求來源的真實性。
以上就是JWT Json Web Token全面詳解的詳細內(nèi)容,更多關(guān)于JWT Json Web Token的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Ajax+FormData+javascript實現(xiàn)無刷新表單信息提交
在前端開發(fā)中ajax,formdata和js實現(xiàn)無刷新表單信息提交非常棒,接下來通過本文給大家介紹Ajax+FormData+javascript實現(xiàn)無刷新表單信息提交的相關(guān)資料,需要的朋友可以參考下2016-10-10微信小程序利用button控制條件標(biāo)簽的變量問題
這篇文章主要介紹了微信小程序利用button控制條件標(biāo)簽的變量問題,本文分步驟給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2020-03-03在vs2010中調(diào)試javascript代碼方法
只在IE瀏覽器中測試成功了,在谷歌瀏覽中沒有測試成功,其他瀏覽器沒有測試。2011-02-02基于JS快速實現(xiàn)導(dǎo)航下拉菜單動畫效果附源碼下載
這是一個帶變形動畫特效的下拉導(dǎo)航菜單特效。該導(dǎo)航菜單在菜單項之間切換時,下拉菜單會快速的根據(jù)菜單內(nèi)容的大小來動態(tài)變形,顯示合適的下拉菜單大小,效果非常棒,對導(dǎo)航下拉菜單效果感興趣的朋友一起通過本文學(xué)習(xí)吧2016-10-10javascript中的window.location.search方法簡介
window.location.search方法是截取當(dāng)前url中“?”后面的字符串,示例如下,感興趣的朋友可以參考下2013-09-09被jQuery折騰得半死,揭秘為何jQuery為何在IE/Firefox下均無法使用
某學(xué)員前日實施一個Web項目實施發(fā)生了悲劇,找到我求解決,把我也折騰個半死。2010-01-01