什麼是JWT(JSON Web Token)

附上簽章來傳遞JSON格式資訊(宣告,claim)的格式。把「標頭.酬載.簽章」三個部分分別以Base64URL編碼,再以「.」串接。簽章可用來確認是否遭竄改以及發行者,但一般帶簽章的JWT,其酬載並未加密,因此不要放入機密資訊。用於API驗證的存取權杖、OpenID Connect的ID權杖等,通常把有效期限(exp)設得較短。

日文名稱: JWT(JSON Web Token)

「JWT(JSON Web Token)」出現在1領域的2道練習題中(Web技術基礎等)。

這個名詞所屬的領域: Web技術基礎

三個部分

標頭中放入簽章演算法(例如HS256)與類型,把 {"alg":"HS256","typ":"JWT"} 以Base64URL編碼會得到 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9。酬載中放入使用者識別碼(sub)、發行者(iss)、有效期限(exp)等宣告。簽章是對以「.」串接的已編碼標頭與酬載,以共用秘密金鑰的HMAC或公開金鑰密碼的私鑰產生。

伺服器的確認方式

收到JWT的伺服器以金鑰確認簽章是否正確,並檢查有效期限、對象(aud)等宣告是否符合條件。重要的是不要直接相信標頭中alg的值,只接受伺服器端決定的演算法。確認簽章後,伺服器即使沒有保存工作階段資訊,也能判斷這是發給誰的。

使用時的注意事項

JWT發行後很難撤銷,因此一般把有效期限設短,需要長期使用時,再以另外的更新用值重新發行。任何人都能讀取酬載,因此不要放入機密資訊。依瀏覽器中保存位置的不同,可能因XSS而遭竊取。

練習JWT(JSON Web Token)的題目

關於一般帶簽章的JWT(JSON Web Token),下列說明何者正確?

  1. A酬載以簽章金鑰加密,因此即使放入密碼或信用卡號碼傳送,途中也不會被讀取
  2. B即使是已過有效期限的權杖,只要簽章正確就代表沒有遭竄改,伺服器必須接受
  3. C把標頭、酬載、簽章以Base64URL編碼並以「.」串接而成,簽章可偵測竄改,但內容並未加密
查看答案與解析

正確答案:C. 把標頭、酬載、簽章以Base64URL編碼並以「.」串接而成,簽章可偵測竄改,但內容並未加密

JWT由「標頭.酬載.簽章」三個部分組成,標頭放入簽章演算法(例如HS256),酬載放入使用者識別碼、有效期限(exp)等資訊(宣告)。簽章是以秘密金鑰由標頭與酬載產生,因此收到的伺服器可以確認內容沒有遭竄改以及發行者。不過Base64URL並不是加密,任何人都能還原讀取,因此不要放入機密資訊。送往API時,一般放在Authorization: Bearer之後傳送。

常見問題

JWT與工作階段ID該用哪一個?

工作階段ID只是查找伺服器所保存資訊的線索,登出或失效可以立即在伺服器端反映。JWT不必在伺服器保存資訊就能確認內容,適合在多個服務之間傳遞,但有不易撤銷的弱點。單一網站的登入,多半是工作階段ID比較容易處理。

Base64URL與Base64有什麼不同?

Base64URL是Base64的變形,把在URL中具有特殊意義的「+」與「/」換成「-」與「_」,並常省略結尾的「=」。JWT為了能直接放進URL或HTTP標頭,使用這種形式。兩者都不是加密,任何人都能還原。

解析中的「JWT(JSON Web Token)」

出現「JWT(JSON Web Token)」的題目(2題)

  1. 關於一般帶簽章的JWT(JSON Web Token),下列說明何者正確?
  2. 關於OAuth 2.0與OpenID Connect的關係,下列說明何者正確?

相關名詞

OAuth 反向代理 文件物件模型(DOM) 同源政策 伺服器端算繪(SSR) 事件迴圈 跨來源資源共用(CORS) Cookie HTTP(超文字傳輸協定) HTTP方法

前往名詞解釋列表