全棧專案 小書架 伺服器開發 JWT 詳解

2021-09-29 17:17:48 字數 2889 閱讀 1188

官方簡介:introduction to json web tokens

jwt全稱是json web token(jwt)是乙個開放標準(rfc 7519),它定義了一種緊湊且自包含的方式,用於在各方之間作為json物件安全地傳輸資訊。由於此資訊是經過數字簽名的,因此可以被驗證和信任。

可以使用金鑰(hmac演算法)或使用rsaecdsa的公用/專用金鑰對對jwt進行簽名。

由三部分組成,這些部分由點.分隔,分別是:

因此,jwt通常如下所示。

***xx.yyyyy.zzzzz
header

通常由兩部分組成:

例如:

然後,將此json通過base64url編碼以形成jwt的第一部分。

payload

令牌的第二部分是有效負載,其中包含宣告。宣告是有關實體(通常是使用者)和其他資料的宣告。共有三種型別的索賠:registered、public、private claims

有效負載示例:

同樣需要base64url編碼,以形成jwt的第二部分。

signature

簽名(signature)用於驗證訊息在整個過程中沒有更改,並且對於使用私鑰進行簽名的令牌,它還可以驗證jwt的傳送者是它所說的真實身份。

例如,如果要使用hmac sha256演算法,則將通過以下方式建立簽名:

hmacsha256(

base64urlencode(header) + "." +

base64urlencode(payload),

secret)

將這三部分合併

輸出是三個由.分隔的base64-url字串,可以在htmlhttp環境中輕鬆傳遞這些字串,與基於xml的標準(例如saml)相比,它更緊湊。

下圖顯示了乙個jwt,它已對先前的headerpayload進行了編碼,並用乙個signature

可以在這個網頁jwt.io debugger驗證和生成jwt

在身份驗證中,當使用者使用其憑據成功登入時,將返回令牌。由於令牌是憑據,因此必須格外小心以防止安全問題。通常,令牌的有效時間不宜設定過長。

tip: 由於缺乏安全性,您也不應該將敏感的會話資料儲存在瀏覽器儲存中。

每當使用者想要訪問受保護的路由或資源時,使用者**通常應在bearer模式中使用授權頭髮送jwtheader的內容應如下所示:

authorization: bearer
在某些情況下,介面訪問並不需要身份授權。伺服器的受保護路由將在authorization header中檢查jwt令牌是否有效,如果存在且有效,則將允許使用者訪問受保護的資源。

如果jwt包含必要的資料,則可以減少查詢資料庫中某些操作的需求。

如果令牌是在authorization header中傳送的,則跨域資源共享(cors)不會成為問題,因為它不使用cookie

下圖顯示了如何獲取jwt並將其用於訪問api或資源

應用程式或客戶端向授權伺服器請求授權。生產jwt令牌

授予授權後,授權伺服器會將訪問令牌返回給應用程式。

應用程式使用訪問令牌來訪問受保護的資源(例如api)。

伺服器檢查jwt令牌是否有效,返回對應結果給客戶端

下圖詳細的流程:

ps:請注意,使用簽名令牌,令牌或令牌中包含的所有資訊都會暴露給使用者或其他方,即使他們無法更改它。這意味著您不應將機密資訊放入令牌中。

對比****** web tokens (swt)security assertion markup language tokens (saml),看看使用json web tokens (jwt)有什麼好處。

頁面。

通向全棧之路 (2)伺服器安全設定

注 伺服器版本ubunto14.04 一 修改預設ssh連線埠 1.進入ssh配置檔案 sudo vi etc ssh sshd config 2.修改埠號,同時在最下方允許當前使用者ssh登入 port 22888 allowusers codeww root 3.重啟服務 sudo servic...

配置NGINX伺服器 全

安裝之前準備 1 依賴 gcc openssl devel pcre devel zlib devel 安裝 yum install gcc openssl devel pcre devel zlib devel y 安裝nginx configure make make install 預設安裝目...

ftp伺服器專案

位址 1.簡介 2.具體實現 2.1 服務端 主要負責處理客戶端發來的指令,對於複雜指令即比較耗時的指令 get,put 用子執行緒進行處理,其餘指令用主線程處理 2.1.1 執行緒池 主要分為執行緒池的建立和啟動 定義單個任務 typedef struct node node t,pnode t ...