什麼是 JWT
不同於傳統 token,JWT 不需要存在資料庫,而是將資料直接存在 JWT
JWT 看起來像是這樣
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxODQsImlhdCI6MTYxNTYxNTQwMCwiZXhwIjoxNjE4MjA3NDAwfQ.YYsQXUL5AFXQ2KGS5ycNjT-fS9_OtdsFDOEVLU3QDF4
JWT 看起來像是一串亂數字串,其實是由 base 64 編譯過並分成三部分:
- header:加密方式&加密演算法
{
"alg": "HS256",
"typ": "JWT"
}
- payload:存在 JWT 中的資料,像是
user_id
等資訊,要注意 payload 並沒有加密,所以任何人都可以看到內容,所以不要在 payload 儲存敏感資料 - verified signature:自訂的 secret,secret 存在 server。因為 JWT 存在 client side,任何人都可以修改,但透過 signature 可以比對是否與由 server 發出的 token 相同,以保證沒有被篡改過
JWT vs. session id
傳統的登入驗證方式是在 cookie 存 session id,並在發送請求時一併發出,然後比對與資料庫儲存的 session id 是否相同,如果相同代表登入成功
但 session id 的缺點是需要在資料庫儲存 token,一方面需要更多儲存空間,另一方面當同時間許多用戶登入時,會造成資料庫塞車,而 JWT 正解決了此問題
JWT 資料都儲存在 jwt token 當中,所以不需要另外儲存