你是否曾經有在使用網頁時想過,遠端的網頁伺服器是如何辨識用戶的,例如我們使用了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方式:
當然會員卡不會是永久的,總會有個期限,我們有以下兩種方式來消除會員權限功能。
- 等待 Session 過期。(Session再產生出來時都匯給他們一個期限)
- 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,我們從左到右一個一個來解釋:
- 跨伺服器:JWT勝,Session機制由於受到瀏覽器安全機制影響,限制了來自不同源(不同協議、域名或端口)的網頁之間的交互。
- 主動撤銷:Session勝,Session可以從伺服器主動撤銷客戶端的Session,而JWT內建沒有這個功能,但其實可以用黑白名單的方式模擬出主動撤銷。
- 第三方驗證:Session由於限制不同源政策,所以很多第三方的驗證都是透過JWT來實現的,如OAUTH技術,最典型的例子是使用google帳號去登入其他非google所屬的網站。
- 安全性:平手,兩者都有不安全的地方,像是Session容易被CSRF攻擊,JWT是把所有一切都交給客戶端存放,所以是會需要在實施辨識通行證(Token)方法時要特別的謹慎。
重點回顧
- Session是什麼?
- JWT是什麼?
- Session vs. JWT
總結
最近的文章怎麼總是在對決,上一篇Generic泛型-可以接受各種資料型態的萬能函式我也是在拿兩個東西互相PK我也是在拿兩個東西互相PK,人生於憂患死於安樂,對決的情況在所難免,因為我的原則就是我可不想被現代的這個社會世代Web市場給淘汰掉,我一定要成為現在這個社會時代Web市場上的最後Winner!