正確地使用JWT

注:本文系譯文, 用于學習交流目的,若有侵權(quán),請通知我刪除。
為便于理解,本文意譯,撿重點翻譯。

原文地址

JSON Web Token(JWT) 是一項正變得原來越流行的非常有用的標準,因為它發(fā)送帶有數(shù)字簽名的可以驗證以及信任的信息。JWT 規(guī)范設(shè)計了更多的高級特性來應(yīng)對中間人攻擊以及重放攻擊。

JWTs 為何如此重要?

JWTs 可以處理從客戶端發(fā)送信息到服務(wù)器的一些問題。JWT 允許服務(wù)器驗證 JWT 中包含的信息而不用必須在服務(wù)器保存狀態(tài)。一個明顯的趨勢: 我們看到越來越多的 SaaS 產(chǎn)品將 JWT 整合為一項功能 或者 直接在產(chǎn)品中使用 JWT。Stormpath 總是跟隨 JWT 的安全最佳實踐, 所以我們想分享這些正確使用 JWT 的最佳實踐。

什么是 JWT?

在開始之前, 讓我們快速的看下 JWT 都包含了什么, 然后我們就可以清晰地明白為什么這些最佳實踐很重要。JWT 最簡單的形式——包含3個傳輸過程中經(jīng)過URL編碼的部分 。

  • Header header 中包含了令牌的元數(shù)據(jù),簽名類型 和 加密算法(可選)
  • Claims claim 中包含了 任何你想簽名的信息
  • JSON Web Signature (JWS) 使用header中指定的算法數(shù)字簽名過 的 header 和 claims 。

Header 和 Claims 是在傳輸過程中經(jīng)過 base64 編碼的 JSON。 Header、 Claim 和 簽名 通過點號 . 附加到一起。
舉個例子, 如果 header 和 claims 是:

//header
{
    "alg": "HS256", //denotes the algorithm (shorthand alg) used for the  signature is HMAC SHA-256
    "typ": "JWT" //denotes the type (shorthand typ) of token this is
}
 
//claims
{
    "sub": "tom@stormpath.com",
    "name": "Tom Abbott",
    "role": "user"
}

JWT 可以用下面的偽代碼表示:

var headers = base64URLencode(myHeaders);
var claims = base64URLencode(myClaims);
var payload = header + "." + claims;
 
var signature = base64URLencode(HMACSHA256(payload, secret));
 
var encodedJWT = payload + "." + signature;

這就是 “果殼” 中的 JWT。JSON Web Tokens 中最重要的事情就是 他們是被簽名的。這確保了 JWT 在你的服務(wù)之間傳輸時不被篡改。這被稱為 驗證簽名。對于加密, JWT 有更多高級特性,如果你需要加密 claim 中的信息,這是可行的, 如果使用 JSON Web Encryption 。

如何保護 JWT?

有很多的庫可以幫助你創(chuàng)建、驗證 JWT, 但是當使用 JWT 時可以做很多事情來限制安全風險。

  • 在信任 JWT 中的任何信息之前,先驗證簽名。這是可選的,但是我們最近在許多其他公司的 JWT 框架中看到了這項安全漏洞。我們最近看到的一項是和 JWT規(guī)范有關(guān)的,JWT 規(guī)范允許你將簽名算法設(shè)置成 none 。 當你期望 JWT 是被簽名過的時候, 你應(yīng)當忽略它。換句話說,如果你把簽名秘鑰傳給驗證簽名的方法并且簽名算法被設(shè)置成 none, 驗證應(yīng)該是失敗的。
  • 保護用于計算以及驗證簽名的簽名秘鑰。簽名秘鑰應(yīng)該只能被發(fā)布人和消費者訪問, 兩者之外的任何人都不應(yīng)該訪問到。
  • JWT 中不要存儲任何敏感數(shù)據(jù)。這些令牌通常都被簽名過以保護數(shù)據(jù)不被篡改(沒有加密), 所以 claim 中的數(shù)據(jù)非常容易被解碼閱讀。舉個例子:你可能不想在 JWT 中保存用戶的地址, 你可能想在 JWT 中保存用戶記錄的鏈接或者其他難懂的標識符, 然后讓你的應(yīng)用查詢信息。如果你確實要在JWT 中保存敏感信息,看看 JSON Web Encryption (JWE)
  • 如果你擔心重放攻擊, 可以在claim中 添加 現(xiàn)時標志(jti claim)、過期時間(exp claim)以及創(chuàng)建時間(iat claim)。這些在 JWT 規(guī)范中 都很好的定義了。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容