服務器認證後,發送一個JSON對象給用戶。以後用戶與服務器通訊的時候,都要發回這個JSON對象。同時,爲了防止用戶篡改數據,服務器生成這個數據的時候,會加上簽名。javascript
它是一個很長的字符串,中間用點(.
)分隔成三個部分。java
三個部分一次以下:算法
JSON對象,描述 JWT 的元數據跨域
{ "alg": "HS256", "typ": "JWT" }
alg表示簽名的算法,默認是 HMAC SHA256(寫成 HS256)服務器
typ表示令牌的token類型,JWT令牌統一寫爲JWTcookie
最後使用Base64URL 算法將他轉換成字符串數據結構
JSON對象,用來存放實際須要傳遞的數據。post
7個官方字段:加密
也能夠定義私有字段,但不能存放私密字段,除非是加密的spa
最後使用Base64URL 算法將他轉換成字符串
對前兩部分的簽名,防止數據篡改
首先,指定一個只有服務器才知道的密鑰secret,以後使用header中的簽名算法使用以下方式產生簽名,默認(HMAC SHA256)
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
最後將以上三部分字符串拼接,拼接處用.分隔
相似於Base64,可是有些小的不一樣。
JWT令牌可能會放在URL中,Base64 有三個字符+
、/
和=
,在 URL 裏面有特殊含義,因此要被替換掉:=
被省略、+
替換成-
,/
替換成_
。這就是 Base64URL 算法。
(1)放在客戶端的cookie或localStroage中,放在cookie中每次請求都會自動發送,可是不能跨域
(2)放在請求頭信息Authorization
字段裏面
(3)放在post請求體中
(1)JWT默認時不加密的,但也是能夠加密的。生成原始 Token 之後,能夠用密鑰再加密一次。不加密的狀況下,不能將祕密數據寫入JWT
(2)JWT不只能夠用於認證,也能夠用於交換信息
(3)爲減小盜用,JWT不該該用HTTP明碼傳輸,而使用HTTPS,對於比較重要的權限,應該進行二次驗證
(4)JWT的缺點,因爲保存在客戶端,所以服務端在token到期以前是不可控的,儘可能減短token的過時時間