JWT與許可權認證

2021-10-25 04:50:15 字數 2337 閱讀 9479

jwt全稱json web token。那麼jwt是什麼呢?根據官方的說法,jwt是一種開放標準(open standerd),這種標準是用來傳輸資料的,就像是http協議一樣。除此之外,jwt擁有緊湊自包含安全的特性。下面我們就來介紹一下jwt的基本結構,用途,以及它在許可權認證方面與傳統方式的區別。

組成上,jwt分為三部分:頭部(header),負載(payload),簽名(signature),其中頭部和負載部分都是json格式的字串,這兩部分主要用來傳輸資料。表現形式上,jwt就是乙個超長的經過base64編碼的字串。

正如上圖中所展示的jwt字串以.為分割符分割頭部、負載與簽名部分。其中頭部資訊主要用來闡述型別與加密演算法,負載部分用來承載我們要傳輸的資料,簽名部分用於校驗。

上文中我們提到,這些字串是經過base64編碼得到的,我們知道base64並不是一種加密演算法,它是一種編碼方式,所以jwt在傳輸中可以被任何接受方解碼獲取資訊。所以在傳輸資訊中,資訊基本上算是明文傳輸的,並且官方也聲稱不推薦在jwt頭部和負載部分傳遞敏感的資訊

既然是明文傳輸,那麼jwt資訊的安全性是如何保障的呢?這就要說到jwt的簽名部分了,jwt資訊的安全性是靠簽名部分來保障的。我們在生成jwt時,會將頭部和負載進過base64編碼之後的內容放在一起做乙個數字簽名,並將其寫入到jwt的簽名部分。

所以,如果有人擷取了請求並修改了jwt的任何一部分,都會使jwt在校驗時失敗。所以經過簽名的jwt可以理解為你可以任意地檢視其中的內容,但是你不可以修改其中的任何一項。唯一能對jwt做更改的一方為jwt的簽發方。通過這種方式就可以很好保障資料的安全性,防止被篡改。

jwt的用途主要有兩種,首先你可以利用jwt的安全特性來傳輸資料,使用jwt來傳輸資料可以防止資料在傳輸過程中被惡意篡改,從而達到安全傳輸的目的。其次,更常見的是你可以用jwt來做許可權的驗證。同時你也可以利用jwt的相關特性把它應用到一些其他的領域,這裡不做過多的闡述。

傳統http協議的web應用中,在一些有特殊身份要求的資源訪問中,我們需要明確請求的物件的身份資訊。但是http是一種無狀態的請求協議。對於服務端來說,每次的請求都會被一視同仁,無差別的對待。

但是無狀態的特性不能很好的服務於一些對訪問身份有限制的業務需求,所以我們需要給http請求增加狀態,最簡單的方式就是在請求中增加session的方式(cookie也類似)。

使用session/cookie的方式對http請求進行狀態標識的方法很適合一些小型的單體應用,但是一旦業務邏輯變得複雜,業務變得龐大時,我們不得不對服務進行分布式架構的拆分,那麼這種基於session/cookie的方式還適合於分布式的架構中嗎?其實有一點小問題,便是出現在cookie/seesion查詢過程中,我們的使用者資訊是儲存在記憶體中的,一旦服務拆分,不同的服務之間處於不同的程序中,程序之間又不能共享記憶體,所以會導致認證服務可以認證,其他服務無法獲取的情況。為了解決這種情況我們可以利用一些中介軟體來解決,比如redis,memcache來作共享session儲存。

我們在系統中引入乙個共享的記憶體服務,就可以解決分布式系統中的session/cookie共享問題,但是這樣的後果就是,所有需要驗證的服務都需要依賴於redis這樣的中介軟體,而在分布式系統中,出現乙個點的過度依賴是一種不好的表現,這表明被依賴的那部分將成為中心點,一旦中心點崩潰,所有依賴於中心點的服務都要歇菜。當然為了讓中心點更健壯,你可以選在主從複製這樣的備份設計。但是有沒有更好的解決方式呢?下面就要jwt出場了。

golang 使用jwt進行許可權認證

具體 見github 建立乙個工具包,對jwt相關操作進行封裝 然後新增乙個中介軟體,對使用者進行驗證 獲取真正的token字串 tokenstring tokenstring 7 token,claims,err utils.parsetoken tokenstring if err nil to...

JWT與RBAC許可權模型

json web token jwt 是為了網路應用環境間傳遞宣告而執行的一種基於json的開發標準 rfc7519 該token被設計為緊湊且安全的,特別適用於分布式站點的單點登入 sso 場景。jwt的宣告一般被用來在身份提供和服務提供者間傳遞被認證的使用者身份資訊,以便於從資源伺服器獲取資源,...

jwt 私鑰 使用JWT實現Token認證

json web token的結構是什麼樣的 json web token由三部分組成,它們之間用圓點 連線。這三部分分別是 header payload signature 因此,乙個典型的jwt看起來是這個樣子的 xx.yyyyy.zzzzz 接下來,具體看一下每一部分 header heade...