和jwt 認證方案之初步認識JWT

2021-10-14 18:46:04 字數 3108 閱讀 8948

前言:

現在越來越多的專案或多或少會用到jwt,為什麼會出現使用jwt這樣的場景的呢?

傳統的方式(cookie+session)需要重新登入,使用者體驗不好。session共享(在多台物理機之間傳輸和複製session)方式對網路io的壓力大,延遲太長,使用者體驗也不好。

session方式儲存使用者資訊的最大問題在於要占用大量伺服器記憶體,增加伺服器的開銷。

而jwt方式將使用者狀態分散到了客戶端中,可以明顯減輕服務端的記憶體壓力。session的狀態是儲存在伺服器端,客戶端只有session id;而token的狀態是儲存在客戶端

原理:json web token(縮寫 jwt)

jwt 的原理是,伺服器認證以後,生成乙個 json 物件,發回給使用者,以後,使用者與服務端通訊的時候,都要發回這個 json 物件。

伺服器完全只靠這個物件認定使用者身份。為了防止使用者篡改資料,伺服器在生成這個物件的時候,會加上簽名。

伺服器就不儲存任何 session 資料了,也就是說,伺服器變成無狀態了,從而比較容易實現擴充套件。

組合:jwt 的三個部分依次是:header(頭部)、payload(負載)、signature(簽名)

寫成一行,就是下面的樣子。

一、header

header典型的由兩部分組成:token的型別(「jwt」)和演算法名稱(比如:hmac sha256或者rsa等等)

然後用base64對這個json編碼就得到jwt的第一部分

二、payload

jwt的第二部分是payload,它包含宣告(要求)。宣告是關於實體(通常是使用者)和其他資料的宣告

jwt 規定了7個官方字段

除了官方字段,你還可以在這個部分定義私有字段,下面就是乙個例子

注意,不要在jwt的payload或header中放置敏感資訊,除非它們是加密的
三、signature

signature 部分是對前兩部分的簽名,防止資料篡改。簽名是用於驗證訊息在傳遞過程中有沒有被更改,並且,對於使用私鑰簽名的token,它還可以驗證jwt的傳送方是否為它所稱的傳送方。

為了得到簽名部分,你必須有編碼過的header、編碼過的payload、乙個秘鑰,簽名演算法是header中指定的那個,然對它們簽名即可。按照下面的公式產生簽名。

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

算出簽名以後,把 header、payload、signature 三個部分拼成乙個字串,每個部分之間用"點"(.)分隔,就可以返回給使用者。

開始:一、客戶端收到伺服器返回的 jwt,可以儲存在 cookie 裡面,也可以儲存在 localstorage。

此後,客戶端每次與伺服器通訊,都要帶上這個 jwt。你可以把它放在 cookie 裡面自動傳送,但是這樣不能跨域,所以更好的做法是放在 http 請求的頭資訊authorization字段裡面。

authorization: bearer
二、jwt 就放在 post 請求的資料體裡面,那麼跨源資源共享(cors)將不會成為問題,因為它不使用cookie

1.應用(或者客戶端)想授權伺服器請求授權。例如,如果用授權碼流程的話,就是/oauth/authorize

2.當授權被許可以後,授權伺服器返回乙個access token給應用

3.應用使用access token訪問受保護的資源(比如:api)

特點:1.jwt 預設是不加密,但也是可以加密的。生成原始 token 以後,可以用金鑰再加密一次。

2.jwt 不加密的情況下,不能將秘密資料寫入 jwt。

3.jwt 的最大缺點是,由於伺服器不儲存 session 狀態,因此無法在使用過程中廢止某個 token,或者更改 token 的許可權。也就是說,一旦 jwt 簽發了,在到期之前就會始終有效,除非伺服器部署額外的邏輯。

4.jwt 本身包含了認證資訊,一旦洩露,任何人都可以獲得該令牌的所有許可權。為了減少盜用,jwt 的有效期應該設定得比較短。對於一些比較重要的許可權,使用時應該再次對使用者進行認證。

注意:jwt 是 json 格式的被加密了的字串

jwt 的核心是金鑰,就是 json 資料。這是你關心的,並希望安全傳遞出去的資料。jwt 如何做到這一點,並使你信任它,就是加密簽名。

被篡改之後

總結:

機器學習之初步認識

這段時間,我系統地學習了機器學習,由於涉及到很多的高數 最優化 凸集 線性代數和概率論等方面知識,確實是強大的數學在做支撐。學習計畫上繼續堅持 按部就班 按照月計畫 周計畫和天計畫進行,每天進行總結分析。主要有三點體會 1 公式中,一般都是矩陣表示變數形式,複雜的理論無外乎都涉及到矩陣論為基礎,改變...

數字認證初步認識

前段時間學習了數字認證方面的一些知識,對其有了乙個初步的了解,作為備忘,現作乙個小結。list 認證原理 list 有三個人,小張 小王 老劉,小張和小王都和老劉很熟,但小張與小王互不相識。如果小張寫一封信給小王,小王收到信後,就不能確定其內容的真假,但如果小張讓老劉在信上簽上老劉的名字,小王收到信...

介面測試之初步認識Postman

我們如果在命令列傳送post請求,會很麻煩,效率不高。同時也不方便介面的管理,所以一些優秀的介面測試工具應運而出,postman就是繞不開的話題之一。主要功能 postman主要幫我們幹了三件事 1.把相關集合放到乙個集合當中方便管理。2.對指定介面傳送請求。下面我們使用postman工具操作get...