JWT 身份驗證和會話身份驗證是對 Web 應用程式使用者進行身份驗證的方法。
在本文中,我們將解釋 JWT 的詳細資訊、其結構及其優缺點。
JWT 代表JSON Web Token ,它是一種常用的無狀態用戶身份驗證標準,用於以 JSON 格式在用戶端和伺服器之間安全地傳輸資訊。
預設情況下,JWT 已編碼但未加密。
它使用只有伺服器知道的密鑰進行數位簽署。
它可以加密,但在本文中,我們將重點放在簽署的非加密令牌。
JSON Web 令牌由以句點分隔的 3 個部分組成。
標頭、有效負載和簽名。
每個部分均採用 Base64 編碼。
標頭由令牌類型(JWT)和使用的簽章演算法(例如 HMAC SHA256 或 RSA)組成。
{
"typ": "JWT",
"alg": "HS256"
}
有效負載由聲明組成。
聲明是關於用戶的聲明和附加資料。
例如,我們有令牌的發行時間。
我們也有它的過期時間,因為令牌應該過期。
{
"iss": "example_issuer",
"sub": "user_id123",
"exp": 1644768000,
"iat": 1644744000
}
簽名是 JWT 最重要的部分。
它是使用標頭、有效負載和秘密進行計算的,這些資訊將饋送到簽名演算法中使用。
signature = HMAC-SHA256(base64urlEncode(header) + "." + base64urlEncode(payload), secret_salt )
典型的 JWT 授權流程涉及的步驟如下:
1- 身份驗證:使用者使用使用者名稱和密碼登錄,或使用 Google 或 Facebook 等。
伺服器驗證提供的憑證。
2- 令牌產生並將令牌發送到客戶端:伺服器將產生 JWT 並將其發送到客戶端,客戶端儲存它以供將來使用。
3-將令牌傳送到伺服器:當客戶端想要存取伺服器上受保護的資源時,它會在 HTTP 請求的 Authorization 標頭中傳送 JWT。
axios.get(URL, {
headers: {
'Authorization': 'Bearer ' + token,
},
})
4-驗證令牌:伺服器接收請求並透過使用用於簽署的金鑰檢查其簽章來驗證 JWT。
如果 JWT 有效,伺服器會提取其中包含的資訊並使用它來確定使用者有權執行哪些操作。
5-授權請求:如果使用者被授權存取資源,伺服器將傳回請求的資料。如果用戶未獲得授權,伺服器將傳回錯誤訊息。
輕的
便攜式:可在多個平台、網路和行動平台上處理。
JSON 解析器在大多數程式語言中都很常見。
由於密鑰儲存在伺服器端,因此可以防止篡改。
由於 JWT 令牌的無狀態性質,伺服器不需要儲存任何會話資訊。
即使 JWT 從客戶端刪除後仍然有效。
使用的方法是令牌黑名單,它涉及在伺服器端維護無效令牌的列表,以防止它們重新用於身份驗證。
對於簽署的非加密令牌,我們不應該儲存敏感訊息,因為 JWT 可以防止篡改,但任何人都可以解碼和讀取。
如果被攔截,可以提供完全存取權。這就是為什麼客戶端的 JWT 應該儲存在安全的地方,例如在瀏覽器中的 HttpOnly cookie 中。
原文出處:https://dev.to/jaypmedia/jwt-explained-in-4-minutes-with-visuals-g3n