# JWT (JSON Web Token) * JWT 的組成 * header * 通常包含兩部分訊息 * 類型: 例如`JWT` * 簽名算法: 例如:`HS256` * payload * 用戶相關訊息 (通常是`JSON`格式字符串,可以通過`base 64`編碼取得) * 用戶角色 * 用戶權限 * 簽發時間 * Claims * registered claims * 是一些預定意義的`Claim` * iss(issuer) * exp(expiration time) * sub(subject) * public claims * 是由其他機構或組織定義的`claim` * private claims * 是由私人機構或組織定義的`claim` * signature * 透過`header + payload + secret`進行`hash` * JWT 類型 * access token * 訪問`API`數據的令牌,通常比較短期的過期時間 * refresh token * 用於更新`access token`的令牌,過期時間通常較長 * JWT 無狀態資安問題 * 是指`JWT token`不需要在服務端儲存任何資訊,因為所有訊息都在`token`中,但如果`token`被盜用或洩漏,會給系統帶來安全風險,因此,開發人員需要注意保護`token`並即時更新`token` * 防護機制 * 加密 * `JWT`可以使用加密演算法(如`HS256`)來加密其中的`payload` * 簽名 * `JWT`可以使用數字簽名算法,(如`RSA`) * 限制使用 * `JWT`可以在`payload`中限制條件,如在特定時間內有效,指定`IP`地址能使用等。 * 黑名單 * 伺服器可以維護一個黑名單,用於儲存已經被停用或盜用的`JWT` * JWK(JSON Web Key) * 為`JSON`格式的密鑰或公鑰,用來加密和解密`JWT`,`JWT`簽名需要使用一個密鑰,而`JWK`就是用來表示這個密鑰的 * `JWK`包含了密鑰的屬性 * 密鑰類型 * 使用的演算法 * 密鑰的值 * `JWK`中的公鑰用於驗證簽名,私鑰用於簽名,其中`JWK set`是一組`JWK`的集合,可用於儲存多個密鑰 * 參考連結 * [更好的選擇?用 JWT 取代 Session 的風險](https://blog.kenwsc.com/posts/2023/jwt-vs-session/) * [[OpenID] 使用 RS256 與 JWKS 驗證 JWT token 有效性](https://fullstackladder.dev/blog/2023/01/28/openid-validate-token-with-rs256-and-jwks/?fbclid=IwAR3b12B-gTdBZ4qyzEh_HTT2UA1GmEgCcNNxGJ-05nY972x0VVaFHHsiWMM) * [JWT vs session ID](https://github.com/Lidemy/forum/discussions/238) * [JWT 測試網站](https://jwt.io/)