1. 程式人生 > >Json Token介紹(一)

Json Token介紹(一)

什麼是JSON Web Token?

JSON Web Token(JWT)是一個開放標準(RFC 7519),它定義了一種緊湊且獨立的方式,可以在各方之間作為JSON物件安全地傳輸資訊。此資訊可以通過數字簽名進行驗證和信任。 JWT可以使用祕密(使用HMAC演算法)或使用RSA或ECDSA的公鑰/私鑰對進行簽名。

雖然JWT可以加密以在各方之間提供保密,但我們將專注於簽名令牌。簽名令牌可以驗證其中包含的宣告的完整性,而加密令牌則隱藏其他方的宣告。當使用公鑰/私鑰對簽署令牌時,簽名還證明只有持有私鑰的一方是簽署私鑰的一方。

什麼時候應該使用JSON Web令牌?

以下是JSON Web令牌有用的一些場景:

  • 授權:這是使用JWT的最常見方案。一旦使用者登入,每個後續請求將包括JWT,允許使用者訪問該令牌允許的路由,服務和資源。 Single Sign On是一種現在廣泛使用JWT的功能,因為它的開銷很小,並且能夠在不同的域中輕鬆使用。
  • 資訊交換:JSON Web令牌是在各方之間安全傳輸資訊的好方法。因為JWT可以簽名 - 例如,使用公鑰/私鑰對 - 您可以確定發件人是他們所說的人。此外,由於使用標頭和有效負載計算簽名,您還可以驗證內容是否未被篡改。

什麼是JSON Web令牌結構?

在緊湊的形式中,JSON Web Tokens由三個部分組成,用點(。)分隔,它們是:

  • 有效載荷
  • 簽名

因此,JWT通常如下所示。

xxxxx.yyyyy.zzzzz

讓我們分解不同的部分。

標頭通常由兩部分組成:令牌的型別,即JWT,以及正在使用的雜湊演算法,例如HMAC SHA256或RSA。

例如:

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

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

有效載荷

令牌的第二部分是有效負載,其中包含宣告。宣告是關於實體(通常是使用者)和其他資料的宣告。索賠有三種類型:註冊,公開和私人索賠。

已註冊的宣告:這些是一組預定義宣告,不是強制性的,但建議使用,以提供一組有用的,可互操作的宣告。其中一些是:iss(發行人),exp(到期時間),sub(主題),aud(觀眾)等。

  • 公開宣告:這些可以由使用JWT的人隨意定義。但是為避免衝突,應在IANA JSON Web令牌登錄檔中定義它們,或者將其定義為包含防衝突名稱空間的URI。
  • 私人宣告:這些宣告是為了在同意使用它們的各方之間共享資訊而建立的,並且既不是註冊宣告也不是公開宣告。

示例有效負載可以是:

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

然後,有效負載經過Base64Url編碼,形成JSON Web令牌的第二部分。

簽名

要建立簽名部分,您必須採用編碼標頭,編碼的有效負載,祕密,標頭中指定的演算法,並對其進行簽名。

例如,如果要使用HMAC SHA256演算法,將按以下方式建立簽名:

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

簽名用於驗證訊息在此過程中未被更改,並且,在使用私鑰簽名的令牌的情況下,它還可以驗證JWT的發件人是否是它所聲稱的人。

把所有放在一起

輸出是三個由點分隔的Base64-URL字串,可以在HTML和HTTP環境中輕鬆傳遞,與SAML等基於XML的標準相比更加緊湊。

下面顯示了一個JWT,它具有先前的頭和​​有效負載編碼,並使用機密簽名。

Encoded JWT

如果您想使用JWT並將這些概念付諸實踐,您可以使用jwt.io Debugger來解碼,驗證和生成JWT。

JWT.io Debugger