JWT的介紹解析

JWT的介紹解析

1、什麼是JWT?瞭解JWT,認知JWT

首先jwt實際上是三個英語單詞JSON Web Token的縮寫。經過全名你可能就有一個基本的認知了。token通常都是用來認證的,好比咱們系統中經常使用的用戶登陸token能夠用來認證該用戶是否登陸。jwt也是常常做爲一種安全的token使用。算法

JWT的定義:

JWT是一種用於雙方之間傳遞安全信息的簡潔的、URL安全的表述性聲明規範。JWT做爲一個開放的標準(RFC 7519),定義了一種簡潔的,自包含的方法用於通訊雙方之間以Json對象的形式安全的傳遞信息。由於數字簽名的存在,這些信息是可信的,JWT可使用HMAC算法或者是RSA的公私祕鑰對進行簽名。數據庫

JWT特色:

  • 簡潔(Compact): 能夠經過URL,POST參數或者在HTTP header發送,由於數據量小,傳輸速度也很快
  • 自包含(Self-contained):負載中包含了全部用戶所須要的信息,避免了屢次查詢數據庫

2、JWT構成或者說JWT是什麼樣的?

2.1.JWT結構

JWT主要包含三個部分之間用英語句號'.'隔開json

  1. Header 頭部
  2. Payload 負載
  3. Signature 簽名

注意,順序是 header.payload.signature安全

最終的結構有點像這樣:編碼

leftso.com.blog

固然真實的jwt不多是這麼簡單的明文加密

2.2.JWT的頭部(Header)3d

在header中一般包含了兩部分:token類型和採用的加密算法。以下:code

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

上面的JSON內容指定了當前採用的加密方式爲HS256,token的類型爲jwtjwt

將上面的內容進行base64編碼,能夠獲得咱們JWT的頭部,編碼後以下:對象

ewogICJhbGciOiAiSFMyNTYiLAogICJ0eXAiOiAiSldUIgp9ICA=

2.3.JWT的負載(Payload)

負載(Payload)爲JWT的第二部分。JWT的標準所定義了一下幾個基本字段

  1. iss: 該JWT的簽發者
  2. sub: 該JWT所面向的用戶
  3. aud: 接收該JWT的一方
  4. exp(expires): 何時過時,這裏是一個Unix時間戳
  5. iat(issued at): 在何時簽發的

除了標準定義的字段外,咱們還要定義一些咱們在業務處理中須要用到的字段,例如用戶token通常能夠包含用戶登陸的token或者用戶的id,一個簡單的例子以下:

{
    "iss": "Lefto.com",
    "iat": 1500218077,
    "exp": 1500218077,
    "aud": "www.leftso.com",
    "sub": "leftso@qq.com",
    "user_id": "dc2c4eefe2d141490b6ca612e252f92e",
    "user_token": "09f7f25cdb003699cee05759e7934fb2"
}

上面的user_id、user_token都是咱們本身定義的字段

如今咱們須要將負載這整個部分進行base64編碼,編碼後結果以下:

ewogICAgImlzcyI6ICJMZWZ0by5jb20iLAogICAgImlhdCI6IDE1MDAyMTgwNzcsCiAgICAiZXhwIjogMTUwMDIxODA3NywKICAgICJhdWQiOiAid3d3LmxlZnRzby5jb20iLAogICAgInN1YiI6ICJsZWZ0c29AcXEuY29tIiwKICAgICJ1c2VyX2lkIjogImRjMmM0ZWVmZTJkMTQxNDkwYjZjYTYxMmUyNTJmOTJlIiwKICAgICJ1c2VyX3Rva2VuIjogIjA5ZjdmMjVjZGIwMDM2OTljZWUwNTc1OWU3OTM0ZmIyIgp9

2.4.

Signature(簽名)

簽名實際上是對JWT的頭部和負載整合的一個簽名驗證

首先須要將頭部和負載經過.連接起來就像這樣:header.Payload,上述的例子連接起來以後就是這樣的:

ewogICJhbGciOiAiSFMyNTYiLAogICJ0eXAiOiAiSldUIgp9ICA=.ewogICAgImlzcyI6ICJMZWZ0by5jb20iLAogICAgImlhdCI6IDE1MDAyMTgwNzcsCiAgICAiZXhwIjogMTUwMDIxODA3NywKICAgICJhdWQiOiAid3d3LmxlZnRzby5jb20iLAogICAgInN1YiI6ICJsZWZ0c29AcXEuY29tIiwKICAgICJ1c2VyX2lkIjogImRjMmM0ZWVmZTJkMTQxNDkwYjZjYTYxMmUyNTJmOTJlIiwKICAgICJ1c2VyX3Rva2VuIjogIjA5ZjdmMjVjZGIwMDM2OTljZWUwNTc1OWU3OTM0ZmIyIgp9

因爲HMacSHA256加密算法須要一個key,咱們這裏key暫時用leftso吧

加密後的內容爲:

686855c578362e762248f22e2cc1213dc7a6aff8ebda52247780eb6b5ae91877

其實加密的內容也就是JWT的簽名,相似咱們對某個文件進行MD5加密而後接收到文件進行md5對比同樣.只是這裏的HMacSHA256算法須要一個key,固然這個key應該是使用者和接收者都知道的。

對上面的簽名內容進行base64編碼獲得最終的簽名

Njg2ODU1YzU3ODM2MmU3NjIyNDhmMjJlMmNjMTIxM2RjN2E2YWZmOGViZGE1MjI0Nzc4MGViNmI1YWU5MTg3Nw==

2.5最終的JWT

ewogICJhbGciOiAiSFMyNTYiLAogICJ0eXAiOiAiSldUIgp9ICA=.ewogICAgImlzcyI6ICJMZWZ0by5jb20iLAogICAgImlhdCI6IDE1MDAyMTgwNzcsCiAgICAiZXhwIjogMTUwMDIxODA3NywKICAgICJhdWQiOiAid3d3LmxlZnRzby5jb20iLAogICAgInN1YiI6ICJsZWZ0c29AcXEuY29tIiwKICAgICJ1c2VyX2lkIjogImRjMmM0ZWVmZTJkMTQxNDkwYjZjYTYxMmUyNTJmOTJlIiwKICAgICJ1c2VyX3Rva2VuIjogIjA5ZjdmMjVjZGIwMDM2OTljZWUwNTc1OWU3OTM0ZmIyIgp9.Njg2ODU1YzU3ODM2MmU3NjIyNDhmMjJlMmNjMTIxM2RjN2E2YWZmOGViZGE1MjI0Nzc4MGViNmI1YWU5MTg3Nw==
相關文章
相關標籤/搜索