在軟體架構領域,特別是在處理多方和安全身份驗證/授權時,用於共享身分證明的強大機制至關重要。最安全且使用最廣泛的方法之一是 JSON Web Token (JWT) 🔏。
在本部落格中,我們將深入探討 JWT 是什麼、它們如何運作以及為什麼它們是安全資料傳輸的絕佳選擇。
JSON Web Token (JWT) 是一種開放式標準 (RFC 7519),它定義了一種緊湊且獨立的方式,以 JSON 物件的形式在各方之間安全地傳輸資訊。這些資訊可以被驗證和信任,因為它是經過數位簽署的。 JWT 可以使用秘密(使用 HMAC 演算法)或使用 RSA 或 ECDSA 的公鑰/私鑰對進行簽署。
JWT 是無狀態的,這意味著伺服器不需要在會話中儲存令牌資訊。這種無狀態特性使得 JWT 可擴展並適合客戶端-伺服器應用程式和分散式系統。以下是 JWT 受到青睞的一些關鍵原因:
安全性:JWT經過數位簽名,確保資料不會被竄改。
可擴展性:JWT 是無狀態的,不需要伺服器端存儲,這使得它們非常適合分散式系統。
緊湊:JWT 很緊湊,可以透過 URL、POST 參數或 HTTP 標頭輕鬆發送。
自包含:JWT 的有效負載包含目標使用者所需的所有訊息,無需多次查詢資料庫。
JWT 由三個部分組成:標頭、有效負載和簽名。這些部分由點 (.) 分隔
Header.Payload.Signature
讓我們分解每個元件:
標頭通常由兩部分組成:令牌類型(JWT)和所使用的簽章演算法(例如 HMAC、SHA256 或 RSA)。
例子:
{
"alg": "HS256",
"typ": "JWT"
}
然後,對該 JSON 物件進行 Base64Url 編碼以形成 JWT 的第一部分。
有效負載包含聲明。聲明是關於實體(通常是使用者)和附加資料的聲明。索賠分為三種類型:註冊索賠、公共索賠和私人索賠。
註冊聲明:這些是一組預先定義的聲明,不是強制性的,而是建議的,例如iss
(發行者)、 exp
(到期時間)、 sub
(主題)、 aud
(受眾)等。
公共聲明:可以隨意定義,但應該是抗衝突的或命名空間的。
私人聲明:這些是自訂聲明,用於在同意使用它們的各方之間共享資訊。
例子:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
此 JSON 物件也經過 Base64Url 編碼以形成 JWT 的第二部分。
若要建立簽章部分,您必須採用編碼標頭、編碼有效負載、秘密以及標頭中指定的演算法。簽名用於驗證 JWT 的發送者是否是其所說的發送者,並確保訊息在此過程中沒有被更改。
例如,如果要使用 HMAC SHA256 演算法,則簽名將如下建立:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
然後簽名經過 Base64Url 編碼並形成 JWT 的第三部分。
當客戶端想要存取受保護的資源時,它會在 HTTP 請求的 Authorization 標頭中包含 JWT,類似於 Bearer Token。伺服器執行一組步驟來驗證 JWT。如果所有驗證步驟都通過,伺服器將認為 JWT 有效並授予對所請求資源的存取權。
步驟如下:
1️⃣解碼 JWT :伺服器解碼 JWT 以提取標頭和有效負載。
2️⃣驗證簽章:伺服器透過將簽章演算法重新套用於標頭、有效負載和金鑰來驗證簽章。如果重新計算的簽章與JWT中的簽章匹配,則表示令牌沒有被竄改。
3️⃣檢查過期時間:伺服器檢查有效負載中的過期時間,以確保令牌沒有過期。
4️⃣附加檢查:根據應用程式的要求,伺服器可能會執行附加檢查,例如驗證令牌頒發者或根據已撤銷令牌清單檢查令牌。
讓我們探討一下 2024 年 JWT 的一些實際應用:
想像一下,登入您公司的生態系統一次即可無縫存取多種服務。 JWT 讓這個夢想成為現實,跨不同網域安全地傳遞您的身份驗證狀態。
在微服務領域,JWT 充當完美的信使。它們在服務之間攜帶身份驗證和授權訊息,確保安全且有效率的通訊。
當您的智慧冰箱與智慧烤麵包機對話時(是的,我們將在 2024 年實現),JWT 確保只有授權設備才能交換資料。
隨著無伺服器架構的興起,JWT 提供了一種無狀態方式來授權函數呼叫,而無需持久會話。
保護您的簽名密鑰,就像它們是 One Ring 一樣。使用金鑰管理服務並定期輪替金鑰。
保持較小的有效負載。 JWT 不能替代資料庫!
短期令牌(想想幾分鐘,而不是幾天)可以最大限度地降低令牌被洩露的風險。
在需要時使用令牌黑名單或 Redis 快取使令牌失效。
始終透過加密連線傳輸 JWT。沒有例外!
JWT 的用途非常廣泛,可用於各種場景。例如,它們通常用於授權後端 API,同時維護相同的權限集。許多現代應用程式(包括 Appwrite)都支援基於 JWT 的身份驗證,以確保安全且有效率的授權流程。
JSON Web 令牌 (JWT) 是現代 Web 應用程式中安全資訊共享的強大工具。它們提供了一種緊湊、獨立且安全的資料傳輸方式,使其成為從無狀態驗證到安全 API 等各種用例的絕佳選擇。透過理解和實施 JWT,開發人員可以增強其應用程式的安全性和可擴展性。
原文出處:https://dev.to/vyan/understanding-json-web-tokens-jwt-for-secure-information-sharing-5c3a