JSON Web Token(JWT)是一種開放標準(RFC 7519),用于在各方之間安全地傳輸信息作為JSON對象。JWT通常用于身份驗證和信息交換,特別是在Web應用程序中。JWT的結構設計得非常簡潔和緊湊,便于在網絡中傳輸。本文將詳細介紹JWT的結構及其組成部分。
JWT是一種自包含的令牌,包含了所有必要的信息,可以在客戶端和服務器之間傳遞。它由三部分組成:頭部(Header)、載荷(Payload)和簽名(Signature)。這三部分通過點號(.
)連接在一起,形成一個完整的JWT。
一個典型的JWT示例如下:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
這個JWT由三部分組成,分別是:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
接下來,我們將詳細討論每一部分的結構和內容。
JWT的頭部通常由兩部分組成:令牌的類型(typ
)和所使用的簽名算法(alg
)。頭部是一個JSON對象,經過Base64Url編碼后形成JWT的第一部分。
typ
字段用于指定令牌的類型。對于JWT,這個字段的值通常是JWT
。例如:
{
"typ": "JWT"
}
alg
字段用于指定用于生成簽名的算法。常見的算法包括:
HS256
:HMAC SHA-256RS256
:RSA SHA-256ES256
:ECDSA SHA-256例如,使用HMAC SHA-256算法的頭部如下:
{
"alg": "HS256",
"typ": "JWT"
}
頭部JSON對象經過Base64Url編碼后,形成JWT的第一部分。Base64Url編碼是一種URL安全的Base64編碼,它將+
和/
分別替換為-
和_
,并去掉末尾的=
。
例如,上述頭部經過Base64Url編碼后為:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
JWT的載荷部分包含了實際要傳遞的信息。載荷也是一個JSON對象,經過Base64Url編碼后形成JWT的第二部分。載荷中可以包含三種類型的聲明:注冊聲明、公共聲明和私有聲明。
注冊聲明是預定義的聲明,雖然不是強制性的,但建議使用。常見的注冊聲明包括:
iss
(Issuer):簽發者sub
(Subject):主題aud
(Audience):受眾exp
(Expiration Time):過期時間nbf
(Not Before):生效時間iat
(Issued At):簽發時間jti
(JWT ID):唯一標識符例如,一個包含注冊聲明的載荷如下:
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
公共聲明是可以由JWT的使用者自定義的聲明。為了避免沖突,公共聲明應該在IANA JSON Web Token Registry中注冊,或者使用防沖突的命名空間。
私有聲明是JWT的創建者和消費者之間約定的自定義聲明。這些聲明既不是注冊聲明,也不是公共聲明。
載荷JSON對象經過Base64Url編碼后,形成JWT的第二部分。例如,上述載荷經過Base64Url編碼后為:
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
簽名部分是JWT的最后一部分,用于驗證令牌的完整性和真實性。簽名是通過將頭部和載荷部分連接起來,并使用指定的算法和密鑰進行加密生成的。
簽名的生成過程如下:
.
)連接起來,形成一個字符串。例如,使用HMAC SHA-256算法和密鑰secret
,對上述頭部和載荷進行簽名:
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
生成的簽名經過Base64Url編碼后為:
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
在接收到JWT時,服務器可以通過重新計算簽名來驗證令牌的完整性和真實性。如果重新計算的簽名與JWT中的簽名部分一致,則說明令牌未被篡改。
將頭部、載荷和簽名三部分用點號(.
)連接起來,就形成了一個完整的JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
JWT是一種簡潔、自包含的令牌,由頭部、載荷和簽名三部分組成。頭部指定了令牌的類型和簽名算法,載荷包含了實際要傳遞的信息,簽名用于驗證令牌的完整性和真實性。通過Base64Url編碼和加密算法,JWT可以在網絡中安全地傳輸,并廣泛應用于身份驗證和信息交換場景。
理解JWT的結構和組成部分,有助于開發者更好地使用和實現JWT,確保應用程序的安全性和可靠性。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。