Json Web Token 簡稱 JWT,是一個開放的工業標準,用於資料傳輸時的安全驗證。透過將重要訊息加上私有的金鑰進行加密可以大幅的提升資料的安全性。
傳統Session的認證
用戶向應用程式提供了帳號密碼進行認證,下一次 Request 的時候用戶還要再進行一次認證
根據 Http 協議,Http 本身是一種無狀態的協議,應用程式無法知道是哪個用戶發出 Request
應用程式會在 Server 儲存一份用戶的登入資訊,並將這份登入資訊傳給瀏覽器,讓瀏覽器保存為 Cookie 以便下一次發送Request時一起傳給應用程式,讓應用程式可以識別出是哪個用戶
基於 Session 驗證會有以下幾個問題 :
關於 Session 和 Cookie 的更多介紹請參考 Session & Cookie。
Token-based Authentication
類似於 Cookie-based 的流程,但是 Server 會在 Response 時回傳一組加密的 Token(JWT 格式),以提高安全性
流程 :
優點 :
缺點 :
JWT 是由三段訊息組成 Header, Playload, Signature
將三段資訊用.
連接起來即可組成 JWT 格式的字串,如下方字串
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwaG9uZSI6IjA5MTIzNDU2NzgiLCJuYW1lIjoiVG9ueSBMaW4iLCJzZXgiOiJNYWxlIiwiYWRtaW4iOnRydWUsImlhdCI6IjIwMjAvMDUvMTQifQ.4Lyuh-1wAvYDnqHfqApHaQH7YZRJpFI8byhlnGreza0
Header 包含了兩個訊息
範例
{
"alg": "HS256",
"typ": "JWT"
}
以 base64 加密後(可以對稱解密),此即為第一段
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
放聲明(Claim)的地方,也就是要傳遞的資料,定義上有3種聲明 :
Public(公開)
定義官方的公開聲明,不建議存放敏感訊息,因為可以被解開,實務上不太會用到
Private(私有)
發放 JWT 的 Server 可以自己定義,通常也不會放敏感訊息(e.g, 密碼),實務上會放使用者帳號、用戶名稱等
範例
{
"phone": "0912345678",
"name": "Tony Lin",
"sex": "Male",
"admin": true,
"iat" : "2020/05/14"
}
以 base64 加密後(可以對稱解密),此即為第二段
eyJwaG9uZSI6IjA5MTIzNDU2NzgiLCJuYW1lIjoiVG9ueSBMaW4iLCJzZXgiOiJNYWxlIiwiYWRtaW4iOnRydWUsImlhdCI6IjIwMjAvMDUvMTQifQ
由三部分組成,base64UrlEncode(header)、base64UrlEncode(payload)、secret
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
Header 和 Playload 以.
來串接,secret 則是放在 Server 端的秘密字串,將這三個部分接在一起後進行加密
secret 需小心保存不得外洩,一旦外洩則用戶端就可以自己產生 JWT,並透過 JWT 存取資源
範例 :
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
123456
)
此即為第三段
4Lyuh-1wAvYDnqHfqApHaQH7YZRJpFI8byhlnGreza0
最後由.
來合併三段字串組成 JWT 字串,此字串即為一個合法可以核發的 JWT 字串
Header.Payload.Signature
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwaG9uZSI6IjA5MTIzNDU2NzgiLCJuYW1lIjoiVG9ueSBMaW4iLCJzZXgiOiJNYWxlIiwiYWRtaW4iOnRydWUsImlhdCI6IjIwMjAvMDUvMTQifQ.4Lyuh-1wAvYDnqHfqApHaQH7YZRJpFI8byhlnGreza0
在發 Request 時,在 Header 加入 Authorization: Bearer <token>
範例 :
post('api/user/1', {
headers: {
'Authorization': 'Bearer ' + token
}
})
Server 收到後會去檢查 JWT token 是否有效
[1] jwt.io
[2] JWT(JSON Web Token) — 原理介紹
授權
Json Web Token
JWT