1. 程式人生 > 其它 >Json Web Token

Json Web Token

什麼是JSON Web Token

JSON Web Token(JWT) 是一個開源標準,體積小且自包含的並且可以在兩者間進行安全傳輸JSON物件。這些資訊都是經過加密和簽名。(常用一些演算法HMAC和RSA 或者ECDSA)

什麼時候使用JSON Web Tokens?

下面列出一些JSON Web Tokens 常用的一些場景:

  1. Authorization:這是使用JWT大多數最常用的場景,每次使用者登陸系統,伺服器生成一個JWT,隨後每次客戶端的請求都將JWT放到Header中,伺服器端每次驗證這個JWT,如果通過,允許使用者訪問API以及一些服務和資源,JWT被廣泛使用在單點登入,因為整個體積比較小,可以很容易穿過不同域。

  2. Information Exchange:JWT是一個比較好的安全的方式在兩者間進行訊息傳輸,因為JWTs能被簽名,例如,使用public公鑰/private私鑰對你能知道訊息的傳送方是誰, 額外, Header和payload也被計算在簽名內,你也可以驗證內容未被篡改。

JSON Web Token 組成結構是什麼?

JSON Web Tokens 由三部分組成通過.分割,他們是:

  • Header

  • Payload

  • Signature

因此,一個JWT通常看上去像是下面:

xxxxx.yyyyy.zzzzz

讓我們分解不同部分.

Header

Header 通常有兩部分組成,型別和簽名演算法,例如 HMAC SHA256或者RSA。

{

"alg": "HS256",

"typ": "JWT"

}

Header 經過Base64編碼組成了JSON Web Token 第一部分

Payload

token的第二部分是Payload,裡面包含claims,claims通常包含一個實體(通常使用者) 和 額外資料,

通常有三種類型的claims:registered,public,and private claims。

  1. Registered claims:這些是一組預定義的claims,不是強制性的,但建議使用, 提供一組有用的、可互操作的claims。其中一些是:iss(issuer)、exp(expiration time)、sub(subject)、aud(audience)等

  2. Public claims:這些可以由使用JWT的人隨意定義,為了避免衝突,它們應該在 IANA JSON Web Token Registry中定義或定義為包含名稱空間的URI。

  3. Private claims:這部分claims是為不同方之間共享資訊,它既不是register claims 也不是public claims。

下面是payload例子

{

"sub": "1234567890",

"name": "John Doe",

"admin": true

}

payload 經過Base64編碼組成了JSON Web Token 第二部分

Signature

  1. Base64 編碼 header

  2. Base64 編碼 payload

  3. secret 祕鑰

  4. 簽名演算法是使用Header中指定的演算法。

例如如果你想使用HMAC SHA256演算法,簽名將通過下面方式被建立:

HMACSHA256(

base64UrlEncode(header) + "." +

base64UrlEncode(payload),

secret)

簽名用來驗證訊息是否被改變在整個傳輸過程中,在使用私鑰簽名的令牌的情況下,它還可以驗證 JWT 的傳送者是誰。

字串合併

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

下面顯示的JWT是前面Header 和payload 編碼,並且使用一個secret 簽名之後。

可以使用 jwt.io Debugger 來解碼、驗證和生成 JWT。

JSON Web Tokens 如何工作?

在驗證中,如果使用者使用他們的憑證成功登陸,一個JSON Web Token將返回,由於tokens是憑證,因此必須非常小心保護以防止出現安全問題。通常,您不應將令牌保留的時間超過所需的時間。

然而,使用者想訪問一個受保護的API和資源,使用者需要傳送這個JWT,通常使用Authorization頭,使用Bearer 模式.

Authorization:Bearer<token>

在某些情況下,這是一個無狀態機制,伺服器只需要驗證header中的Authorization是否是一個有效的JWT,如果存在,則允許使用者訪問資源。

如果令牌在 Authorization 標頭中傳送,則跨源資源共享 (CORS) 不會成為問題,因為它不使用cookie 需要注意是使用簽名tokens,所有的資訊包含在token或者暴露給第三方,儘管不能改變它,但是儘量不要把安全的資訊放到token中。

為什麼使用JSON Web Tokens?

讓我們來談談與Simple Web Token(SWT) 和Security Assertioin Markup Language Tokens(SAML)相比,JSON Web Token (JWT) 的優勢。

1.相比XML,JSON 體積更小。

2.安全性方便要高。

3.JSON 更容易對映到物件,相反,XML 沒有自然的文件到物件對映。

歡迎關注本人公眾號