JWT 在前後端分離中的應用與實踐

關於前後端分離

前後端分離是一個很有趣的議題,它不僅僅是指前後端工程師之間的相互獨立的合作分工方式,更是前後端之間開發模式與交互模式的模塊化、解耦化。計算機世界的經驗告訴我們,對於複雜的事物,模塊化總是好的,無論是後端API開發中越來越成爲規範的RESTful API風格,還是Web前端越來越多的模板、框架(參見MVC,MVP 和 MVVM ),包括移動應用中前後端天然分離的特質,都證實了前後端分離的重要性與必要性。

實現前後端分離,對於後端開發人員來說是一件很幸福的事情,因爲不需要再考慮怎樣在HTML中套入數據,只關心數據邏輯的處理;而前端則需要承擔接收數據之後界面呈現、用戶交互、數據傳遞等所有任務。雖然這看起來加重了前端的工作量,但實際上有越來越多豐富多樣的前端框架可供選擇,這讓前端開發變得越來越結構化、系統化。

JWT 介紹及其原理

基於瀏覽器的傳統Web應用在用戶授權放面往往還是採用Cookie+Session的方式,這種用戶授權機制已經不再適合移動應用的開發,JWT恰逢其時。

Cookie+Session的存在主要是爲了解決HTTP這一無狀態協議下服務器如何識別用戶的問題,其原理就是在用戶登錄通過驗證後,服務端將數據加密後保存到客戶端瀏覽器的Cookie中,同時服務器保留相對應的Session。用戶之後發起的請求都會攜帶Cookie信息,服務端需要根據Cookie尋回對應的Session,從而完成驗證,確認這是之前登陸過的用戶。其工作原理如下圖所示:


JWT是Auth0提出的通過對JSON進行加密簽名來實現授權驗證的方案,編碼之後的JWT看起來是這樣的一串字符:

.分爲三段,通過解碼可以得到:

 

 在使用過程中,服務端通過用戶登錄驗證之後,將Header+Claim信息加密後得到第三段簽名,然後將簽名返回給客戶端,在後續請求中,服務端只需要對用戶請求中包含的JWT進行解碼,即可驗證是否可以授權用戶獲取相應信息,其原理如下圖所示:

 

通過比較可以看出,使用JWT可以省去服務端讀取Session的步驟,這樣更符合RESTful的規範。但是對於客戶端(或App端)來說,爲了保存用戶授權信息,仍然需要通過Cookie或類似的機制進行本地保存。因此JWT是用來取代服務端的Session而非客戶端Cookie的方案,當然對於客戶端本地存儲,HTML5提供了Cookie之外更多的解決方案(localStorage/sessionStorage),究竟採用哪種存儲方式,其實從Js操作上來看沒有本質上的差異,不同的選擇更多是出於安全性的考慮。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章