JWT 是一種緊湊且自包含的,用于在多方傳遞JSON 對象的技術。傳遞的資料可以使用數字簽名增加其安全行。可以使用HMAC 加密算法或RSA 公鑰/私鑰加密方式。
緊湊:資料小,可以通過URL,POST 參數,請求頭發送。且資料小代表傳輸速度快。
自包含:使用payload 資料塊記錄使用者必要且不隐私的資料,可以有效的減少資料庫通路次數,提高代碼性能。
JWT 一般用于處理使用者身份驗證或資料資訊交換。
使用者身份驗證:一旦使用者登入,每個後續請求都将包含JWT,允許使用者通路該令牌允許的路由,服務和資源。單點登入是當今廣泛使用JWT 的一項功能,因為它的開銷很小,并且能夠輕松地跨不同域使用。
資料資訊交換:JWT 是一種非常友善的多方傳遞資料的載體,因為其可以使用資料前面來保證資料的有效性和安全性。
一、JWT資料結構
JWT 的資料結構是: A.B.C。由字元點‘.’來分隔三部分資料。
A - header 頭資訊
B - payload (有效荷載?)
C - Signature 簽名
資料結構: {“alg”: “加密算法名稱”, “typ” : “JWT”}
alg 是加密算法定義内容,如:HMAC SHA256 或RSA
typ 是token 類型,這裡固定為JWT。
在payload 資料塊中一般用于記錄實體(通常為使用者資訊)或其他資料的。主要分為三個部分,分别是:已注冊資訊(registered claims),公開資料(public claims),私有資料(privateclaims)。
payload 中常用資訊有:iss(發行者),exp(到期時間),sub(主題),aud(閱聽人)等。前面列舉的都是已注冊資訊。
公開資料部分一般都會在JWT 系統資料庫中增加定義。避免和已注冊資訊沖突。
公開資料和私有資料可以由程式員任意定義。
注意:即使JWT 有簽名加密機制,但是payload 内容都是明文記錄,除非記錄的是加密資料,否則不排除洩露隐私資料的可能。不推薦在payload 中記錄任何敏感資料。
簽名資訊。這是一個由開發者提供的資訊。是伺服器驗證的傳遞的資料是否有效安全的标準。在生成JWT 最終資料的之前。先使用header 中定義的加密算法,将header 和payload進行加密,并使用點進行連接配接。如:加密後的head.加密後的payload。再使用相同的加密算法,對加密後的資料和簽名資訊進行加密。得到最終結果。
二、執行流程
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yYjVzNkZGO2gzMkRjZkFmYzMDNkNWNlVzNjdDZwUDZh9CX4AzLchDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL0M3Lc9CX6MHc0RHaiojIsJye.png)
三、基于JWT機制的單點登入
使用JWT 實作單點登入時,需要注意token 時效性。token 是儲存在用戶端的令牌資料,如果永久有效,則有被劫持的可能。token 在設計的時候,可以考慮一次性有效或一段時間内有效。如果設定有效時長,則需要考慮是否需要重新整理token 有效期問題。
使用JWT 技術生成的token,用戶端在儲存的時候可以考慮cookie 或localStorage。cookie儲存方式,可以實作跨域傳遞資料。localStorage 是域私有的本地存儲,無法實作跨域。
webstorage 可儲存的資料容量為5M。且隻能存儲字元串資料。
webstorage 分為localStorage 和sessionStorage。
localStorage 的生命周期是永久的,關閉頁面或浏覽器之後localStorage 中的資料也不會消失。localStorage 除非主動删除資料,否則資料永遠不會消失。
sessionStorage 是會話相關的本地存儲單元,生命周期是在僅在目前會話下有效。
sessionStorage 引入了一個“浏覽器視窗”的概念,sessionStorage 是在同源的視窗中始終存在的資料。隻要這個浏覽器視窗沒有關閉,即使重新整理頁面或者進入同源另一個頁面,資料依然存在。但是sessionStorage 在關閉了浏覽器視窗後就會被銷毀。同時獨立的打開同一個視窗,同一個頁面,sessionStorage 也是不一樣的。