JSON Web Token(JWT)是一個開放標準(RFC 7519),它定義了一種緊湊且獨立的方式,能夠在各方之間做爲JSON對象安全地傳輸信息。此信息能夠經過數字簽名進行驗證和信任。JWT可使用祕密(使用HMAC算法)或使用RSA或ECDSA的公鑰/私鑰對進行簽名。git
雖然JWT能夠加密以在各方之間提供保密,但咱們將專一於簽名令牌。簽名令牌能夠驗證其中包含的聲明的完整性,而加密令牌則隱藏其餘方的聲明。當使用公鑰/私鑰對簽署令牌時,簽名還證實只有持有私鑰的一方是簽署私鑰的一方。github
如下是JSON Web令牌有用的一些場景:web
受權:這是使用JWT的最多見方案。一旦用戶登陸,每一個後續請求將包括JWT,容許用戶訪問該令牌容許的路由,服務和資源。Single Sign On是一種如今普遍使用JWT的功能,由於它的開銷很小,而且可以在不一樣的域中輕鬆使用。算法
信息交換:JSON Web令牌是在各方之間安全傳輸信息的好方法。由於JWT能夠簽名 - 例如,使用公鑰/私鑰對 - 您能夠肯定發件人是他們所說的人。此外,因爲使用標頭和有效負載計算簽名,您還能夠驗證內容是否未被篡改。數據庫
在緊湊的形式中,JSON Web令牌由三個部分組成(由點(.
)分隔,它們是:編程
所以,JWT一般以下所示。json
xxxxx.yyyyy.zzzzz
跨域
讓咱們分解不一樣的部分。安全
標頭一般由兩部分組成:令牌的類型,即JWT,以及正在使用的散列算法,例如HMAC SHA256或RSA。
例如:
{ "alg": "HS256", "typ": "JWT" }
而後,這個JSON被編碼爲Base64Url,造成JWT的第一部分。
令牌的第二部分是有效負載,其中包含聲明。聲明是關於實體(一般是用戶)和其餘數據的聲明。索賠有三種類型:註冊,公開和私人索賠。
已註冊的聲明:這些是一組預約義聲明,不是強制性的,但建議使用,以提供一組有用的,可互操做的聲明。其中一些是: iss(發行人), exp(到期時間), sub(主題), aud(觀衆)等。
請注意,聲明名稱只有三個字符,由於JWT意味着緊湊。
公開聲明:這些能夠由使用JWT的人隨意定義。可是爲避免衝突,應在 IANA JSON Web令牌註冊表中定義它們,或者將其定義爲包含防衝突命名空間的URI。
私人索賠:這是建立共享使用它們贊成並既不是當事人之間的信息自定義聲明註冊或公衆的權利要求。
示例有效負載能夠是:
{ "sub": "1234567890", "name": "John Doe", "admin": true }
而後,有效負載通過Base64Url編碼,造成JSON Web令牌的第二部分。
請注意,對於簽名令牌,此信息雖然能夠防止被篡改,但任何人均可以讀取。除非加密,不然不要將祕密信息放在JWT的有效負載或頭元素中。
要建立簽名部分,您必須採用編碼標頭,編碼的有效負載,祕密,標頭中指定的算法,並對其進行簽名。
例如,若是要使用HMAC SHA256算法,將按如下方式建立簽名:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
簽名用於驗證消息在此過程當中未被更改,而且,在使用私鑰簽名的令牌的狀況下,它還能夠驗證JWT的發件人是不是它所聲稱的人。
輸出是三個由點分隔的Base64-URL字符串,能夠在HTML和HTTP環境中輕鬆傳遞,與SAML等基於XML的標準相比更加緊湊。
下面顯示了一個JWT,它具備先前的頭和有效負載編碼,並使用機密簽名。
若是您想使用JWT並將這些概念付諸實踐,您可使用jwt.io Debugger來解碼,驗證和生成JWT。
在身份驗證中,當用戶使用其憑據成功登陸時,將返回JSON Web令牌。因爲令牌是憑證,所以必須很是當心以防止出現安全問題。通常狀況下,您不該該將令牌保留的時間超過要求。
每當用戶想要訪問受保護的路由或資源時,用戶代理應該使用承載模式發送JWT,一般在Authorization標頭中。標題的內容應以下所示:
Authorization: Bearer <token>
在某些狀況下,這能夠是無狀態受權機制。服務器的受保護路由將檢查Authorization
標頭中的有效JWT ,若是存在,則容許用戶訪問受保護資源。若是JWT包含必要的數據,則能夠減小查詢數據庫以進行某些操做的須要,儘管可能並不是老是如此。
若是在標Authorization
頭中發送令牌,則跨域資源共享(CORS)將不會成爲問題,由於它不使用cookie。
下圖顯示瞭如何獲取JWT並用於訪問API或資源:
/oauth/authorize
使用受權代碼流經過端點。請注意,使用簽名令牌,令牌中包含的全部信息都會向用戶或其餘方公開,即便他們沒法更改。這意味着您不該該在令牌中放置祕密信息。
讓咱們來談談與簡單Web令牌(SWT)和安全斷言標記語言令牌(SAML)相比,JSON Web令牌(JWT)的好處。
因爲JSON比XML簡潔,所以在編碼時它的大小也更小,使得JWT比SAML更緊湊。這使得JWT成爲在HTML和HTTP環境中傳遞的不錯選擇。
在安全方面,SWT只能使用HMAC算法經過共享密鑰對稱簽名。可是,JWT和SAML令牌可使用X.509證書形式的公鑰/私鑰對進行簽名。與簽名JSON的簡單性相比,使用XML數字簽名對XML進行簽名而不會引入模糊的安全漏洞很是困難。
JSON解析器在大多數編程語言中很常見,由於它們直接映射到對象。相反,XML沒有天然的文檔到對象映射。這使得使用JWT比使用SAML斷言更容易。
關於使用,JWT用於互聯網規模。這突出了在多個平臺(尤爲是移動平臺)上輕鬆進行JSON Web令牌的客戶端處理。
比較編碼的JWT和編碼的SAML的長度
若是您想了解有關JSON Web Tokens的更多信息,甚至開始使用它們在您本身的應用程序中執行身份驗證,請瀏覽到Auth0 上的JSON Web Token登陸頁面。
當即開始使用JWT
開始使用該工具