JSON Web Tokens 研究筆記
- 什麼是 JSON Web Tokens ?
- JSON Web Tokens 要怎麼用?
- 使用 JSON Web Tokens 的好處
- 傳統的 Session
- JSON Web Token 的潛在問題
- 把 JWT 或是 session ID 存在 cookie 的好處
- 結論
- 參考文獻
JSON Web Tokens 是什麼?它真的可以用來取代傳統的 session cookies 嗎? 本篇為研究 JWT 時所做的筆記。
什麼是 JSON Web Tokens ?
JSON Web Token 縮寫為 JWT,唸作 jot,是一個 IETF 標準(RFC 7519),定義了不同的群體間可以精 簡且安全的方式交換資訊的方法,這些資訊是包裝在一個 JSON Object 裡面,因 而得名。這些資訊因為經過數位簽章所以可以被驗證是否為可信任的內容,簽章 的方式可以是單一密文(HMAC)或是公鑰私鑰系統(RSA)。
JSON Web Tokens 要怎麼用?
當使用者跟伺服器登錄之後,伺服器可以傳回一個 JSON Web Token,此 Token 可 以存在瀏覽器的 local storage 或是 cookie。
當使用者想要再次存取某些需要認證的資訊的時候,他們需要把這個 JWT 送回伺 服器,通常以 Authorization header 的形式,例如:
Authorization: Bearer <token>
這個方式對於伺服器來說相較於 session cookie 的方式輕量(stateless),因 為伺服器不需要保有相關 session 的訊息,只需要 JWT 內的資訊就可以確認該 使用者是否可以取用相關資源。
使用 JSON Web Tokens 的好處
- 可以容易的橫向 scale
- 維護更容易(沒有需要長期儲存的資料)
- 跨 Domain RESTful API (不需要 CORS cookie)
- 可以設定 Token 的有效期限
- 單一 Token 即包含所有認證需要的資訊
傳統的 Session
使用者認證後伺服器傳回一個 session ID,之後伺服器可以用此ID查訊使用者資訊
常見問題
- 需要資料庫統一儲存登錄資訊
- 如何登出使用者?
JSON Web Token 的潛在問題
- XSS, CSRF, Replay attack, MITM
- JWT 透過數位簽章跟加密來防止竄改或是竊取裡面的資料,但是 JWT 被儲存在 local storage 或是 cookies 裡面的時候,同一個 domain 的 JavaScript 同 樣都可以存取這些 JWT,因此有潛在的 XSS 或是 CSRF 攻擊的風險。
- JWT 的大小比單純的 session ID 大的多
- 保護簽章用的密文或是私鑰變得非常重要
如何應對重播攻擊
- 使用較短的有效期限
- 客戶端定期更新Token
- 伺服器端使用黑名單阻擋有問題的客戶
把 JWT 或是 session ID 存在 cookie 的好處
Browser 會自動把 cookie 包含在 header 裡面所以適合用來保護網頁的存取
結論
Don’t use JWT for persistent, long-lived data.
參考文獻
- https://ponyfoo.com/articles/json-web-tokens-vs-session-cookies
- http://by.jtl.xyz/2016/06/the-unspoken-vulnerability-of-jwts.html
- https://stackoverflow.com/questions/37582444/jwt-vs-cookies-for-token-based-authentication
- https://dzone.com/articles/jwtjson-web-tokens-are-better-than-session-cookies
- http://cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions/
- https://jwt.io/