JWT深入淺出

2021-09-26 07:58:04 字數 2799 閱讀 1963

什麼是jwt?

jwt(json web token),是一種工具,格式為***x.***x.***x的字串,jwt以一種安全的方式在使用者和伺服器之間傳遞存放在jwt中的不敏感資訊。

為什麼要用jwt

設想這樣乙個場景,在我們登入乙個**之後,再把網頁或者瀏覽器關閉,下一次開啟網頁的時候可能顯示的還是登入的狀態,不需要再次進行登入操作,通過jwt就可以實現這樣乙個使用者認證的功能。當然使用session可以實現這個功能,但是使用session的同時也會增加伺服器的儲存壓力,而jwt是將儲存的壓力分布到各個客戶端機器上,從而減輕伺服器的壓力。

jwt長得什麼樣

jwt由3個子字串組成,分別為header,payload以及signature,結合jwt的格式

即:header.payload.signature。

header是由以下這個格式的json通過base64編碼(編碼不是加密,是可以通過反編碼的方式獲取到這個原來的json,所以jwt中存放的一般是不敏感的資訊)生成的字串,header中存放的內容是說明編碼物件是乙個jwt以及使用「sha-256」的演算法進行加密(加密用於生成signature)

claim是payload的前身,並且claim是json格式的,為什麼這麼說,因為原本claim中存放的是jwt自身的標準屬性,所有的標準屬性都是可選的,可以自行新增,比如:jwt的簽發者、jwt的接收者、jwt的持續時間等;同時claim中也可以存放一些自定義的屬性,這個自定義的屬性就是在使用者認證中用於標明使用者身份的乙個屬性,比如使用者存放在資料庫中的id,為了安全起見,一般不會將使用者名稱及密碼這類敏感的資訊存放在claim中。將claim通過base64轉碼之後生成的一串字串稱作payload。

signature是由header和payload組合而成,將header和claim這兩個json分別使用base64方式進行編碼,生成字串header和payload,然後將header和payload以header.payload的格式組合在一起形成乙個字串(就是字串的拼接),然後使用上面定義好的加密演算法(hs256

)和乙個密匙(這個密匙存放在伺服器上,用於進行驗證)對這個字串進行加密(整體加密(header.payload+密匙)),形成乙個新的字串,這個字串就是signature(signature=整體加密(header.payload+密匙))最終組合為token:header.payload.signature。

signature=hmacsha256(base64urlencode(header) + "." + base64urlencode(payload),secret)

在計算出簽名雜湊後,jwt頭,有效載荷和簽名雜湊的三個部分組合成乙個字串,每個部分用"."分隔,就構成整個jwt物件。

那麼整個這個邏輯為:

jwt請求流程

對序號進行分別對介紹

使用者使用賬號和面發出post請求;

2. 伺服器使用私鑰建立乙個jwt;

3. 伺服器返回這個jwt給瀏覽器,存到瀏覽器到cookie

4. 瀏覽器將該jwt串在請求頭中像伺服器傳送請求;

5. 伺服器驗證該jwt;

6. 返回響應的資源給瀏覽器。

身份認證在這種場景下,一旦使用者完成了登陸,在接下來的每個請求中包含jwt,可以用來驗證使用者身份以及對路由,服務和資源的訪問許可權進行驗證。由於它的開銷非常小,可以輕鬆的在不同網域名稱的系統中傳遞,所有目前在單點登入(sso)中比較廣泛的使用了該技術。 資訊交換在通訊的雙方之間使用jwt對資料進行編碼是一種非常安全的方式,由於它的資訊是經過簽名的,可以確保傳送者傳送的資訊是沒有經過偽造的。

jwt優點

可以通過url,post引數或者在http header傳送,因為資料量小,傳輸速度也很快。

負載中包含了所有使用者所需要的資訊,避免了多次查詢資料庫

因為

token是以

json加密的形式儲存在客戶端的,所以

jwt是跨語言的,原則上任何web形式都支援。

不需要在服務端儲存會話資訊,特別適用於分布式微服務。

jwt實現認證的原理

伺服器在生成乙個jwt之後會將這個jwt會以authorization : bearer jwt 鍵值對的形式存放在cookies裡面傳送到客戶端機器,在客戶端再次訪問收到jwt保護的資源url鏈結的時候,伺服器會獲取到cookies中存放的jwt資訊,首先將header進行反編碼

獲取到加密的演算法,在通過存放在伺服器上的密匙對header.payload 這個字串進行加密,比對jwt中的signature和實際加密出來的結果是否一致,如果一致那麼說明該jwt是合法有效的,認證成功,否則認證失敗。

深入淺出sizeof

int佔 位元組,short佔 位元組 1.0 回答下列問題 答案在文章末尾 1.sizeof char 2.sizeof a 3.sizeof a 4.strlen a 如果你答對了全部四道題,那麼你可以不用細看下面關於sizeof的論述。如果你答錯了部分題目,那麼就跟著我來一起 關於sizeof...

深入淺出ShellExecute

ipconfig c log.txt應如何處理?二樓的朋友,開啟拔號網路這樣 shellexecute null,open c windows rundll32.exe shell32.dll,control rundll c windows system telephon.cpl null,sw ...

深入淺出ShellExecute

深入淺出shellexecute譯者 徐景周 原作 nishant s q 如何開啟乙個應用程式?shellexecute this m hwnd,open calc.exe sw show 或shellexecute this m hwnd,open notepad.exe c mylog.log...