Jwt
JSON Web 令牌的正確格式/符號是什麼?
JSON Web Token 應該具有以下格式:
token = encodeBase64(header) + '.' + encodeBase64(payload) + '.' + encodeBase64(signature)
當我使用 jsonwebtoken node.js 函式創建令牌時:
jsonwebtoken.sign({username : "admin", password : "admin"}, publicKey, { algorithm:'HS256' });
它產生以下輸出:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiJhZG1pbiIsImlhdCI6MTY2OTIxMDE0MH0.Cj2-vgNkw2xChXMe5YjIrH9UYH6-pL7ArSERBVJO-zE
解碼標頭時,您會得到:
'{"alg":"HS256","typ":"JWT"}'
但是解碼有效負載會產生填充錯誤,因為填充已被省略。僅當有效負載更改為(添加了正確數量的“=”)時:
eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiJhZG1pbiIsImlhdCI6MTY2OTIxMDE0MH0=
它是否正確解碼為:
'{"username":"admin","password":"admin","iat":1669210140}'
並且簽名無法解碼,因為它包含多個’-’,這是一個無效的base64字元。
我的問題是:
如果每個部分都是 base64 編碼的,那麼為什麼要從有效載荷中省略填充,簽名的奇怪語法是什麼?
我嘗試在jsonwebtoken GitHub 儲存庫上查找資訊,但找不到解釋。
編輯:經過更多研究後,我發現 JWT 使用 Base64URL 編碼,而不是 Base64 編碼。一旦我有更多資訊,將更新這篇文章。
JWT 不是以普通 Base64 編碼,而是以Base64url編碼。對於這個版本,填充是可選的,它使用不同的字元集:“-”而不是“+”和“_”而不是“/”。
資料來源:
https://jwt.io/introduction https://en.wikipedia.org/wiki/Base64#Variants_summary_table