JWT

JWT 的原理

服務器認證後,發送一個JSON對象給用戶。以後用戶與服務器通訊的時候,都要發回這個JSON對象。同時,爲了防止用戶篡改數據,服務器生成這個數據的時候,會加上簽名。javascript

JWT 的數據結構

它是一個很長的字符串,中間用點(.)分隔成三個部分。java

三個部分一次以下:算法

  • Header(頭部)
  • Payload(負載)
  • Signature(簽名)

Header

JSON對象,描述 JWT 的元數據跨域

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

alg表示簽名的算法,默認是 HMAC SHA256(寫成 HS256)服務器

typ表示令牌的token類型,JWT令牌統一寫爲JWTcookie

最後使用Base64URL 算法將他轉換成字符串數據結構

Payload

JSON對象,用來存放實際須要傳遞的數據。post

7個官方字段:加密

  • iss (issuer):簽發人
  • exp (expiration time):過時時間
  • sub (subject):主題
  • aud (audience):受衆
  • nbf (Not Before):生效時間
  • iat (Issued At):簽發時間
  • jti (JWT ID):編號

也能夠定義私有字段,但不能存放私密字段,除非是加密的spa

最後使用Base64URL 算法將他轉換成字符串

Signature

對前兩部分的簽名,防止數據篡改

首先,指定一個只有服務器才知道的密鑰secret,以後使用header中的簽名算法使用以下方式產生簽名,默認(HMAC SHA256)

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

最後將以上三部分字符串拼接,拼接處用.分隔

Base64URL

相似於Base64,可是有些小的不一樣。

JWT令牌可能會放在URL中,Base64 有三個字符+/=,在 URL 裏面有特殊含義,因此要被替換掉:=被省略、+替換成-/替換成_ 。這就是 Base64URL 算法。

JWT 的使用方式

(1)放在客戶端的cookie或localStroage中,放在cookie中每次請求都會自動發送,可是不能跨域

(2)放在請求頭信息Authorization字段裏面

(3)放在post請求體中

JWT 的幾個特色

(1)JWT默認時不加密的,但也是能夠加密的。生成原始 Token 之後,能夠用密鑰再加密一次。不加密的狀況下,不能將祕密數據寫入JWT

(2)JWT不只能夠用於認證,也能夠用於交換信息

(3)爲減小盜用,JWT不該該用HTTP明碼傳輸,而使用HTTPS,對於比較重要的權限,應該進行二次驗證

(4)JWT的缺點,因爲保存在客戶端,所以服務端在token到期以前是不可控的,儘可能減短token的過時時間

相關文章
相關標籤/搜索