介紹了關於驗證(Authentication)、授權(Authorization),以及 OAuth 的相關概念及流程,今天就來提一下大家一定都聽過的 JWT 是什麼吧!
JWT,全名是 Json Web Token,從字面上的意思來看,就是符合 Json 格式的 token,是一種開放標準,用來進行驗證(Verify)跟授權(Authorization),在RFC 7519中被規範,可以使用密鑰以及演算法進行數位簽名,是可以被信任的。
主要由以下三個部分所組成,每個部分會由(.)做分隔:
Header:由typ
以及alg
組成。typ指的就是 token 的類型,通常會是JWT
,另外還有 JWS 以及 JWE,不過本篇主要講的是 JWT ,就先帶過。而alg代表的是這個 token 使用的簽名算法。
例如:
{
"alg":"HS256",
"typ":"JWT"
}
然後會透過Base64
進行編碼:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Payload:又被稱為 claims set,可以存放一些關於使用者的資訊以及其他資訊,分為以下部分
iss
(JWT 的發行人)、aud
(JWT的收件人)、exp
(過期時間,採用的是UNIX時間,也就是從1970年1月1日00時00分00秒起到現在的總秒數)等。{
"iss":"Lin",
"exp":1728835200,
"http://example.com/is_root": true
}
同樣會透過Base64
進行編碼:
eyJpc3MiOiJMaW4iLCJleHAiOjE3Mjg4MzUyMDAsImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ==
Signature:由經過 Base64 轉換的 Header 、經過 Base64 轉換的 Header 以及伺服器自己保存的 secret 組成,再經由 Header 裡面所載的演算法進行。例如 HS256 會透過以下方式進行雜湊演算:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
HS256 分為兩個步驟:
Ut2KC1Rq0oxvTQr0s9Mtr9TtZ_RBfx3-ZfcdtdbuRSo
最後完整的 JWT 就會用以下方式呈現,想自己試試看的話可以去這個網站
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJMaW4iLCJleHAiOjE3Mjg4MzUyMDAsImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.Ut2KC1Rq0oxvTQr0s9Mtr9TtZ_RBfx3-ZfcdtdbuRSo
流程如下:
授權(Authorization):透過 JWT 可以實現 SSO(單點登錄),也就是在允許使用者透過同一個 JWT 可以在多個應用程式和網站進行操作。
數據交換:由於 JWT 可以進行數位簽名,因此可以確保寄件者的身份正確以及內容是否未被篡改。
今天簡單介紹了 JWT 的一些概念,以及各個部分是透過編碼以及雜湊演算法進行轉換,不過由於 Header 以及Payload 只有透過 Base64 進行編碼而已,所以要記得不要把機密資訊放在裡面,不然一但 token 被攔截的話,裡面的資訊都會被看光唷!!!
RFC 7519
Introduction to JSON Web Tokens
What Is JWT and Why Should You Use JWT