天天看點

Guns之安全機制之JWT

安全機制之JWT

一、JWT官方解釋:

JWT簡稱Json web token,是為了在網絡應用環境間傳遞聲明而執行的一種基于JSON的開放标準((RFC 7519)。該token被設計為緊湊且安全的,特别适用于分布式站點的單點登入(SSO)場景。JWT的聲明一般被用來在身份提供者和服務提供者間傳遞被認證的使用者身份資訊,以便于從資源伺服器擷取資源,也可以增加一些額外的其它業務邏輯所必須的聲明資訊,該token也可直接被用于認證,也可被加密。

Guns之安全機制之JWT

經典圖例

二、為什麼要用JWT?

當用戶端像服務端請求接口,擷取資料的時候,每次都需要進行身份的驗證,即基礎的使用者名和密碼是否正确。服務端每次從資料庫查詢賬号和密碼作比較,會降低運作速度,這個時候就産生了JWT。

JWT的優點:

(1)無需儲存在伺服器,節約伺服器記憶體開銷

(2)無狀态、可拓展性強。比如:由A、B組成伺服器,若Session存在A機器上,就隻能儲存在A機器上,此時不能再通路B,因為B上沒有存放該Session。使用Token就能夠同時驗證使用者的合法性。

  關于Token和Session驗證的差別:

     Token和Session都可以用作身份驗證。而Session我們一般叫做一個會話周期,Token我們叫做令牌。

      方案 A :我發給你一張身份證,但隻是一張寫着身份證号碼的紙片。你每次來辦事,我去背景查一下你的 id 是不是有效。 

      方案 B :我發給你一張加密的身份證,以後你隻要出示這張卡片,我就知道你一定是自己人。 (Token的無狀态通路)

三、JWT組成:

Token由頭部(header)、載荷(payload)和簽名(signature)組成,将這三段資訊文本用.連結一起就構成了Jwt字元串。像這樣

Guns之安全機制之JWT
Guns之安全機制之JWT

Header:

Header是一個簡單的聲明對象,包括Signature使用生成簽名的算法。比如:“alg”:“HS256”是通過HMAC-SHA256簽名的。

Payload:

載荷中存放了token的簽發者(iss)、所面向的使用者簽發時間(sub)、接收jwt的一方(aud)、過期時間(exp)以及一些我們需要寫進token中的資訊(可以自定義在Claim當中)。

Guns之安全機制之JWT

Signature:

由header+、payload拼接成字元串,再使用服務端生成的secret進行算法加密,生成我們需要的令牌,即token。

Guns之安全機制之JWT

四、在“XXXX”項目中JWT相關應用:

單裝置登入

關于這個,我想區分一個概念。就是單裝置登入(單機登入)和單點登入不是一個意思。

單裝置登入:是隻能在一個裝置上登入,若在其它裝置上登入則會被強制擠下線。比如,QQ被擠下線

單點登入(SSO):指通路同一伺服器不同應用中的受保護資源的同一使用者,隻需要登入一次,即通過一個應用中的安全驗證後,再通路其他應用中的受保護資源時,不再需要重新登入驗證。例如:下圖統一身份認證機制

Guns之安全機制之JWT

做這塊的功能的時候,開始被這種概念混淆。但是後來發現,其實單點登入以後也是可以有實際意義的。比如以後可以統一管理背景系統,對不同的角色統一管理。

功能實作思路:

首先,有裝置唯一辨別符,标志裝置的唯一性。(通過用戶端傳的UUID)

其次,對比存儲的UUID和每次用戶端傳的是否一緻,如果不一緻,則給予提示;否則,放行。

功能實作:為了加強唯一辨別符的唯一性,我們将UUID作為使用者資訊加密,存儲到Token中。

如果被其它裝置登入,傳回用戶端異常碼,

Guns之安全機制之JWT

并且短信通知。

Guns之安全機制之JWT

登入密碼時間過(T+X日)需重新登入

功能思路:首先,登入的時,傳回用戶端token和refreshToken,兩個同時存儲在用戶端記憶體。

其次,當使用者處于有效期登入狀态,當token失效時,通過refreshToken請求出新的token,然後繼續通路其它接口;直到長時間未登入使用,refreshToken失效為真正意義的失效,退出,并通知使用者。

功能實作:當用戶端傳入refreshToken想重新擷取token時,先解析refreshToken中的使用者資訊,然後重新組裝新的token繼續通路其它接口(此時的有效時間在此重新計算達到延長)。

Guns之安全機制之JWT

五、展望:

我們已經用JWT解決了單裝置登入、登入密碼時間過(T+X日)需重新登入。通過JWT還能實作黑名單功能,因為JWT是無狀态存儲。當使用者登出後,将登出的token放在redis中們每次就可以校驗黑名單。

你是技術宅麼?那就加入我們吧!點選下方連結 或 掃描二維碼 即可。

歡迎加入 CSDN技術交流群2:(點選即可加群)QQ群:456543087

               CSDN技術交流群(已滿員):(點選即可加群)QQ群:681223095。  

商務合作@群主,謝謝!

因經常有人留言,未能及時檢視到和回複,是以特建此群,以友善交流。友善問題讨論,有問題和沒有問題的小夥伴均可加入,用作自我學習和共同進步。本部落客不一定長期線上,但是qq群裡會有很多熱心的小夥伴,大家一起讨論解決問題。

Guns之安全機制之JWT

繼續閱讀