JSON Web Token 簡介

在API驅動開發的今天,針對API的驗證受權愈來愈重要,這是保證數據安全第一步。基於token受權的機制隨着實踐的不斷進步也推陳出新,其中較爲人知的有:javascript

  • HTTP Basic
  • API Key
  • OAuth2
  • JSON Web Token(JWT)

他們都有各自不一樣適用場景,此處僅對JWT進行拋磚引玉簡單介紹。html

JWT是Internet Engineering Task Force(IETF)制定的開放標準,歸檔爲RFC 7519java

JWT兩大優勢:

  • 小巧:因爲尺寸較小,JWT能夠經過URL,POST參數或HTTP標頭內發送。另外,尺寸越小意味着傳輸速度越快。
  • 自包含:Token的載荷部分能夠包含有關用戶的全部必需信息,避免了屢次查詢數據庫的須要

JWT基本結構

  1. Header(頭部)
  2. Payload(荷載)
  3. Signature(簽名)

jwt最終造成的字符串結構如:xxxxx.yyyyy.zzzzz,每一部分都是基於base64url編碼的值。算法

Header部分

一般狀況下Header部分會包含兩個值,typ表示token類型,alg表示hash算法,如:數據庫

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

Payload部分

這部分是包含聲明數據的有效荷載,共有有三種聲明數據:Registered、Public、Private,全部的聲明數據都不是必須的。json

Registered

此種類型的聲明是預先定義的,每個都有特定的含義。此種類型的聲明每每是推薦使用的,由於他們讓JWT的數據更合理。目前已經註冊的類型有:api

  • iss:issuer的簡寫,表示發行JWT的主體方
  • sub:subject的簡寫,表示該JWT的主題,該值需在上下文中惟一或全局惟一
  • aud:audience的簡寫,表示該JWT的接收人
  • exp:expiration的簡寫,表示過時時間,其值必須爲Unix時間戳
  • nbf:not before的簡寫,表示JWT生效時間,其值必須爲Unix時間戳
  • iat:issued at的簡寫,表示JWT的發行時間
  • jti:JWT ID的簡寫,表示JWT的惟一標識

Public

此種類型的聲明可由JWT的使用者隨意定義,但一般狀況下爲了不衝突,咱們須要使用IANA JSON Web Token Registry中已註冊的,或者被定義爲包含抗衝突命名空間的URI。安全

Private

此種類型的聲明可由JWT的使用者隨意定義,但一般狀況下咱們須要使用Registered和Public以外的。服務器

{
    "iss": "api",
    "exp": 1300819380,
    "email": "test@email.com",
    "hobby": "basketball"
}

Signature部分

要建立簽名部分,必須採用已編碼的Header、已編碼的Payload、密匙、簽名算法。編碼

簽名的計算邏輯:

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

從上面的計算方法能夠看出,JWT只保證數據的不可串改,不保證數據不可窺探。假如咱們的secret值爲‘password',那麼由本篇內容中羅列的示例數據計算出的最終JWT值爲:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhcGkiLCJleHAiOjEzMDA4MTkzODAsImVtYWlsIjoidGVzdEBlbWFpbC5jb20iLCJob2JieSI6ImJhc2tldGJhbGwifQ.hKYJybV4u0Rc4oIB7l7LKbHWbKlMM1dkquq53MM5N2Q

咱們能夠在JWT Debugger進行驗證.

JWT的使用

JWT能夠經過任何方式從客戶端發送到服務器,但一般在API的驗證流程中使用HTTP-Bearer

Authorization: Bearer <token>

下圖展現了完整的流程:

jwt-diagram.png

相關文章
相關標籤/搜索