---
# System prepended metadata

title: JWT
tags: [Other]

---

---
tags: Other
---
# JWT

一種**有限時間內可利用認證令牌要求對應的操作權限**的方法。

可遠觀而不可褻玩焉，可以看得到，但不可能亂改。

![](https://i.imgur.com/IqZ7E01.png)

 - JSON Web Token
 - 一般被用來在身份提供者和服務提供者間傳遞被認證的用戶身份訊息，以便於從資源伺服器獲取資源
 - Compact，小且快，可以經由 URL parameter、POST parameter 或者 header 傳輸
 - Self-contained，Payload 裡面就包含足夠的使用者資料，不需要再花費一次 request 去取得其他資料
 - 特別適用於一次性驗證（信件中的連結）、restful API 的無狀態認證、分佈式站點的 SSO 場景

   > SSO：Single sign-on，一種對於許多相互關連，但是又是各自獨立的軟體系統，提供存取控制的屬性。當使用者登入時，就可以取得所有系統的存取權限，不用對每個單一系統都逐一登入。

 - JSON 格式大部分語言都可使用，因此容易跨語言使用

## JSON Web Token

JWT 的組成內容有三個部分進行 base64 加密，再由 `.` 串起來

```
{Header}.{Payload}.{Signature}
```

 - Header

   ```
   {
     'typ': 'JWT',  # 聲明類型
     'alg': 'HS256'  # 加密的方法: HMAC、SHA256、RSA 進行 Base64 編碼
   }
   ```

 - Payload

   存放溝通訊息的地方

 - Signature

   header（base64）+ payload（base64）+ secret

## Usage

 - 發 request 的時候在 header 加入 `Authorization: Bearer <token>`

## Tips

 - Base64 是可逆的加密方式，不適合存放敏感訊息
 - 用來加密的 Secret 要保護好，存在 server 端
 - 使用 HTTPS 協議，避免敏感訊息被嗅探

## 參考資料

 - [淺談 JWT 的安全性與適用情境](https://medium.com/mr-efacani-teatime/%E6%B7%BA%E8%AB%87jwt%E7%9A%84%E5%AE%89%E5%85%A8%E6%80%A7%E8%88%87%E9%81%A9%E7%94%A8%E6%83%85%E5%A2%83-301b5491b60e)
 - [JWT](https://jwt.io/)
 - [JSON Web Token (JWT)](https://tools.ietf.org/html/rfc7519)
 - [以 JSON Web Token 替代傳統 Token](https://yami.io/jwt/)