Sunday, October 15, 2017

session-based authentication v.s. JWT

最近做的一個 side project ,我用 clojure 的 buddy 模組,來實現使用者認証 (Authentication) 的功能。 clojure 的 buddy 模組的一個長處,是支援 JWT (JSON Web Token) ,也因為如此,我特別仔細研究了一下,到底傳統的 session-based authentication 與新的 JWT 有什麼分別?

JWT 和 session-based authentication 相同的地方是:browser 送 request 到 server 時,都在 http request 裡增加了一些資料,讓 request 變成 stateful。不同的地方是: session-based authentication 夾帶資訊的方式是用 cookie 來攜帶 session-id ,使用者的資訊是存放在 server side 的 session 裡頭,安全性比較高。 JWT 夾帶資訊的方式,是在 http header 裡放了 token ,而 token 內容就直接存放了加密過的「使用者資訊」。也因些, JWT 的作法,並不需要 server-side session ,集群 (cluster) 也因而得到了更好的「水平擴展性」(horizontal scalability)

參考資料

但是,實務上,大部分的情況,也可以不去使用 JWT 。因為就算是 session-based authentication 也有很簡單的方式就可以支援超大量的使用者。主要的作法有兩個:一種是把 session 放在 redis 裡,這樣子多台的 application server 就可以透過 redis 來取得使用者的 session 資料。 另一種作法,是在前端的負載均衡器,設定所謂的 sticky session 。讓負載均衡的分配 http 請求,可以讓同一個 session 的請求,永遠被分配到同一台的設備上。

在 12 factor app 的觀點, JWT 是比較好的作法, sticky session 是最糟的作法。但是,從 security 的觀點, session-based authentication 有比較安全一些。JWT 的話最好要搭配 https