在介紹JWT之前先看一下傳統(tǒng)校驗令牌的方法,如下圖:
問題:
傳統(tǒng)授權(quán)方法的問題是用戶每次請求資源服務(wù)驾诈,資源服務(wù)都需要攜帶令牌訪問認證服務(wù)去校驗令牌的合法性缠诅,并根據(jù)令牌獲取用戶的相關(guān)信息,性能低下乍迄。
解決:
使用JWT的思路是管引,用戶認證通過會得到一個JWT令牌,JWT令牌中已經(jīng)包括了用戶相關(guān)的信息闯两,客戶端只需要攜帶JWT訪問資源服務(wù)褥伴,資源服務(wù)根據(jù)事先約定的算法自行完成令牌校驗,無需每次都請求認證服務(wù)完成授權(quán)漾狼。
JWT令牌授權(quán)過程如下圖:
什么是JWT重慢?
JSON Web Token(JWT)是一個開放的行業(yè)標準(RFC 7519),它定義了一種簡介的逊躁、自包含的協(xié)議格式似踱,用于
在通信雙方傳遞json對象,傳遞的信息經(jīng)過數(shù)字簽名可以被驗證和信任稽煤。JWT可以使用HMAC算法或使用RSA的公
鑰/私鑰對來簽名屯援,防止被篡改。
官網(wǎng):https://jwt.io/
標準: https://tools.ietf.org/html/rfc7519
JWT令牌的優(yōu)點:
1念脯、jwt基于json狞洋,非常方便解析。
2绿店、可以在令牌中自定義豐富的內(nèi)容吉懊,易擴展。
3假勿、通過非對稱加密算法及數(shù)字簽名技術(shù)借嗽,JWT防止篡改,安全性高转培。
4恶导、資源服務(wù)使用JWT可不依賴認證服務(wù)即可完成授權(quán)。
缺點:
1浸须、JWT令牌較長惨寿,占存儲空間比較大邦泄。
1.令牌結(jié)構(gòu)
通過學(xué)習(xí)JWT令牌結(jié)構(gòu)為自定義jwt令牌打好基礎(chǔ)。
JWT令牌由三部分組成裂垦,每部分中間使用點(.)分隔顺囊,比如:xxxxx.yyyyy.zzzzz
- Header
頭部包括令牌的類型(即JWT)及使用的哈希算法(如HMAC SHA256或RSA)
一個例子如下:
下邊是Header部分的內(nèi)容
{
"alg": "HS256",
"typ": "JWT"
}
將上邊的內(nèi)容使用Base64Url編碼,得到一個字符串就是JWT令牌的第一部分蕉拢。
- Payload
第二部分是負載特碳,內(nèi)容也是一個json對象,它是存放有效信息的地方晕换,它可以存放jwt提供的現(xiàn)成字段午乓,比
如:iss(簽發(fā)者),exp(過期時間戳), sub(面向的用戶)等,也可自定義字段闸准。
此部分不建議存放敏感信息益愈,因為此部分可以解碼還原原始內(nèi)容。
最后將第二部分負載使用Base64Url編碼恕汇,得到一個字符串就是JWT令牌的第二部分腕唧。
一個例子:
{
"sub": "1234567890",
"name": "456",
"admin": true
}
- Signature
第三部分是簽名,此部分用于防止jwt內(nèi)容被篡改瘾英。
這個部分使用base64url將前兩部分進行編碼枣接,編碼后使用點(.)連接組成字符串,最后使用header中聲明
簽名算法進行簽名缺谴。
一個例子:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
base64UrlEncode(header) :jwt令牌的第一部分但惶。
base64UrlEncode(payload):jwt令牌的第二部分。
secret:簽名所使用的密鑰湿蛔。