天天看點

JSON Web Token(JWT)

  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。再使用相同的加密算法,對加密後的資料和簽名資訊進行加密。得到最終結果。

二、執行流程

JSON Web Token(JWT)

三、基于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 也是不一樣的。

繼續閱讀