JWT

什麼是JWT

Json web token (JWT), 是爲了在網絡應用環境間傳遞聲明而執行的一種基於JSON的開放標準((RFC 7519).該token被設計爲緊湊且安全的,特別適用於分佈式站點的單點登錄(SSO)場景。JWT的聲明一般被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息,以便於從資源服務器獲取資源,也可以增加一些額外的其它業務邏輯所必須的聲明信息,該token也可直接被用於認證,也可被加密。

什麼情況下使用JWT比較適合?
授權:這是最常見的使用場景,解決單點登錄問題。因爲JWT使用起來輕便,開銷小,服務端不用記錄用戶狀態信息(無狀態),所以使用比較廣泛;
信息交換:JWT是在各個服務之間安全傳輸信息的好方法。因爲JWT可以簽名,例如,使用公鑰/私鑰對兒 - 可以確定請求方是合法的。此外,由於使用標頭和有效負載計算簽名,還可以驗證內容是否未被篡改。
JWT的結構體是什麼樣的?
JWT由三部分組成,分別是頭信息、有效載荷、簽名,中間以(.)分隔,如下格式:

xxx.yyy.zzz

header(頭信息)
由兩部分組成,令牌類型(即:JWT)、散列算法(HMAC、RSASSA、RSASSA-PSS等),例如:

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

然後,這個JSON被編碼爲Base64Url,形成JWT的第一部分。

Payload(有效載荷)
JWT的第二部分是payload,其中包含claims。claims是關於實體(常用的是用戶信息)和其他數據的聲明,claims有三種類型: registered, public, and private claims。
Registered claims: 這些是一組預定義的claims,非強制性的,但是推薦使用, iss(發行人), exp(到期時間), sub(主題), aud(觀衆)等;
Public claims: 自定義claims,注意不要和JWT註冊表中屬性衝突,這裏可以查看JWT註冊表
Private claims: 這些是自定義的claims,用於在同意使用這些claims的各方之間共享信息,它們既不是Registered claims,也不是Public claims。
以下是payload示例:

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

然後,再經過Base64Url編碼,形成JWT的第二部分;

注意:對於簽名令牌,此信息雖然可以防止篡改,但任何人都可以讀取。除非加密,否則不要將敏感信息放入到Payload或Header元素中。

Signature
要創建簽名部分,必須採用編碼的Header,編碼的Payload,祕鑰,Header中指定的算法,並對其進行簽名。
例如,如果要使用HMAC SHA256算法,將按以下方式創建簽名:

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

簽名用於驗證消息在此過程中未被篡改,並且,在使用私鑰簽名令牌的情況下,它還可以驗證JWT的請求方是否是它所聲明的請求方。
輸出是三個由點分隔的Base64-URL字符串,可以在HTML和HTTP環境中輕鬆傳遞,與SAML等基於XML的標準相比更加緊湊。
例如:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

JWT工作機制?
在身份驗證中,當用戶使用其憑據成功登錄時,將返回JSON Web Token(即:JWT)。由於令牌是憑證,因此必須非常小心以防止出現安全問題。一般情況下,不應將令牌保留的時間超過要求。理論上超時時間越短越好。

每當用戶想要訪問受保護的路由或資源時,用戶代理應該使用Bearer模式發送JWT,通常在Authorization header中。標題內容應如下所示:

Authorization: Bearer <token>

在某些情況下,這可以作爲無狀態授權機制。服務器的受保護路由將檢查Authorization header中的有效JWT ,如果有效,則允許用戶訪問受保護資源。如果JWT包含必要的數據,則可以減少查詢數據庫或緩存信息。
如果在Authorization header中發送令牌,則跨域資源共享(CORS)將不會成爲問題,因爲它不使用cookie。

注意:使用簽名令牌,雖然他們無法更改,但是令牌中包含的所有信息都會向用戶或其他方公開。這意味着不應該在令牌中放置敏感信息。

使用JWT的好處是什麼?
相比Simple Web Tokens (SWT)(簡單Web令牌) and Security Assertion Markup Language Tokens (SAML)(安全斷言標記語言令牌);

JWT比SAML更簡潔,在HTML和HTTP環境中傳遞更方便;
在安全方面,SWT只能使用HMAC算法通過共享密鑰對稱簽名。但是,JWT和SAML令牌可以使用X.509證書形式的公鑰/私鑰對進行簽名。與簽名JSON的簡單性相比,使用XML數字簽名可能會存在安全漏洞;
JSON解析成對象相比XML更流行、方便。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章