4,一些問題
5,JWT規則詳解
6,JWT令牌的優點:
8、問題解答
JWT使用
- 首先,前端通過Web表單將自己的用戶名和密碼發送到后端的接口。這一過程一般是一個HTTP POST請求。建議的方式是通過SSL加密的傳輸(https協議),從而避免敏感信息被嗅探。
- 后端核對用戶名和密碼成功后,將用戶的id等其他信息作為JWT Payload(負載),將其與頭部分別進行Base64編碼拼接后簽名,形成一個JWT。形成的JWT就是一個形同lll.zzz.xxx的字符串。
- 后端將JWT字符串作為登錄成功的返回結果返回給前端。前端可以將返回的結果保存在localStorage或sessionStorage上,退出登錄時前端刪除保存的JWT即可。
- 前端在每次請求時將JWT放入HTTP Header中的Authorization位。(解決XSS和XSRF問題)
- 后端檢查是否存在,如存在驗證JWT的有效性。例如,檢查簽名是否正確;檢查Token是否過期;檢查Token的接收方是否是自己(可選)。
- 驗證通過后后端使用JWT中包含的用戶信息進行其他邏輯操作,返回相應結果。
和Session方式存儲id的差異
Session方式存儲用戶id的最大弊病在於Session是存儲在服務器端的,所以需要占用大量服務器內存,對於較大型應用而言可能還要保存許多的狀態。一般而言,大型應用還需要借助一些KV數據庫和一系列緩存機制來實現Session的存儲。
而JWT方式將用戶狀態分散到了客戶端中,可以明顯減輕服務端的內存壓力。除了用戶id之外,還可以存儲其他的和用戶相關的信息,例如該用戶是否是管理員、用戶所在的分組等。雖說JWT方式讓服務器有一些計算壓力(例如加密、編碼和解碼),但是這些壓力相比磁盤存儲而言可能就不算什么了。具體是否采用,需要在不同場景下用數據說話。
- 單點登錄
Session方式來存儲用戶id,一開始用戶的Session只會存儲在一台服務器上。對於有多個子域名的站點,每個子域名至少會對應一台不同的服務器,例如:www.taobao.com
,nv.taobao.com
,nz.taobao.com
,login.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、處理請求,返回響應結果