聊聊JWT

隨着先後端分離愈來愈普及,傳統的基於cookie-session的鑑權方式已經不適用於先後端分離項目了。在鑑權方面,有許多的實現方式,這篇文章不是來對比和介紹各個鑑權方式的優缺點,而是來普及其中之一-JWT。html

更多文章,歡迎關注微信公衆號:深夜程猿。 算法

JWT工做原理圖

什麼是JWT

JWT是JSON Web Token的縮寫。 JSON Web Token(JWT)是一個開放標準(RFC 7519),它定義了一種緊湊且獨立的方式,能夠在各方之間做爲JSON對象安全地傳輸信息。此信息能夠經過數字簽名進行驗證和信任。 JWT可使用加密算法(例如HMAC算法)或使用RSA或ECDSA的公鑰/私鑰對進行簽名。 雖然JWT能夠加密以在各方之間提供保密,但咱們將專一於簽名令牌。簽名令牌能夠驗證其中包含的聲明的完整性,而加密令牌則隱藏其餘方的聲明。當使用公鑰/私鑰對簽署令牌時,簽名還證實只有持有私鑰的一方是簽署私鑰的一方。數據庫

JWT的結構

JWT由三部分組成,使用'.'號鏈接:後端

  • Header部分 標頭一般由兩部分組成:令牌的類型,即JWT,以及正在使用的散列算法,例如HMAC SHA256或RSA。,好比{ "alg": "HS256", "typ": "JWT" }表示使用了HS256來生成簽名。Header部分會使用Base64Url編碼設置到JWT的第一部分。
  • Payload部分: 令牌的第二部分是有效負載,其中包含聲明。聲明是關於實體(一般是用戶)和其餘數據的聲明。聲明有三種類型:註冊,公開和私有聲明。
    註冊聲明:這些是一組預約義的聲明,它們不是強制性的,可是建議使用,以提供一組有用的,可互操做的聲明。其中一些是:iss(發行人),exp(到期時間),sub(主題),aud(觀衆)等。
    公開聲明:這些能夠由使用JWT的人隨意定義。可是爲避免衝突,應在IANA JSON Web令牌註冊表中定義它們,或者將其定義爲包含防衝突命名空間的URI。
    私有聲明:這些是爲在贊成使用它們的各方之間共享信息而建立的自定義聲明,既不是註冊聲明也不是公開聲明。
    一個Payload示例:
{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
 }
複製代碼
Payload也會和Header同樣Base64Url編碼,放在JWT第二部分。
複製代碼
  • Signature部分: 要建立簽名部分,必須採用編碼標頭(Header),編碼的有效負載(Payload),祕鑰,標頭中指定的算法,並對其進行簽名。 例如,若是要使用HMAC SHA256算法,將按如下方式建立簽名:
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)
複製代碼

最後用'.'號把三個部分鏈接起來就完成了一個完整的JWT。跨域

JWT的用途

認證

這是使用JWT的最多見場景。一旦用戶登陸,每一個後續請求將包括JWT,容許用戶訪問該令牌容許的路由,服務和資源。 單點登陸是一種如今普遍使用JWT的功能,由於它的開銷很小,而且可以在不一樣的域中輕鬆使用安全

信息交換

JSON Web Token是在各方之間安全傳輸信息的好方法。由於JWT能夠簽名 - 例如,使用公鑰/私鑰對 - 您能夠肯定發件人是他們所說的人。此外,因爲使用標頭和有效負載計算簽名,您還能夠驗證內容是否未被篡改。bash

JWT工做原理

在身份驗證中,當用戶使用其憑據成功登陸時,將返回JSON Web令牌。因爲令牌是憑證,所以必須很是當心以防止出現安全問題。通常狀況下,您不該該將令牌保留的時間超過要求。 每當用戶想要訪問受保護的路由或資源時,用戶代理應該使用承載模式發送JWT,一般在Authorization標頭中。標題的內容應以下所示:服務器

Authorization: Bearer <token>
複製代碼

在某些狀況下,這能夠是無狀態受權機制。服務器的受保護路由將在Authorization標頭中檢查有效的JWT,若是存在,則容許用戶訪問受保護的資源。若是JWT包含必要的數據,則能夠減小查詢數據庫以進行某些操做的須要,儘管可能並不是老是如此。 若是在Authorization標頭中發送令牌,則跨域資源共享(CORS)將不會成爲問題,由於它不使用cookie。 下圖顯示瞭如何獲取JWT並用於訪問API或資源: 微信

JWT工做原理圖

  1. 應用程序或客戶端向受權服務器請求受權。這是經過其中一個不一樣的受權流程執行的。例如,典型的OpenID Connect兼容Web應用程序將使用受權代碼流經過/ oauth / authorize端點。
  2. 授予受權後,受權服務器會嚮應用程序返回訪問令牌。
  3. 應用程序使用訪問令牌來訪問受保護資源(如API)。 因爲JWT會暴露給第三方和用戶,因此在生成JWT的時候咱們最好不要把用戶隱私數據放進去。

參考連接:Introduction to JSON Web Tokenscookie

相關文章
相關標籤/搜索