# 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/

## 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 | 權限不足 | 使用者身份驗證成功,但權限不足以訪問資源。 |