# OAuth 2.0 - 透過JWT (RFC 7519) & Bearer (RFC 6750)實作Access token - https://swagger.io/docs/specification/authentication/bearer-authentication/ ## JWT介紹 - JWT 是 JSON 的開放標準 (RFC 7519) - 由三個部分組成,用逗點隔開組成一串字串 `Header`.`Payload`.`Signature` ### Header ```json { "alg": "HS256", // 加密的方法: HMAC、SHA256、RSA "typ": "JWT" // 聲明類型 } ``` ### Payload - **Registered claims** : 預先定義好的屬性,有功能性 - iss, sub, iat, exp ..... - **Public claims** : 已公開註冊在 IANA "JSON Web Token Claims" - **Private claims** : 自定義屬性 ```json { "iss":"xx server", //誰簽發的 "sub": "22933", //subject(建議是unique) "name": "Peter Chou", //自訂屬性 "iat": 1516239022, //簽發時間 "exp": 1518999999 //過期時間 } ``` ### Signature 由header, payload 產生 ```c HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), 'secret') ``` 最後三個部分用base64加密後用`.`連接,可以得到JWT ```json w! eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ4eCBzZXJ2ZXIiLCJzdWIiOiIyMjkzMyIsIm5hbWUiOiJQZXRlciBDaG91IiwiaWF0IjoxNTE2MjM5MDIyLCJleHAiOjE1MTg5OTk5OTl9.TiiQdUlt25djArBNrKnGtW26BI_akmEyqHQxPMhJZcc ``` ![](https://i.imgur.com/8eScn4W.png) ## 適用場景 ### JWT (無狀態) - 一次性驗證 (ex: email驗證信) - restful api的無狀態認證 JWT無狀態認證的方式更適合橫向擴展的server 對不同台server只需要驗證token內容是否正確 很適合seesion需要跨server 跨domain的情況 需要考量的點: 續簽、廢棄 ### 傳統的session+cookie (有狀態) - 持續性的狀態檢查 - 可控制的狀態 like 購物車 會員登入 ## Ref - https://mgleon08.github.io/blog/2018/07/16/jwt/ - https://pjchender.dev/internet/note-oauth2/ - https://ithelp.ithome.com.tw/articles/10197166 - https://oauth.net/2/bearer-tokens/