JWT的原理和應用


4,一些問題

a、token到底生成什么樣最好?(規則),每個用戶要唯一
b、token返回給客戶端之后,服務端還要保存嗎?
c、校驗token時,怎么保證數據並沒有被黑客攔截並篡改?(安全)
d、token頒發給客戶端之后,要不要有過期時間?
e、多次登錄生成的token都是一樣的嗎?都是可用的嗎?
 

5,JWT規則詳解

一個JWT實際上就是一個字符串,它由三部分組成:頭部、載荷與簽名 header.payload.signature
一個正常的token為: eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjYyNywiZXhwIjoxNTcwMDE0ODg1fQ.vPbQh4syxNCzkKXKPSM93LzzLqoJdzPDNeKz8tz9cFM4NzhIOdPrJcH2DG-9-9MCUufCgrAhhGjuo85GKV4bOQ
 
 

 

6,JWT令牌的優點:

a、jwt基於json,非常方便解析
b、可以再令牌中自定義豐富的內容,易擴展(payload可以擴展)
c、通過簽名,讓JWT防止被篡改,安全性高
d、資源服務使用JWT可不依賴認證服務即可完成授權
 

8、問題解答

a、token到底生成什么樣最好?(規則),每個用戶要唯一
三部分組成:頭部、載荷與簽名 header.payload.signature
 
b、token返回給客戶端之后,服務端還要保存嗎?
服務端不需要保存
 
c、校驗token時,怎么保證數據並沒有被黑客攔截並篡改?(安全)
signature中有私鑰來進行簽名,可以保證安全性
 
d、token頒發給客戶端之后,要不要有過期時間?
需要設置token過期時間
 
e、多次登錄生成的token都是一樣的嗎?都是可用的嗎?
可以再payload加上時間戳,來保證每次生成的token都不一樣,都是可用的
 
 
 
 

JWT使用

 

  1. 首先,前端通過Web表單將自己的用戶名和密碼發送到后端的接口。這一過程一般是一個HTTP POST請求。建議的方式是通過SSL加密的傳輸(https協議),從而避免敏感信息被嗅探。
  2. 后端核對用戶名和密碼成功后,將用戶的id等其他信息作為JWT Payload(負載),將其與頭部分別進行Base64編碼拼接后簽名,形成一個JWT。形成的JWT就是一個形同lll.zzz.xxx的字符串。
  3. 后端將JWT字符串作為登錄成功的返回結果返回給前端。前端可以將返回的結果保存在localStorage或sessionStorage上,退出登錄時前端刪除保存的JWT即可。
  4. 前端在每次請求時將JWT放入HTTP Header中的Authorization位。(解決XSS和XSRF問題)
  5. 后端檢查是否存在,如存在驗證JWT的有效性。例如,檢查簽名是否正確;檢查Token是否過期;檢查Token的接收方是否是自己(可選)。
  6. 驗證通過后后端使用JWT中包含的用戶信息進行其他邏輯操作,返回相應結果。

和Session方式存儲id的差異

Session方式存儲用戶id的最大弊病在於Session是存儲在服務器端的,所以需要占用大量服務器內存,對於較大型應用而言可能還要保存許多的狀態。一般而言,大型應用還需要借助一些KV數據庫和一系列緩存機制來實現Session的存儲。

而JWT方式將用戶狀態分散到了客戶端中,可以明顯減輕服務端的內存壓力。除了用戶id之外,還可以存儲其他的和用戶相關的信息,例如該用戶是否是管理員、用戶所在的分組等。雖說JWT方式讓服務器有一些計算壓力(例如加密、編碼和解碼),但是這些壓力相比磁盤存儲而言可能就不算什么了。具體是否采用,需要在不同場景下用數據說話。

  • 單點登錄  

Session方式來存儲用戶id,一開始用戶的Session只會存儲在一台服務器上。對於有多個子域名的站點,每個子域名至少會對應一台不同的服務器,例如:www.taobao.comnv.taobao.comnz.taobao.comlogin.taobao.com。所以如果要實現在login.taobao.com登錄后,在其他的子域名下依然可以取到Session,這要求我們在多台服務器上同步Session。使用JWT的方式則沒有這個問題的存在,因為用戶的狀態已經被傳送到了客戶端。

 

總結

JWT的主要作用在於(一)可附帶用戶信息,后端直接通過JWT獲取相關信息。(二)使用本地保存,通過HTTP Header中的Authorization位提交驗證。但其實關於JWT存放到哪里一直有很多討論,有人說存放到本地存儲,有人說存 cookie。

 

1.2JWT交互流程

1、用戶登錄

2、服務的認證,通過后根據secret生成token

3、將生成的token返回給瀏覽器

4、用戶每次請求攜帶token

5、服務端利用公鑰解讀jwt簽名,判斷簽名有效后,從Payload中獲取用戶信息

6、處理請求,返回響應結果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM