什麼是JWT?認識 JSON Web Token 認證機制

jwt

JSON Web Token (JWT) 是一種開放標準(RFC 7519),它定義了一種簡單穩定的方式來表示身份驗證和授權數據。這篇簡單介紹什麼是JWT和為什麼要使用JWT認證機制。

在測試後端 API 時,在註冊或登入成功後,我們會看到後端伺服器回傳一組稱為「token」的字串,現在讓我們簡單介紹一下什麼是 token,以及後端採用的 JWT 實作機制:

{
  authToken: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIyMjQ1NGViMi0yMjM5LTQwNTUtYjMxZS0wNzI5ZDI5OGY3MzQiLCJuYW1lIjoiYWRtaW4wMSIsImlhdCI6MTY2NzM2NjkzMCwiZXhwIjoxNjY3MzY4NzMwfQ.A3_VoWP8iu3nJ2DAilo2Oy2L4k6mZUmGXAQNcjd8K_A"
}

Token:身分憑證

先解釋一下「憑證」的概念。

在網路通訊的語境裡,token 的意思類似「憑證」。我們可以想像是進入遊樂園園區時,在售票口買票後得到的手環,之後在使用園區裡各種服務時,只需要出示手環就好:

在前後端溝通的情況中,token 就是前後端溝通用的憑證,前端若要和後端伺服器請求任何資料時,都必須要在發出去的請求中帶入這個 token 憑證,如果沒有攜帶憑證,或是通行證有誤的話,伺服器都不會將資料回應給我們。

在實務上有兩種比較主流的登入機制實作方式,分別為 cookie-based 和 token-based,主要差異是儲存登入資訊的方式。在 cookie-based 機制中,使用了瀏覽器內建的 cookie 功能來進行儲存,而前後分離的情境較常採用 token-based 機制,在此機制中,後端伺服器發出憑證 (token) 後,前端自行決定如何儲存 token。

JavaScript 全端開發課程,16 週進度班帶你半年轉職工程師

JSON Web Token

後端伺服器採用了一種叫 JSON Web Token (以下簡稱 JWT) 的實作機制,是歸類為 token-based 機制的其中一種實作。

在「憑證交換」的概念下,有著各種不同的實作機制。而目前後端 API 採用了 JSON Web Token (JWT) 這套實作機制,顧名思義,它使用 JSON 格式來製作 token。

在 JWT 機制中,驗證成功後發出的憑證包含以下三個部分:

  • Header – 標記 token 的類型與雜湊函式名稱。
  • Payload – 要攜帶的資料,例如 user_id 與時間戳記,也可以指定 token 的過期時間。
  • Signature – 根據 Header 和 Payload,加上密鑰 (secret) 進行雜湊,產生一組不可反解的亂數,當成簽章,用來驗證 JWT 是否經過篡改。

前兩者 Header 和 Payload 採用的 Base64URL 編碼機制是可以反解的,在 JWT 的官網裡有一組互動網頁 (link),下圖左是實際交換的 token 長相,而下圖右是解碼後的樣子:。

Passport-JWT

可以透過 Passport 的 JWT 策略 來實作登入,Passport 會幫我們驗證帳號密碼,並且讓我們可以用 middleware 的方式來呼叫身份驗證程序。

JWT 的主要作用是方便客戶端與伺服器之間的身份驗證。使用 JWT 可以在不需要每次登入的情況下,在客戶端與伺服器之間安全地傳遞封裝身份信息。它還可以用於許多其他用途,例如串接多個服務,並將數據在服務間安全地傳遞。

3分鐘小測驗,找到自己學習全端開發的入口