Json Web Token
什麼是JSON Web Token
JSON Web Token(JWT) 是一個開源標準,體積小且自包含的並且可以在兩者間進行安全傳輸JSON物件。這些資訊都是經過加密和簽名。(常用一些演算法HMAC和RSA 或者ECDSA)
什麼時候使用JSON Web Tokens?
下面列出一些JSON Web Tokens 常用的一些場景:
-
Authorization:這是使用JWT大多數最常用的場景,每次使用者登陸系統,伺服器生成一個JWT,隨後每次客戶端的請求都將JWT放到Header中,伺服器端每次驗證這個JWT,如果通過,允許使用者訪問API以及一些服務和資源,JWT被廣泛使用在單點登入,因為整個體積比較小,可以很容易穿過不同域。
-
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。
-
Registered claims:這些是一組預定義的claims,不是強制性的,但建議使用, 提供一組有用的、可互操作的claims。其中一些是:iss(issuer)、exp(expiration time)、sub(subject)、aud(audience)等
-
Public claims:這些可以由使用JWT的人隨意定義,為了避免衝突,它們應該在 IANA JSON Web Token Registry中定義或定義為包含名稱空間的URI。
-
Private claims:這部分claims是為不同方之間共享資訊,它既不是register claims 也不是public claims。
下面是payload例子
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
payload 經過Base64編碼組成了JSON Web Token 第二部分
Signature
-
Base64 編碼 header
-
Base64 編碼 payload
-
secret 祕鑰
-
簽名演算法是使用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 沒有自然的文件到物件對映。