首先介紹一下什么是JSON Web Token(JWT)?
官方文檔是這樣解釋的:JSON Web Token(JWT)是一個開放標準(RFC 7519),它定義了一種緊湊且獨立的方式,可以在各方之間作為JSON對象安全地傳輸信息。此信息可以通過數字簽名進行驗證和信任。JWT可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公鑰/私鑰對進行簽名。
雖然JWT可以加密以在各方之間提供保密,但只將專注于簽名令牌。簽名令牌可以驗證其中包含的聲明的完整性,而加密令牌則隱藏其他方的聲明。當使用公鑰/私鑰對簽署令牌時,簽名還證明只有持有私鑰的一方是簽署私鑰的一方。
通俗來講,JWT是一個含簽名并攜帶用戶相關信息的加密串,頁面請求校驗登錄接口時,請求頭中攜帶JWT串到后端服務,后端通過簽名加密串匹配校驗,保證信息未被篡改。校驗通過則認為是可靠的請求,將正常返回數據。
什么情況下使用JWT比較適合?
授權:這是最常見的使用場景,解決單點登錄問題。因為JWT使用起來輕便,開銷小,服務端不用記錄用戶狀態信息(無狀態),所以使用比較廣泛; 信息交換:JWT是在各個服務之間安全傳輸信息的好方法。因為JWT可以簽名,例如,使用公鑰/私鑰對兒 - 可以確定請求方是合法的。此外,由于使用標頭和有效負載計算簽名,還可以驗證內容是否未被篡改。JWT的結構體是什么樣的?
JWT由三部分組成,分別是頭信息、有效載荷、簽名,中間以(.)分隔,如下格式:
xxx.yyy.zzz
header(頭信息)
由兩部分組成,令牌類型(即:JWT)、散列算法(HMAC、RSASSA、RSASSA-PSS等),例如:
{ "alg": "HS256", "typ": "JWT"}然后,這個JSON被編碼為Base64Url,形成JWT的第一部分。
Payload(有效載荷)
JWT的第二部分是payload,其中包含claims。claims是關于實體(常用的是用戶信息)和其他數據的聲明,claims有三種類型: registered, public, and private claims。
Registered claims: 這些是一組預定義的claims,非強制性的,但是推薦使用, iss(發行人), exp(到期時間), sub(主題), aud(觀眾)等;
Public claims: 自定義claims,注意不要和JWT注冊表中屬性沖突,這里可以查看JWT注冊表
Private claims: 這些是自定義的claims,用于在同意使用這些claims的各方之間共享信息,它們既不是Registered claims,也不是Public claims。
以下是payload示例:
{ "sub": "1234567890", "name": "John Doe", "admin": true}然后,再經過Base64Url編碼,形成JWT的第二部分;
注意:對于簽名令牌,此信息雖然可以防止篡改,但任何人都可以讀取。除非加密,否則不要將敏感信息放入到Payload或Header元素中。
新聞熱點
疑難解答
圖片精選