什麼是 JWT?JSON Web Token 的完整說明
快速解答
JWT 是一個字串,由點分隔的三個 Base64URL 編碼部分組成:header.payload.signature。標頭指定演算法,有效負載包含聲明(使用者 ID、角色、過期時間),簽名證明真實性。 JWT 用於無狀態身份驗證。使用我們免費的 JWT 解碼器檢查瀏覽器中的令牌內容。
介紹
JWT (JSON Web Token) 是 RFC 7519 定義的一種緊湊的 URL 安全令牌格式,用於在各方之間作為 JSON 物件安全地傳輸訊息。 JWT 廣泛用於 Web 應用程式中的驗證和授權:使用者登入後,伺服器會發出 JWT ,用戶端將其包含在後續請求中以證明身分。 JWT 是無狀態的-伺服器不需要在資料庫中尋找令牌;令牌本身包含使用者的聲明和證明其未被篡改的簽章。
步步
-
理解三部分結構
JWT 有三個部分:標頭(演算法和類型)、有效負載(聲明)和簽章(證明完整性)。每個部分都經過 Base64URL 編碼並用點分隔:eyJhbGciOi...J9.eyJzdWIi...J9.signature。任何擁有令牌的人都可以讀取前兩部分;只有簽名需要密鑰。
-
了解標準聲明
有效負載包含聲明-有關主題的陳述。標準聲明:「sub」(主題/使用者 ID)、「iat」(在時間戳處發布)、「exp」(過期)、「nbf」(不早於)、「iss」(發布者)、「aud」(受眾)。自訂聲明可以包括角色、權限或任何其他資料。
-
了解簽名演算法
JWT 使用對稱(HS256 - 共享金鑰)或非對稱(RS256、ES256 - 公鑰/私鑰對)簽署。簽章可防止竄改:更改令牌的任何部分都會使簽章無效。只有秘密/私鑰的持有者才能創建有效的令牌。
-
使用 JWT 進行身份驗證
登入後,伺服器建立一個 JWT 並將其傳送給客戶端。用戶端在後續請求的授權標頭(承載令牌)中包含 JWT 。伺服器驗證簽名並檢查過期情況—無需查找資料庫。
範例
JWT 結構
輸入: 典型的 JWT
輸出: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyMSIsImV4cCI6MTY5MzYxMjgwMH0.signature
解碼標頭
輸入: 第一部分已解碼
輸出: {"alg": "HS256", "typ": "JWT"}
解碼後的有效負載
輸入: 第二部分解碼
輸出: {"sub": "user1", "name": "Alice", "iat": 1693526400, "exp": 1693612800}
常見問題
- 解碼與驗證-解碼 JWT (讀取其內容)並不能證明它是真實的。在信任聲明之前,請務必使用金鑰驗證簽章伺服器端。
- 將 JWT 儲存在 localStorage 中——這使得 JavaScript 可以存取它們,從而容易受到 XSS 攻擊。儲存在 httpOnly cookie 中以獲得更好的安全性。
- 長期令牌-如果令牌被盜,它在過期之前仍然有效。將短期存取令牌(15-60 分鐘)與刷新令牌一起用於長時間會話。
- 有效負載中的敏感資料-任何擁有令牌的人都可以讀取有效負載(它是 Base64,未加密)。切勿將密碼、信用卡或機密資訊放入有效負載中。
提示
- 在信任任何聲明之前,請務必驗證伺服器端的 JWT 簽章 - 單獨解碼並不是驗證。
- 在長時間會話中使用短期存取令牌(15-60 分鐘)和刷新令牌,以最大程度地減少令牌盜竊造成的損失。
- 將 JWT 儲存在 httpOnly、Secure、SameSite cookie 而不是 localStorage 中,以防止 XSS 攻擊。
- 使用我們的 JWT 解碼器檢查令牌內容以進行偵錯 - 您的令牌永遠不會離開您的瀏覽器。