iT邦幫忙

2024 iThome 鐵人賽

DAY 29
0

前言

介紹了關於驗證(Authentication)、授權(Authorization),以及 OAuth 的相關概念及流程,今天就來提一下大家一定都聽過的 JWT 是什麼吧!
/images/emoticon/emoticon08.gif

JWT 是什麼?

JWT,全名是 Json Web Token,從字面上的意思來看,就是符合 Json 格式的 token,是一種開放標準,用來進行驗證(Verify)跟授權(Authorization),在RFC 7519中被規範,可以使用密鑰以及演算法進行數位簽名,是可以被信任的。

JWT 由什麼組成?

主要由以下三個部分所組成,每個部分會由(.)做分隔:

  1. Header:由typ以及alg組成。typ指的就是 token 的類型,通常會是JWT,另外還有 JWS 以及 JWE,不過本篇主要講的是 JWT ,就先帶過。而alg代表的是這個 token 使用的簽名算法。
    例如:

    {
       "alg":"HS256",
       "typ":"JWT"
    }
    

    然後會透過Base64進行編碼:

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
    
  2. Payload:又被稱為 claims set,可以存放一些關於使用者的資訊以及其他資訊,分為以下部分

    • Registered Claim:一些已經被註冊的公認訊息。例如:iss(JWT 的發行人)、aud(JWT的收件人)、exp(過期時間,採用的是UNIX時間,也就是從1970年1月1日00時00分00秒起到現在的總秒數)等。
    • Public Claim:可以由使用 JWT 的用戶隨意定義。但為避免衝突,應在 IANA JSON Web 令牌註冊表中定義它們,或將其定義為包含抗衝突命名空間的 URI。
    • Private Claim:自定義的訊息,用於 token 的發送方以及接收方間共用資訊。
      例如以下內容,第三行是自定義的名稱,為了避免與其他相同名稱(is_root)的系統發生衝突,透過類似URI的方式命名:
    {
      "iss":"Lin",
      "exp":1728835200,
      "http://example.com/is_root": true
    }
    

    同樣會透過Base64進行編碼:

    eyJpc3MiOiJMaW4iLCJleHAiOjE3Mjg4MzUyMDAsImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ==
    
  3. Signature:由經過 Base64 轉換的 Header 、經過 Base64 轉換的 Header 以及伺服器自己保存的 secret 組成,再經由 Header 裡面所載的演算法進行。例如 HS256 會透過以下方式進行雜湊演算:

    HMACSHA256(
    base64UrlEncode(header) + "." +
    base64UrlEncode(payload),
    secret)
    

    HS256 分為兩個步驟:

    1. base64UrlEncode(header) + "." + base64UrlEncode(payload) 與 secret 一起產生 hash值。
    2. 步驟一的 hash 值與 secret 再進行一次 hash,結果如下:
    Ut2KC1Rq0oxvTQr0s9Mtr9TtZ_RBfx3-ZfcdtdbuRSo
    

    最後完整的 JWT 就會用以下方式呈現,想自己試試看的話可以去這個網站

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJMaW4iLCJleHAiOjE3Mjg4MzUyMDAsImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.Ut2KC1Rq0oxvTQr0s9Mtr9TtZ_RBfx3-ZfcdtdbuRSo

取得 JWT 流程(OAuth2.0 + OpenID Connect)

流程如下:

  1. 使用者在瀏覽器中輸入帳號、密碼,並向授權伺服器送出請求
  2. 授權伺服器進行使用者身份驗證
  3. 驗證通過後,授權伺服器將 token 回傳給瀏覽器,為 JWT 格式
  4. 在後續的請求,瀏覽器都會附上 JWT ,由資源伺服器/授權伺服器進行驗證(validate)確認是否為有效 token
  5. 伺服器回傳請求資料

JWT 常見用途

  • 授權(Authorization):透過 JWT 可以實現 SSO(單點登錄),也就是在允許使用者透過同一個 JWT 可以在多個應用程式和網站進行操作。

  • 數據交換:由於 JWT 可以進行數位簽名,因此可以確保寄件者的身份正確以及內容是否未被篡改。

小結

今天簡單介紹了 JWT 的一些概念,以及各個部分是透過編碼以及雜湊演算法進行轉換,不過由於 Header 以及Payload 只有透過 Base64 進行編碼而已,所以要記得不要把機密資訊放在裡面,不然一但 token 被攔截的話,裡面的資訊都會被看光唷!!!
/images/emoticon/emoticon04.gif

參考資料

RFC 7519
Introduction to JSON Web Tokens
What Is JWT and Why Should You Use JWT


上一篇
DAY28 OpenID Connect:基於 OAuth 2.0 的身份驗證協定
下一篇
DAY30 完賽!!
系列文
從零開始的後端學習之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言