# JWT說明 ###### tags: `JWT` ## JWT是甚麼 JWT 是 JSON Web Token 的縮寫。它是一種開放的標準(RFC 7519),用於在網絡上以安全的方式在各方之間傳輸信息。JWT 是一個紧凑的、自包含的方式,用於在各方之間作為 JSON 物件傳輸信息。這些信息可以被驗證和信任,因為它是經過數字簽名的,所以可以被驗證和信任。 JWT 通常由三部分組成:頭部(Header)、有效載荷(Payload)和簽名(Signature)。頭部包含有關令牌的元信息,例如使用的加密算法。有效載荷包含實際的信息,例如用戶的身份識別信息。簽名則用於驗證令牌的真實性和完整性,確保令牌未被篡改。 JWT 常用於身份驗證和授權機制,例如在網站、應用程序或 API 中用於驗證用戶身份,並授予相應的權限。 ## JWT 由三部分組成:頭部(Header)、有效載荷(Payload)和簽名(Signature) 當使用 JWT 時,它通常由三部分組成,每個部分都是一個使用點(.)分隔的 base64 編碼字符串: 1. **頭部(Header)**: 頭部通常由兩部分組成,令牌的類型(即 JWT)和所使用的簽名算法(例如 HMAC SHA256 或 RSA)。例如,一個典型的頭部可能如下所示: ``` Json= { "alg": "HS256", "typ": "JWT" } ``` 2. **有效載荷(Payload)**: 有效載荷包含有關用戶或其他信息的數據。有效載荷可以包含稱為聲明(claims)的信息,聲明分為三種類型:保留聲明、公共聲明和私有聲明。例如,一個典型的有效載荷可能如下所示: ``` Json= { "sub": "1234567890", "name": "John Doe", "admin": true } ``` 3. **簽名(Signature)**: 簽名用於驗證令牌的真實性和完整性。簽名是由頭部和有效載荷以及一個密鑰(在對稱加密情況下)或一個公鑰(在非對稱加密情況下)計算而得。簽名確保令牌未被篡改並來自可信任的源。簽名的計算方式取決於在 JWT 的頭部中指定的算法。 ### URL : https://jwt.io/ ![image](https://hackmd.io/_uploads/Bkgkbby7A.png) ## JWT 和 Bearer Token 的關係 WT(JSON Web Token)是一種用於在網路應用程序之間安全地傳輸信息的開放標準(RFC 7519)。它通常用作身份驗證和授權機制。Bearer Token 是一種授權機制,它是 JWT 的一種應用形式。 具體來說,Bearer Token 是 JWT 的一種類型,它是一個包含在 HTTP 請求頭部或請求參數中的安全令牌。當用戶成功驗證並獲得訪問資源的權限時,服務器會將包含 JWT 的 Bearer Token 返回給客戶端。客戶端在後續請求中將這個 Bearer Token 放在請求頭部的 Authorization 欄位中,這樣服務器就可以驗證用戶的身份並授予相應的權限。 總結來說,JWT 是一種用於創建和傳輸安全令牌的標準格式,而 Bearer Token 是 JWT 在實際應用中的一種具體形式,用於實現身份驗證和授權。 ## 客戶端向後端出示 API Token 的方式有以下三種: 1. **放在 HTTP Header 中**: 這是最常見的方式,客戶端使用 GET 請求並將 API Token 放在 Header 中傳送給後端的資源服務器。 2. **放在 Request Body 中**: 有些情況下,客戶端會選擇使用 POST 請求方式,並將 API Token 放在 Request Body 中傳送。在本系列文中的新增和修改操作都採用了這種方式。 3. **放在 URI 中 (Query Parameter)**: 雖然這種方式可以用於傳送 API Token,但通常不建議使用,因為資訊會被暴露在 URI 中,增加了被有心人利用的風險。 ## Authenticate 的 API Error 錯誤訊息 | HTTP 狀態碼 | 錯誤訊息 | 說明 | |-------------|------------------|----------------------------------------| | 400 | 客戶端參數錯誤 | 提供的 API Token 或參數格式不正確。 | | 401 | 登入失敗 | API Token 驗證失敗,可能是未提供 Token 或 Token 無效。 | | 403 | 權限不足 | 使用者身份驗證成功,但權限不足以訪問資源。 |