1. 程式人生 > 實用技巧 >JTW(Json Web Token)

JTW(Json Web Token)

跨地域認證問題(轉載)

任何服務都離不開伺服器認證的問題,一般的伺服器認證流程如下:

上面顯示的是單點驗證的情況,如果一個公司有多個伺服器,當員工登入上一個伺服器,按照正常情況,他就可以免密登入其他的伺服器,這是如何實現的?見下圖:

上面的中介軟體層可以簡單看做是一個mysql資料庫,那麼就存在一個問題,如果中介軟體層掛了,那麼所有的單點登入都會失敗,另一個方法就是session存在客戶端,伺服器端不儲存session,每次請求都講session傳送給伺服器,JTW是這種方案的代表之一。

JTW

1、什麼是JTW

Json Web Token是一個開放標準(RFC 7519),它定義了一種緊湊且自包含的方式,用於在各方之間安全的將資訊以json的格式傳輸,由於這些資訊都是進過數字簽名的,所以它是可以被驗證和信任的。可以使用

HMAC演算法或使用RSAECDSA的公用/專用金鑰對對JWT進行簽名

2、JTW原理

JTW是在伺服器認證之後,生成一個json物件,返回給使用者,比如:

{
  "name":"liming",
  "actor":"admin",
  "time":"2020-08-08"          
}

之後,使用者與服務通訊的時候,都要發回這個json物件。伺服器完全只靠這個物件去認定身份;當然,為了防止資料篡改,伺服器在生成json資料的時候會加上簽名。伺服器就不儲存任何session資料,也就是說,伺服器現在就是無狀態的了。

3、JTW資料結構

JTW資料結構分為三個部分,用.連線,分別為頭部、負載和簽名,如下:

header.payload.signature

3.1、header

header是一個json物件,裡面一般包括了簽名的演算法和token的型別,這裡也就是JTW,如下:

{
    "alg":"HS265",
    "typ":"JWT"
}

上面的json格式資料會被Base64URL演算法轉換成字串,成為最終的header。

3.2、payload

payload部分也是一個json格式的資料。JWT官方定義了7個欄位供選用,如下:

1 iss (issuer):簽發人
2 exp (expiration time):過期時間
3 sub (subject):主題
4
aud (audience):受眾 5 nbf (Not Before):生效時間 6 iat (Issued At):簽發時間 7 jti (JWT ID):編號

當然,你也可以定義自己的私有欄位,但是JWT是預設不加密的,所以並不建議把敏感資料放在裡面,同樣payload也需要用Base64URL演算法轉換成字串。舉一個栗子:

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

3.3、signature

signature是對前兩個部分的資料進行簽名,防止資料篡改。

首先,需要指定一個金鑰(secret)。這個金鑰只有伺服器才知道,不能洩露給使用者。然後,使用 Header 裡面指定的簽名演算法(預設是 HMAC SHA256),按照下面的公式產生簽名。

HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)

算出簽名以後,把 Header、Payload、Signature 三個部分拼成一個字串,每個部分之間用"點"(.)分隔,就可以返回給使用者。

3.4、Base64URL

前面提到,Header 和 Payload 串型化的演算法是 Base64URL。這個演算法跟 Base64 演算法基本類似,但有一些小的不同。

JWT 作為一個令牌(token),有些場合可能會放到 URL(比如 api.example.com/?token=xxx)。Base64 有三個字元+/=,在 URL 裡面有特殊含義,所以要被替換掉:=被省略、+替換成-/替換成_。這就是 Base64URL 演算法。

4、JWT 的幾個特點

(1)JWT 預設是不加密,但也是可以加密的。生成原始 Token 以後,可以用金鑰再加密一次。

(2)JWT 不加密的情況下,不能將祕密資料寫入 JWT。

(3)JWT 不僅可以用於認證,也可以用於交換資訊。有效使用 JWT,可以降低伺服器查詢資料庫的次數。

(4)JWT 的最大缺點是,由於伺服器不儲存 session 狀態,因此無法在使用過程中廢止某個 token,或者更改 token 的許可權。也就是說,一旦 JWT 簽發了,在到期之前就會始終有效,除非伺服器部署額外的邏輯。

(5)JWT 本身包含了認證資訊,一旦洩露,任何人都可以獲得該令牌的所有許可權。為了減少盜用,JWT 的有效期應該設定得比較短。對於一些比較重要的許可權,使用時應該再次對使用者進行認證。

(6)為了減少盜用,JWT 不應該使用 HTTP 協議明碼傳輸,要使用 HTTPS 協議傳輸。