你是否曾經有在使用網頁時想過,遠端的網頁伺服器是如何辨識用戶的,例如我們使用了PTT網頁版服務如果有駭客從網路傳輸的過程中擷取我們的資料封包,加工後把我們的文章亂改完再傳給PTT網頁伺服器。

是不是非常的可怕!當然早就有人想到要怎麼避免類似的攻擊,聽我娓娓道來…

保持連線的秘密

在了解如何避免駭客擷取封包前,我會先帶大家了解網站的識別用戶機制。如果我們登入了一個會員系統,這個會員系統是怎麼持續跟我們保持連線,辨識我們是本人呢?別急,首先讓我們先來了解一下HTTP協定的一個重要特性。

HTTP is stateless

首先當我們輸入 ‘http://google.com’ 時,就代表我們遵守了廣大網路世界的共同協定HTTP,而HTTP有一個特徵,那就是HTTP is stateless,HTTP他是無狀態的,你可以把它想像成它是一個插頭,斷線了插頭就會拔開,意味著client端不再具備與server端地連線。

所以每一個用戶對伺服器發起的操作請求都是獨立的,意思是 Server 端與 Client 端不會保持隨時都連線狀態,因此不會有雙方狀態的即時更新。這時候就衍生出了解決方案: JWT或Session。

Session

什麼是Session呢?可以把他理解成會員制度。 Session如果放在網頁客戶端就是Cookie,如果放在網頁伺服器端就叫Seesion

  • Cookie:Client 端的憑證,有如會員卡。
  • Session:Server 端的憑證對照表,有如會員名冊。 我們來理一下整個流程,當我們登入後,伺服器端(Server)會產出Session紀錄回傳給用戶端(Client),之後每當用戶需要對網頁進行操作時,就會發送請求並在訊息中夾帶 SessionID(會員卡) 與 Server 端的 Session (會員名冊)進行比對。

清除Session方式:

當然會員卡不會是永久的,總會有個期限,我們有以下兩種方式來消除會員權限功能。

  1. 等待 Session 過期。(Session再產生出來時都匯給他們一個期限)
  2. Client 端主動按下登出來刪除會員權限。

總之每當用戶端按下登出,意即本次的會員權限消失,在這邊我們可以想像成遊樂園的一日體驗卷的感覺,當我們按下登出時就代表我們把一日體驗卷給撕爛,或是我們可以等到明天他過期就不能進去遊樂園了。

JWT (Json Web Token)

JWT簡稱Json Web Token,有別於Session的會員卡制度,JWT是一種通行證,意即當用戶端登入時,伺服器端會負責產出JWT,但伺服器端不會建立會員名冊,會直接把通行證發出去,此後每當有用戶請求於伺服器時,都會先認JWT通行證,也因此JWT比Seesion少了一個驗證會員是否在會員名冊上的動作。但因為沒有會員名冊,因此要更小心的處理JWT,以免被有心人是冒用。

JWT組成

JWT主要分為三段,分別為header、payload與signature,各個段落都會以 . 做區隔,header、payload是透過Base64Url編碼方式去編碼,因此Header和Payload採用的Base64URL編碼機制是可以反解的,中間的payload為傳輸的重點資訊有時候會進行嚴謹的加密,而Signature則是運用雜湊技術來產生一組不可反解的亂數,用來驗證 JWT是否經過篡改。

Header - 標記 token 的類型與雜湊函式名稱。
Payload - 要攜帶的資料,也可以指定 token 的過期時間。
Signature - 根據 Header 和 Payload,加上密鑰 (secret) 進行雜湊,驗證 JWT 是否經過篡改。

JWT運作原理

用戶端在登入後會向伺服器端換取一個JWT(通行證),之後每當像網頁伺服器發送對網頁的操作請求,都要在請求中挾帶這個JWT(通行證)當參數。

Session vs JWT

究竟是有會員名冊的會員制度Session吸引人,還是只用通行證就能辨識的JWT令人嚮往,歡迎來到這一期的 94 要對決。

既然兩個都是目前網頁識別用戶端的主流,我們來對決一下哪個好用~下圖為他們各自的運作方式循序圖,可以看出兩者其實非常像,都會在請求於伺服器端時挾帶不同的辨識方法,主要差別在於Session的server端在建立連線辨識資訊時,是否會順便記錄在server端,而JWT則不會,JWT基本上只會產出通行證而已。

下圖是我統整的誰贏誰輸的結論XD,我們從左到右一個一個來解釋:

  1. 跨伺服器:JWT勝,Session機制由於受到瀏覽器安全機制影響,限制了來自不同源(不同協議、域名或端口)的網頁之間的交互。
  2. 主動撤銷:Session勝,Session可以從伺服器主動撤銷客戶端的Session,而JWT內建沒有這個功能,但其實可以用黑白名單的方式模擬出主動撤銷。
  3. 第三方驗證:Session由於限制不同源政策,所以很多第三方的驗證都是透過JWT來實現的,如OAUTH技術,最典型的例子是使用google帳號去登入其他非google所屬的網站。
  4. 安全性:平手,兩者都有不安全的地方,像是Session容易被CSRF攻擊,JWT是把所有一切都交給客戶端存放,所以是會需要在實施辨識通行證(Token)方法時要特別的謹慎。

重點回顧

  1. Session是什麼?
  2. JWT是什麼?
  3. Session vs. JWT

總結

最近的文章怎麼總是在對決,上一篇Generic泛型-可以接受各種資料型態的萬能函式我也是在拿兩個東西互相PK我也是在拿兩個東西互相PK,人生於憂患死於安樂,對決的情況在所難免,因為我的原則就是我可不想被現代的這個社會世代Web市場給淘汰掉,我一定要成為現在這個社會時代Web市場上的最後Winner!