# 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/)
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.