JSON Web Token
https://jwt.io/
現在很流行用 JWT 當作 HTTP basic auth 的 token
通常會長這樣
```
header["Authorization"] = "Bearer <YOUR_JWT>"
```
什麼是 HTTP basic auth? 參考
這篇文章
為什麼呢? 要先簡單介紹 JWT 才能回答這個問題
JWT 其實就是一個協定告訴你怎麼產生 token
要產生 JWT 的 token 必須包含三個部分
1. header
2. payload
3. signature
header 裡面描述了想要加密用的演算法,用來產生 signature
payload 就是一些想要讓 client 可以解析的數據
signature 就是把 header 和 payload 用 server side 才知道的 secret key 加密產生出的一串字串,用來驗證資料正確性。 可以參考
摘要算法和對稱加密算法
把 header+payload+signature 分別用 Bas64 encode 之後就變成了 JWT token
格式長這樣
encoded_header.encoded_payload.encoded_signature
那回到一開始的問題,為什麼要用 JWT 呢?
主要原因就在於這個 token 是自帶資訊的,因為我們把 加密方式、想要傳達的訊息 都存在 token 裡面了,而且還加上了 簽名 用來確保訊息的正確性。
來看看實際面吧,假設我有個前端頁面想要跟 sever 溝通,以前的作法前端跟 server 拿 token 的時候, server 亂數產生一個 uniq 的 token 給前端,之後的每個 request 就帶這個 token 作為驗證的方式
流程一樣,但我們把「server 亂數產生一個 uniq 的 token 給前端」這件事改成「server 產生一個 JWT token 給前端」會發生什麼事(以及應該怎麼做)呢?
首先定義我的 paylaod
```json
{
user_id: 1,
name: "Wayne",
permissions: [
"read_account", "write_account"
]
expired_at: 1512624558 // unix time,
token: "my-uniq-token-from-server"
}
```
然後加密成 JWT token,把這個 token 傳給前端
有什麼好處呢?
1. 前端可以用 Base64 decode payload,這樣前端就可以直接從 token 就知道我提供給他的各種資訊,例如此例前端就可以知道這個 token 有哪些權限、什麼時候過期等等
2. Server 在收到帶有這個 token 的 request 的時候,也可以從 payload 直接判斷 token 過期了沒、有沒有操作權限
3. Server 不用擔心 payload 是不是被改動過,因為只要把 payload decode 出來並用依樣的加密方式加密比對 sinature 是否一樣就知道 paylaod 是否正確