JSON Web Tokens

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 內的資訊就可以確認該 使用者是否可以取用相關資源。

Authentication flow

使用 JSON Web Tokens 的好處

  1. 可以容易的橫向 scale
  2. 維護更容易(沒有需要長期儲存的資料)
  3. 跨 Domain RESTful API (不需要 CORS cookie)
  4. 可以設定 Token 的有效期限
  5. 單一 Token 即包含所有認證需要的資訊

傳統的 Session

Session flow

使用者認證後伺服器傳回一個 session ID,之後伺服器可以用此ID查訊使用者資訊

常見問題

  1. 需要資料庫統一儲存登錄資訊
  2. 如何登出使用者?

JSON Web Token 的潛在問題

  1. XSS, CSRF, Replay attack, MITM
  2. JWT 透過數位簽章跟加密來防止竄改或是竊取裡面的資料,但是 JWT 被儲存在 local storage 或是 cookies 裡面的時候,同一個 domain 的 JavaScript 同 樣都可以存取這些 JWT,因此有潛在的 XSS 或是 CSRF 攻擊的風險。
  3. JWT 的大小比單純的 session ID 大的多
  4. 保護簽章用的密文或是私鑰變得非常重要

如何應對重播攻擊

  1. 使用較短的有效期限
  2. 客戶端定期更新Token
  3. 伺服器端使用黑名單阻擋有問題的客戶

Browser 會自動把 cookie 包含在 header 裡面所以適合用來保護網頁的存取

結論

Don’t use JWT for persistent, long-lived data.

參考文獻

  1. https://ponyfoo.com/articles/json-web-tokens-vs-session-cookies
  2. http://by.jtl.xyz/2016/06/the-unspoken-vulnerability-of-jwts.html
  3. https://stackoverflow.com/questions/37582444/jwt-vs-cookies-for-token-based-authentication
  4. https://dzone.com/articles/jwtjson-web-tokens-are-better-than-session-cookies
  5. http://cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions/
  6. https://jwt.io/