首先jwt實際上是三個英語單詞JSON Web Token的縮寫。經過全名你可能就有一個基本的認知了。token通常都是用來認證的,好比咱們系統中經常使用的用戶登陸token能夠用來認證該用戶是否登陸。jwt也是常常做爲一種安全的token使用。算法
JWT是一種用於雙方之間傳遞安全信息的簡潔的、URL安全的表述性聲明規範。JWT做爲一個開放的標準(RFC 7519),定義了一種簡潔的,自包含的方法用於通訊雙方之間以Json對象的形式安全的傳遞信息。由於數字簽名的存在,這些信息是可信的,JWT可使用HMAC算法或者是RSA的公私祕鑰對進行簽名。數據庫
JWT主要包含三個部分之間用英語句號'.'隔開json
注意,順序是 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=
負載(Payload)爲JWT的第二部分。JWT的標準所定義了一下幾個基本字段
iss
: 該JWT的簽發者sub
: 該JWT所面向的用戶aud
: 接收該JWT的一方exp
(expires): 何時過時,這裏是一個Unix時間戳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.
簽名實際上是對JWT的頭部和負載整合的一個簽名驗證
首先須要將頭部和負載經過.連接起來就像這樣:header.Payload,上述的例子連接起來以後就是這樣的:
ewogICJhbGciOiAiSFMyNTYiLAogICJ0eXAiOiAiSldUIgp9ICA=.ewogICAgImlzcyI6ICJMZWZ0by5jb20iLAogICAgImlhdCI6IDE1MDAyMTgwNzcsCiAgICAiZXhwIjogMTUwMDIxODA3NywKICAgICJhdWQiOiAid3d3LmxlZnRzby5jb20iLAogICAgInN1YiI6ICJsZWZ0c29AcXEuY29tIiwKICAgICJ1c2VyX2lkIjogImRjMmM0ZWVmZTJkMTQxNDkwYjZjYTYxMmUyNTJmOTJlIiwKICAgICJ1c2VyX3Rva2VuIjogIjA5ZjdmMjVjZGIwMDM2OTljZWUwNTc1OWU3OTM0ZmIyIgp9
因爲HMacSHA256加密算法須要一個key,咱們這裏key暫時用leftso吧
加密後的內容爲:
686855c578362e762248f22e2cc1213dc7a6aff8ebda52247780eb6b5ae91877
其實加密的內容也就是JWT的簽名,相似咱們對某個文件進行MD5加密而後接收到文件進行md5對比同樣.只是這裏的HMacSHA256算法須要一個key,固然這個key應該是使用者和接收者都知道的。
對上面的簽名內容進行base64編碼獲得最終的簽名
Njg2ODU1YzU3ODM2MmU3NjIyNDhmMjJlMmNjMTIxM2RjN2E2YWZmOGViZGE1MjI0Nzc4MGViNmI1YWU5MTg3Nw==
ewogICJhbGciOiAiSFMyNTYiLAogICJ0eXAiOiAiSldUIgp9ICA=.ewogICAgImlzcyI6ICJMZWZ0by5jb20iLAogICAgImlhdCI6IDE1MDAyMTgwNzcsCiAgICAiZXhwIjogMTUwMDIxODA3NywKICAgICJhdWQiOiAid3d3LmxlZnRzby5jb20iLAogICAgInN1YiI6ICJsZWZ0c29AcXEuY29tIiwKICAgICJ1c2VyX2lkIjogImRjMmM0ZWVmZTJkMTQxNDkwYjZjYTYxMmUyNTJmOTJlIiwKICAgICJ1c2VyX3Rva2VuIjogIjA5ZjdmMjVjZGIwMDM2OTljZWUwNTc1OWU3OTM0ZmIyIgp9.Njg2ODU1YzU3ODM2MmU3NjIyNDhmMjJlMmNjMTIxM2RjN2E2YWZmOGViZGE1MjI0Nzc4MGViNmI1YWU5MTg3Nw==