'JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)'

"

越來越多的開發者開始學習JWT技術並在實際項目中運用JWT來保護應用安全。一時間,JWT技術風光無限,很多公司的應用程序也開始使用JWT(Json Web Token)來管理用戶會話信息。本文將從JWT的基本原理出發,分析在使用JWT構建基於Token的身份驗證系統時需要謹慎對待的細節。

​ 任何技術框架都有自身的侷限性,不可能一勞永逸,JWT也不例外。接下來,將從JWT的概念,基本原理和適用範圍來剖析為什麼說JWT不是銀彈,需要謹慎處理。

​ 眾所周知,如果我們的賬戶信息(用戶名和密碼)洩露,存儲在服務器上的隱私數據將受到毀滅性的打擊,如果是管理員的賬戶信息洩露,系統還有被攻擊的危險。那麼,JWT的信息發生洩露,會帶來什麼樣的影響?該如何防範?這將是本文重點闡述的內容。

1、什麼是Token?

"

越來越多的開發者開始學習JWT技術並在實際項目中運用JWT來保護應用安全。一時間,JWT技術風光無限,很多公司的應用程序也開始使用JWT(Json Web Token)來管理用戶會話信息。本文將從JWT的基本原理出發,分析在使用JWT構建基於Token的身份驗證系統時需要謹慎對待的細節。

​ 任何技術框架都有自身的侷限性,不可能一勞永逸,JWT也不例外。接下來,將從JWT的概念,基本原理和適用範圍來剖析為什麼說JWT不是銀彈,需要謹慎處理。

​ 眾所周知,如果我們的賬戶信息(用戶名和密碼)洩露,存儲在服務器上的隱私數據將受到毀滅性的打擊,如果是管理員的賬戶信息洩露,系統還有被攻擊的危險。那麼,JWT的信息發生洩露,會帶來什麼樣的影響?該如何防範?這將是本文重點闡述的內容。

1、什麼是Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ Token(令牌)通常是指Security Token(安全令牌),可以分為Hardware Token(硬件令牌),Authentication Token(授權令牌),USB Token(USB令牌),Cryptographic Token(加密令牌),Virtual Token(虛擬令牌)和Key Fob(鑰匙卡)。其主要作用是驗證身份的合法性,以允許計算機系統的用戶可以操作系統資源。生活中常見的令牌如:登錄密碼,指紋,聲紋,門禁卡,銀行電子卡等。Token的主要目的是為計算機系統提供一個可以識別用戶的任意數值,例如“token123”這樣的明文字符串,或者像“41ea873f-3a4d-57c8-1e38-ef74f31015af”之類的加密字符。

​ 由於篇幅關係,Token就瞭解到這裡。接下來將聊聊有關JWT(JSON Web Token)的原理。

2、什麼是JSON Web Token?

"

越來越多的開發者開始學習JWT技術並在實際項目中運用JWT來保護應用安全。一時間,JWT技術風光無限,很多公司的應用程序也開始使用JWT(Json Web Token)來管理用戶會話信息。本文將從JWT的基本原理出發,分析在使用JWT構建基於Token的身份驗證系統時需要謹慎對待的細節。

​ 任何技術框架都有自身的侷限性,不可能一勞永逸,JWT也不例外。接下來,將從JWT的概念,基本原理和適用範圍來剖析為什麼說JWT不是銀彈,需要謹慎處理。

​ 眾所周知,如果我們的賬戶信息(用戶名和密碼)洩露,存儲在服務器上的隱私數據將受到毀滅性的打擊,如果是管理員的賬戶信息洩露,系統還有被攻擊的危險。那麼,JWT的信息發生洩露,會帶來什麼樣的影響?該如何防範?這將是本文重點闡述的內容。

1、什麼是Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ Token(令牌)通常是指Security Token(安全令牌),可以分為Hardware Token(硬件令牌),Authentication Token(授權令牌),USB Token(USB令牌),Cryptographic Token(加密令牌),Virtual Token(虛擬令牌)和Key Fob(鑰匙卡)。其主要作用是驗證身份的合法性,以允許計算機系統的用戶可以操作系統資源。生活中常見的令牌如:登錄密碼,指紋,聲紋,門禁卡,銀行電子卡等。Token的主要目的是為計算機系統提供一個可以識別用戶的任意數值,例如“token123”這樣的明文字符串,或者像“41ea873f-3a4d-57c8-1e38-ef74f31015af”之類的加密字符。

​ 由於篇幅關係,Token就瞭解到這裡。接下來將聊聊有關JWT(JSON Web Token)的原理。

2、什麼是JSON Web Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ JSON Web Token(JWT)是一個基於RFC 7519的開放數據標準,它定義了一種寬鬆且緊湊的數據組合方式,使用JSON對象在各應用之間傳輸加密信息。該JSON對象可以通過數字簽名進行鑑籤和校驗,一般地,JWT可以採用HMAC算法,RSA或者ECDSA的公鑰/私鑰對數據進行簽名操作。

​ 一個JWT通常有HEADER(頭),PAYLOAD(有效載荷)和SIGNATURE(簽名)三個部分組成,三者之間使用“.”鏈接,格式如下:

"

越來越多的開發者開始學習JWT技術並在實際項目中運用JWT來保護應用安全。一時間,JWT技術風光無限,很多公司的應用程序也開始使用JWT(Json Web Token)來管理用戶會話信息。本文將從JWT的基本原理出發,分析在使用JWT構建基於Token的身份驗證系統時需要謹慎對待的細節。

​ 任何技術框架都有自身的侷限性,不可能一勞永逸,JWT也不例外。接下來,將從JWT的概念,基本原理和適用範圍來剖析為什麼說JWT不是銀彈,需要謹慎處理。

​ 眾所周知,如果我們的賬戶信息(用戶名和密碼)洩露,存儲在服務器上的隱私數據將受到毀滅性的打擊,如果是管理員的賬戶信息洩露,系統還有被攻擊的危險。那麼,JWT的信息發生洩露,會帶來什麼樣的影響?該如何防範?這將是本文重點闡述的內容。

1、什麼是Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ Token(令牌)通常是指Security Token(安全令牌),可以分為Hardware Token(硬件令牌),Authentication Token(授權令牌),USB Token(USB令牌),Cryptographic Token(加密令牌),Virtual Token(虛擬令牌)和Key Fob(鑰匙卡)。其主要作用是驗證身份的合法性,以允許計算機系統的用戶可以操作系統資源。生活中常見的令牌如:登錄密碼,指紋,聲紋,門禁卡,銀行電子卡等。Token的主要目的是為計算機系統提供一個可以識別用戶的任意數值,例如“token123”這樣的明文字符串,或者像“41ea873f-3a4d-57c8-1e38-ef74f31015af”之類的加密字符。

​ 由於篇幅關係,Token就瞭解到這裡。接下來將聊聊有關JWT(JSON Web Token)的原理。

2、什麼是JSON Web Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ JSON Web Token(JWT)是一個基於RFC 7519的開放數據標準,它定義了一種寬鬆且緊湊的數據組合方式,使用JSON對象在各應用之間傳輸加密信息。該JSON對象可以通過數字簽名進行鑑籤和校驗,一般地,JWT可以採用HMAC算法,RSA或者ECDSA的公鑰/私鑰對數據進行簽名操作。

​ 一個JWT通常有HEADER(頭),PAYLOAD(有效載荷)和SIGNATURE(簽名)三個部分組成,三者之間使用“.”鏈接,格式如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

下面是的字符串是一個JWT的實際案例:

"

越來越多的開發者開始學習JWT技術並在實際項目中運用JWT來保護應用安全。一時間,JWT技術風光無限,很多公司的應用程序也開始使用JWT(Json Web Token)來管理用戶會話信息。本文將從JWT的基本原理出發,分析在使用JWT構建基於Token的身份驗證系統時需要謹慎對待的細節。

​ 任何技術框架都有自身的侷限性,不可能一勞永逸,JWT也不例外。接下來,將從JWT的概念,基本原理和適用範圍來剖析為什麼說JWT不是銀彈,需要謹慎處理。

​ 眾所周知,如果我們的賬戶信息(用戶名和密碼)洩露,存儲在服務器上的隱私數據將受到毀滅性的打擊,如果是管理員的賬戶信息洩露,系統還有被攻擊的危險。那麼,JWT的信息發生洩露,會帶來什麼樣的影響?該如何防範?這將是本文重點闡述的內容。

1、什麼是Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ Token(令牌)通常是指Security Token(安全令牌),可以分為Hardware Token(硬件令牌),Authentication Token(授權令牌),USB Token(USB令牌),Cryptographic Token(加密令牌),Virtual Token(虛擬令牌)和Key Fob(鑰匙卡)。其主要作用是驗證身份的合法性,以允許計算機系統的用戶可以操作系統資源。生活中常見的令牌如:登錄密碼,指紋,聲紋,門禁卡,銀行電子卡等。Token的主要目的是為計算機系統提供一個可以識別用戶的任意數值,例如“token123”這樣的明文字符串,或者像“41ea873f-3a4d-57c8-1e38-ef74f31015af”之類的加密字符。

​ 由於篇幅關係,Token就瞭解到這裡。接下來將聊聊有關JWT(JSON Web Token)的原理。

2、什麼是JSON Web Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ JSON Web Token(JWT)是一個基於RFC 7519的開放數據標準,它定義了一種寬鬆且緊湊的數據組合方式,使用JSON對象在各應用之間傳輸加密信息。該JSON對象可以通過數字簽名進行鑑籤和校驗,一般地,JWT可以採用HMAC算法,RSA或者ECDSA的公鑰/私鑰對數據進行簽名操作。

​ 一個JWT通常有HEADER(頭),PAYLOAD(有效載荷)和SIGNATURE(簽名)三個部分組成,三者之間使用“.”鏈接,格式如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

下面是的字符串是一個JWT的實際案例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

注意三者之間有一個點號(“.”)相連

​ 為了更直觀的瞭解JWT的創建過程和使用方式,我們通過一個簡單的例子來演示這兩個過程。

3、如何創建JWT?

​ JWT通常由“標頭.有效載荷.簽名”的格式組成。其中,標頭用於存儲有關如何計算JWT簽名的信息,如對象類型,簽名算法等。下面是JWT中Header部分的JSON對象實例:

"

越來越多的開發者開始學習JWT技術並在實際項目中運用JWT來保護應用安全。一時間,JWT技術風光無限,很多公司的應用程序也開始使用JWT(Json Web Token)來管理用戶會話信息。本文將從JWT的基本原理出發,分析在使用JWT構建基於Token的身份驗證系統時需要謹慎對待的細節。

​ 任何技術框架都有自身的侷限性,不可能一勞永逸,JWT也不例外。接下來,將從JWT的概念,基本原理和適用範圍來剖析為什麼說JWT不是銀彈,需要謹慎處理。

​ 眾所周知,如果我們的賬戶信息(用戶名和密碼)洩露,存儲在服務器上的隱私數據將受到毀滅性的打擊,如果是管理員的賬戶信息洩露,系統還有被攻擊的危險。那麼,JWT的信息發生洩露,會帶來什麼樣的影響?該如何防範?這將是本文重點闡述的內容。

1、什麼是Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ Token(令牌)通常是指Security Token(安全令牌),可以分為Hardware Token(硬件令牌),Authentication Token(授權令牌),USB Token(USB令牌),Cryptographic Token(加密令牌),Virtual Token(虛擬令牌)和Key Fob(鑰匙卡)。其主要作用是驗證身份的合法性,以允許計算機系統的用戶可以操作系統資源。生活中常見的令牌如:登錄密碼,指紋,聲紋,門禁卡,銀行電子卡等。Token的主要目的是為計算機系統提供一個可以識別用戶的任意數值,例如“token123”這樣的明文字符串,或者像“41ea873f-3a4d-57c8-1e38-ef74f31015af”之類的加密字符。

​ 由於篇幅關係,Token就瞭解到這裡。接下來將聊聊有關JWT(JSON Web Token)的原理。

2、什麼是JSON Web Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ JSON Web Token(JWT)是一個基於RFC 7519的開放數據標準,它定義了一種寬鬆且緊湊的數據組合方式,使用JSON對象在各應用之間傳輸加密信息。該JSON對象可以通過數字簽名進行鑑籤和校驗,一般地,JWT可以採用HMAC算法,RSA或者ECDSA的公鑰/私鑰對數據進行簽名操作。

​ 一個JWT通常有HEADER(頭),PAYLOAD(有效載荷)和SIGNATURE(簽名)三個部分組成,三者之間使用“.”鏈接,格式如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

下面是的字符串是一個JWT的實際案例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

注意三者之間有一個點號(“.”)相連

​ 為了更直觀的瞭解JWT的創建過程和使用方式,我們通過一個簡單的例子來演示這兩個過程。

3、如何創建JWT?

​ JWT通常由“標頭.有效載荷.簽名”的格式組成。其中,標頭用於存儲有關如何計算JWT簽名的信息,如對象類型,簽名算法等。下面是JWT中Header部分的JSON對象實例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

在此JSON對象中,type表示該對象為JWT,alg表示創建JWT時使用HMAC-SHA256散列算法計算簽名。有效載荷主要用於存儲用戶信息,如用戶ID,Email,角色和權限信息等。下面是有效載荷的一個簡單示例:

"

越來越多的開發者開始學習JWT技術並在實際項目中運用JWT來保護應用安全。一時間,JWT技術風光無限,很多公司的應用程序也開始使用JWT(Json Web Token)來管理用戶會話信息。本文將從JWT的基本原理出發,分析在使用JWT構建基於Token的身份驗證系統時需要謹慎對待的細節。

​ 任何技術框架都有自身的侷限性,不可能一勞永逸,JWT也不例外。接下來,將從JWT的概念,基本原理和適用範圍來剖析為什麼說JWT不是銀彈,需要謹慎處理。

​ 眾所周知,如果我們的賬戶信息(用戶名和密碼)洩露,存儲在服務器上的隱私數據將受到毀滅性的打擊,如果是管理員的賬戶信息洩露,系統還有被攻擊的危險。那麼,JWT的信息發生洩露,會帶來什麼樣的影響?該如何防範?這將是本文重點闡述的內容。

1、什麼是Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ Token(令牌)通常是指Security Token(安全令牌),可以分為Hardware Token(硬件令牌),Authentication Token(授權令牌),USB Token(USB令牌),Cryptographic Token(加密令牌),Virtual Token(虛擬令牌)和Key Fob(鑰匙卡)。其主要作用是驗證身份的合法性,以允許計算機系統的用戶可以操作系統資源。生活中常見的令牌如:登錄密碼,指紋,聲紋,門禁卡,銀行電子卡等。Token的主要目的是為計算機系統提供一個可以識別用戶的任意數值,例如“token123”這樣的明文字符串,或者像“41ea873f-3a4d-57c8-1e38-ef74f31015af”之類的加密字符。

​ 由於篇幅關係,Token就瞭解到這裡。接下來將聊聊有關JWT(JSON Web Token)的原理。

2、什麼是JSON Web Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ JSON Web Token(JWT)是一個基於RFC 7519的開放數據標準,它定義了一種寬鬆且緊湊的數據組合方式,使用JSON對象在各應用之間傳輸加密信息。該JSON對象可以通過數字簽名進行鑑籤和校驗,一般地,JWT可以採用HMAC算法,RSA或者ECDSA的公鑰/私鑰對數據進行簽名操作。

​ 一個JWT通常有HEADER(頭),PAYLOAD(有效載荷)和SIGNATURE(簽名)三個部分組成,三者之間使用“.”鏈接,格式如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

下面是的字符串是一個JWT的實際案例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

注意三者之間有一個點號(“.”)相連

​ 為了更直觀的瞭解JWT的創建過程和使用方式,我們通過一個簡單的例子來演示這兩個過程。

3、如何創建JWT?

​ JWT通常由“標頭.有效載荷.簽名”的格式組成。其中,標頭用於存儲有關如何計算JWT簽名的信息,如對象類型,簽名算法等。下面是JWT中Header部分的JSON對象實例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

在此JSON對象中,type表示該對象為JWT,alg表示創建JWT時使用HMAC-SHA256散列算法計算簽名。有效載荷主要用於存儲用戶信息,如用戶ID,Email,角色和權限信息等。下面是有效載荷的一個簡單示例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

而簽名則需要使用Base64URL編碼技術對標頭(Header)和有效載荷(Payload)進行編碼,並作為參數和祕鑰一同傳遞給簽名算法,生成最終的簽名(Signature)。以HMAC-SHA256算法為例,下面是生成簽名的一個偽代碼:

"

越來越多的開發者開始學習JWT技術並在實際項目中運用JWT來保護應用安全。一時間,JWT技術風光無限,很多公司的應用程序也開始使用JWT(Json Web Token)來管理用戶會話信息。本文將從JWT的基本原理出發,分析在使用JWT構建基於Token的身份驗證系統時需要謹慎對待的細節。

​ 任何技術框架都有自身的侷限性,不可能一勞永逸,JWT也不例外。接下來,將從JWT的概念,基本原理和適用範圍來剖析為什麼說JWT不是銀彈,需要謹慎處理。

​ 眾所周知,如果我們的賬戶信息(用戶名和密碼)洩露,存儲在服務器上的隱私數據將受到毀滅性的打擊,如果是管理員的賬戶信息洩露,系統還有被攻擊的危險。那麼,JWT的信息發生洩露,會帶來什麼樣的影響?該如何防範?這將是本文重點闡述的內容。

1、什麼是Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ Token(令牌)通常是指Security Token(安全令牌),可以分為Hardware Token(硬件令牌),Authentication Token(授權令牌),USB Token(USB令牌),Cryptographic Token(加密令牌),Virtual Token(虛擬令牌)和Key Fob(鑰匙卡)。其主要作用是驗證身份的合法性,以允許計算機系統的用戶可以操作系統資源。生活中常見的令牌如:登錄密碼,指紋,聲紋,門禁卡,銀行電子卡等。Token的主要目的是為計算機系統提供一個可以識別用戶的任意數值,例如“token123”這樣的明文字符串,或者像“41ea873f-3a4d-57c8-1e38-ef74f31015af”之類的加密字符。

​ 由於篇幅關係,Token就瞭解到這裡。接下來將聊聊有關JWT(JSON Web Token)的原理。

2、什麼是JSON Web Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ JSON Web Token(JWT)是一個基於RFC 7519的開放數據標準,它定義了一種寬鬆且緊湊的數據組合方式,使用JSON對象在各應用之間傳輸加密信息。該JSON對象可以通過數字簽名進行鑑籤和校驗,一般地,JWT可以採用HMAC算法,RSA或者ECDSA的公鑰/私鑰對數據進行簽名操作。

​ 一個JWT通常有HEADER(頭),PAYLOAD(有效載荷)和SIGNATURE(簽名)三個部分組成,三者之間使用“.”鏈接,格式如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

下面是的字符串是一個JWT的實際案例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

注意三者之間有一個點號(“.”)相連

​ 為了更直觀的瞭解JWT的創建過程和使用方式,我們通過一個簡單的例子來演示這兩個過程。

3、如何創建JWT?

​ JWT通常由“標頭.有效載荷.簽名”的格式組成。其中,標頭用於存儲有關如何計算JWT簽名的信息,如對象類型,簽名算法等。下面是JWT中Header部分的JSON對象實例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

在此JSON對象中,type表示該對象為JWT,alg表示創建JWT時使用HMAC-SHA256散列算法計算簽名。有效載荷主要用於存儲用戶信息,如用戶ID,Email,角色和權限信息等。下面是有效載荷的一個簡單示例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

而簽名則需要使用Base64URL編碼技術對標頭(Header)和有效載荷(Payload)進行編碼,並作為參數和祕鑰一同傳遞給簽名算法,生成最終的簽名(Signature)。以HMAC-SHA256算法為例,下面是生成簽名的一個偽代碼:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

"

越來越多的開發者開始學習JWT技術並在實際項目中運用JWT來保護應用安全。一時間,JWT技術風光無限,很多公司的應用程序也開始使用JWT(Json Web Token)來管理用戶會話信息。本文將從JWT的基本原理出發,分析在使用JWT構建基於Token的身份驗證系統時需要謹慎對待的細節。

​ 任何技術框架都有自身的侷限性,不可能一勞永逸,JWT也不例外。接下來,將從JWT的概念,基本原理和適用範圍來剖析為什麼說JWT不是銀彈,需要謹慎處理。

​ 眾所周知,如果我們的賬戶信息(用戶名和密碼)洩露,存儲在服務器上的隱私數據將受到毀滅性的打擊,如果是管理員的賬戶信息洩露,系統還有被攻擊的危險。那麼,JWT的信息發生洩露,會帶來什麼樣的影響?該如何防範?這將是本文重點闡述的內容。

1、什麼是Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ Token(令牌)通常是指Security Token(安全令牌),可以分為Hardware Token(硬件令牌),Authentication Token(授權令牌),USB Token(USB令牌),Cryptographic Token(加密令牌),Virtual Token(虛擬令牌)和Key Fob(鑰匙卡)。其主要作用是驗證身份的合法性,以允許計算機系統的用戶可以操作系統資源。生活中常見的令牌如:登錄密碼,指紋,聲紋,門禁卡,銀行電子卡等。Token的主要目的是為計算機系統提供一個可以識別用戶的任意數值,例如“token123”這樣的明文字符串,或者像“41ea873f-3a4d-57c8-1e38-ef74f31015af”之類的加密字符。

​ 由於篇幅關係,Token就瞭解到這裡。接下來將聊聊有關JWT(JSON Web Token)的原理。

2、什麼是JSON Web Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ JSON Web Token(JWT)是一個基於RFC 7519的開放數據標準,它定義了一種寬鬆且緊湊的數據組合方式,使用JSON對象在各應用之間傳輸加密信息。該JSON對象可以通過數字簽名進行鑑籤和校驗,一般地,JWT可以採用HMAC算法,RSA或者ECDSA的公鑰/私鑰對數據進行簽名操作。

​ 一個JWT通常有HEADER(頭),PAYLOAD(有效載荷)和SIGNATURE(簽名)三個部分組成,三者之間使用“.”鏈接,格式如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

下面是的字符串是一個JWT的實際案例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

注意三者之間有一個點號(“.”)相連

​ 為了更直觀的瞭解JWT的創建過程和使用方式,我們通過一個簡單的例子來演示這兩個過程。

3、如何創建JWT?

​ JWT通常由“標頭.有效載荷.簽名”的格式組成。其中,標頭用於存儲有關如何計算JWT簽名的信息,如對象類型,簽名算法等。下面是JWT中Header部分的JSON對象實例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

在此JSON對象中,type表示該對象為JWT,alg表示創建JWT時使用HMAC-SHA256散列算法計算簽名。有效載荷主要用於存儲用戶信息,如用戶ID,Email,角色和權限信息等。下面是有效載荷的一個簡單示例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

而簽名則需要使用Base64URL編碼技術對標頭(Header)和有效載荷(Payload)進行編碼,並作為參數和祕鑰一同傳遞給簽名算法,生成最終的簽名(Signature)。以HMAC-SHA256算法為例,下面是生成簽名的一個偽代碼:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ 現在,我們已經瞭解了JWT的基本原理,接下來將使用Java來演示生成JWT的完整過程。

4、基於Java實現的JWT(JJWT)案例

4-1、依賴

以Maven工程為例,需要在pom.xml文件中添加入下的配置信息:

"

越來越多的開發者開始學習JWT技術並在實際項目中運用JWT來保護應用安全。一時間,JWT技術風光無限,很多公司的應用程序也開始使用JWT(Json Web Token)來管理用戶會話信息。本文將從JWT的基本原理出發,分析在使用JWT構建基於Token的身份驗證系統時需要謹慎對待的細節。

​ 任何技術框架都有自身的侷限性,不可能一勞永逸,JWT也不例外。接下來,將從JWT的概念,基本原理和適用範圍來剖析為什麼說JWT不是銀彈,需要謹慎處理。

​ 眾所周知,如果我們的賬戶信息(用戶名和密碼)洩露,存儲在服務器上的隱私數據將受到毀滅性的打擊,如果是管理員的賬戶信息洩露,系統還有被攻擊的危險。那麼,JWT的信息發生洩露,會帶來什麼樣的影響?該如何防範?這將是本文重點闡述的內容。

1、什麼是Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ Token(令牌)通常是指Security Token(安全令牌),可以分為Hardware Token(硬件令牌),Authentication Token(授權令牌),USB Token(USB令牌),Cryptographic Token(加密令牌),Virtual Token(虛擬令牌)和Key Fob(鑰匙卡)。其主要作用是驗證身份的合法性,以允許計算機系統的用戶可以操作系統資源。生活中常見的令牌如:登錄密碼,指紋,聲紋,門禁卡,銀行電子卡等。Token的主要目的是為計算機系統提供一個可以識別用戶的任意數值,例如“token123”這樣的明文字符串,或者像“41ea873f-3a4d-57c8-1e38-ef74f31015af”之類的加密字符。

​ 由於篇幅關係,Token就瞭解到這裡。接下來將聊聊有關JWT(JSON Web Token)的原理。

2、什麼是JSON Web Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ JSON Web Token(JWT)是一個基於RFC 7519的開放數據標準,它定義了一種寬鬆且緊湊的數據組合方式,使用JSON對象在各應用之間傳輸加密信息。該JSON對象可以通過數字簽名進行鑑籤和校驗,一般地,JWT可以採用HMAC算法,RSA或者ECDSA的公鑰/私鑰對數據進行簽名操作。

​ 一個JWT通常有HEADER(頭),PAYLOAD(有效載荷)和SIGNATURE(簽名)三個部分組成,三者之間使用“.”鏈接,格式如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

下面是的字符串是一個JWT的實際案例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

注意三者之間有一個點號(“.”)相連

​ 為了更直觀的瞭解JWT的創建過程和使用方式,我們通過一個簡單的例子來演示這兩個過程。

3、如何創建JWT?

​ JWT通常由“標頭.有效載荷.簽名”的格式組成。其中,標頭用於存儲有關如何計算JWT簽名的信息,如對象類型,簽名算法等。下面是JWT中Header部分的JSON對象實例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

在此JSON對象中,type表示該對象為JWT,alg表示創建JWT時使用HMAC-SHA256散列算法計算簽名。有效載荷主要用於存儲用戶信息,如用戶ID,Email,角色和權限信息等。下面是有效載荷的一個簡單示例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

而簽名則需要使用Base64URL編碼技術對標頭(Header)和有效載荷(Payload)進行編碼,並作為參數和祕鑰一同傳遞給簽名算法,生成最終的簽名(Signature)。以HMAC-SHA256算法為例,下面是生成簽名的一個偽代碼:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ 現在,我們已經瞭解了JWT的基本原理,接下來將使用Java來演示生成JWT的完整過程。

4、基於Java實現的JWT(JJWT)案例

4-1、依賴

以Maven工程為例,需要在pom.xml文件中添加入下的配置信息:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

如果是非Maven工程,你也可以到Maven中央倉庫搜索jjwt,然後選擇相應的版本(0.9.0)下載到本地,並將jar包添加到工程的類路徑(classpath)中。

"

越來越多的開發者開始學習JWT技術並在實際項目中運用JWT來保護應用安全。一時間,JWT技術風光無限,很多公司的應用程序也開始使用JWT(Json Web Token)來管理用戶會話信息。本文將從JWT的基本原理出發,分析在使用JWT構建基於Token的身份驗證系統時需要謹慎對待的細節。

​ 任何技術框架都有自身的侷限性,不可能一勞永逸,JWT也不例外。接下來,將從JWT的概念,基本原理和適用範圍來剖析為什麼說JWT不是銀彈,需要謹慎處理。

​ 眾所周知,如果我們的賬戶信息(用戶名和密碼)洩露,存儲在服務器上的隱私數據將受到毀滅性的打擊,如果是管理員的賬戶信息洩露,系統還有被攻擊的危險。那麼,JWT的信息發生洩露,會帶來什麼樣的影響?該如何防範?這將是本文重點闡述的內容。

1、什麼是Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ Token(令牌)通常是指Security Token(安全令牌),可以分為Hardware Token(硬件令牌),Authentication Token(授權令牌),USB Token(USB令牌),Cryptographic Token(加密令牌),Virtual Token(虛擬令牌)和Key Fob(鑰匙卡)。其主要作用是驗證身份的合法性,以允許計算機系統的用戶可以操作系統資源。生活中常見的令牌如:登錄密碼,指紋,聲紋,門禁卡,銀行電子卡等。Token的主要目的是為計算機系統提供一個可以識別用戶的任意數值,例如“token123”這樣的明文字符串,或者像“41ea873f-3a4d-57c8-1e38-ef74f31015af”之類的加密字符。

​ 由於篇幅關係,Token就瞭解到這裡。接下來將聊聊有關JWT(JSON Web Token)的原理。

2、什麼是JSON Web Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ JSON Web Token(JWT)是一個基於RFC 7519的開放數據標準,它定義了一種寬鬆且緊湊的數據組合方式,使用JSON對象在各應用之間傳輸加密信息。該JSON對象可以通過數字簽名進行鑑籤和校驗,一般地,JWT可以採用HMAC算法,RSA或者ECDSA的公鑰/私鑰對數據進行簽名操作。

​ 一個JWT通常有HEADER(頭),PAYLOAD(有效載荷)和SIGNATURE(簽名)三個部分組成,三者之間使用“.”鏈接,格式如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

下面是的字符串是一個JWT的實際案例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

注意三者之間有一個點號(“.”)相連

​ 為了更直觀的瞭解JWT的創建過程和使用方式,我們通過一個簡單的例子來演示這兩個過程。

3、如何創建JWT?

​ JWT通常由“標頭.有效載荷.簽名”的格式組成。其中,標頭用於存儲有關如何計算JWT簽名的信息,如對象類型,簽名算法等。下面是JWT中Header部分的JSON對象實例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

在此JSON對象中,type表示該對象為JWT,alg表示創建JWT時使用HMAC-SHA256散列算法計算簽名。有效載荷主要用於存儲用戶信息,如用戶ID,Email,角色和權限信息等。下面是有效載荷的一個簡單示例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

而簽名則需要使用Base64URL編碼技術對標頭(Header)和有效載荷(Payload)進行編碼,並作為參數和祕鑰一同傳遞給簽名算法,生成最終的簽名(Signature)。以HMAC-SHA256算法為例,下面是生成簽名的一個偽代碼:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ 現在,我們已經瞭解了JWT的基本原理,接下來將使用Java來演示生成JWT的完整過程。

4、基於Java實現的JWT(JJWT)案例

4-1、依賴

以Maven工程為例,需要在pom.xml文件中添加入下的配置信息:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

如果是非Maven工程,你也可以到Maven中央倉庫搜索jjwt,然後選擇相應的版本(0.9.0)下載到本地,並將jar包添加到工程的類路徑(classpath)中。

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

4-2、生成JWT

​ 在工程中新建JJWTUitls.java工具類,使用jjwt提供的方法實現JWT的生成,實現細節如下:

"

越來越多的開發者開始學習JWT技術並在實際項目中運用JWT來保護應用安全。一時間,JWT技術風光無限,很多公司的應用程序也開始使用JWT(Json Web Token)來管理用戶會話信息。本文將從JWT的基本原理出發,分析在使用JWT構建基於Token的身份驗證系統時需要謹慎對待的細節。

​ 任何技術框架都有自身的侷限性,不可能一勞永逸,JWT也不例外。接下來,將從JWT的概念,基本原理和適用範圍來剖析為什麼說JWT不是銀彈,需要謹慎處理。

​ 眾所周知,如果我們的賬戶信息(用戶名和密碼)洩露,存儲在服務器上的隱私數據將受到毀滅性的打擊,如果是管理員的賬戶信息洩露,系統還有被攻擊的危險。那麼,JWT的信息發生洩露,會帶來什麼樣的影響?該如何防範?這將是本文重點闡述的內容。

1、什麼是Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ Token(令牌)通常是指Security Token(安全令牌),可以分為Hardware Token(硬件令牌),Authentication Token(授權令牌),USB Token(USB令牌),Cryptographic Token(加密令牌),Virtual Token(虛擬令牌)和Key Fob(鑰匙卡)。其主要作用是驗證身份的合法性,以允許計算機系統的用戶可以操作系統資源。生活中常見的令牌如:登錄密碼,指紋,聲紋,門禁卡,銀行電子卡等。Token的主要目的是為計算機系統提供一個可以識別用戶的任意數值,例如“token123”這樣的明文字符串,或者像“41ea873f-3a4d-57c8-1e38-ef74f31015af”之類的加密字符。

​ 由於篇幅關係,Token就瞭解到這裡。接下來將聊聊有關JWT(JSON Web Token)的原理。

2、什麼是JSON Web Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ JSON Web Token(JWT)是一個基於RFC 7519的開放數據標準,它定義了一種寬鬆且緊湊的數據組合方式,使用JSON對象在各應用之間傳輸加密信息。該JSON對象可以通過數字簽名進行鑑籤和校驗,一般地,JWT可以採用HMAC算法,RSA或者ECDSA的公鑰/私鑰對數據進行簽名操作。

​ 一個JWT通常有HEADER(頭),PAYLOAD(有效載荷)和SIGNATURE(簽名)三個部分組成,三者之間使用“.”鏈接,格式如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

下面是的字符串是一個JWT的實際案例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

注意三者之間有一個點號(“.”)相連

​ 為了更直觀的瞭解JWT的創建過程和使用方式,我們通過一個簡單的例子來演示這兩個過程。

3、如何創建JWT?

​ JWT通常由“標頭.有效載荷.簽名”的格式組成。其中,標頭用於存儲有關如何計算JWT簽名的信息,如對象類型,簽名算法等。下面是JWT中Header部分的JSON對象實例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

在此JSON對象中,type表示該對象為JWT,alg表示創建JWT時使用HMAC-SHA256散列算法計算簽名。有效載荷主要用於存儲用戶信息,如用戶ID,Email,角色和權限信息等。下面是有效載荷的一個簡單示例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

而簽名則需要使用Base64URL編碼技術對標頭(Header)和有效載荷(Payload)進行編碼,並作為參數和祕鑰一同傳遞給簽名算法,生成最終的簽名(Signature)。以HMAC-SHA256算法為例,下面是生成簽名的一個偽代碼:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ 現在,我們已經瞭解了JWT的基本原理,接下來將使用Java來演示生成JWT的完整過程。

4、基於Java實現的JWT(JJWT)案例

4-1、依賴

以Maven工程為例,需要在pom.xml文件中添加入下的配置信息:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

如果是非Maven工程,你也可以到Maven中央倉庫搜索jjwt,然後選擇相應的版本(0.9.0)下載到本地,並將jar包添加到工程的類路徑(classpath)中。

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

4-2、生成JWT

​ 在工程中新建JJWTUitls.java工具類,使用jjwt提供的方法實現JWT的生成,實現細節如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

在此方法中,JJWT已經處理好JWT標頭(Header)的信息,我們只需要提供簽名所使用的算法(如SignatureAlgorithm.HS256),有效載荷,主題(包含了用戶信息),過期時間(exp-time)和祕鑰即可,最後使用jjwt的builder()方法組裝JWT。下面是生成祕鑰方法key()的源代碼:

"

越來越多的開發者開始學習JWT技術並在實際項目中運用JWT來保護應用安全。一時間,JWT技術風光無限,很多公司的應用程序也開始使用JWT(Json Web Token)來管理用戶會話信息。本文將從JWT的基本原理出發,分析在使用JWT構建基於Token的身份驗證系統時需要謹慎對待的細節。

​ 任何技術框架都有自身的侷限性,不可能一勞永逸,JWT也不例外。接下來,將從JWT的概念,基本原理和適用範圍來剖析為什麼說JWT不是銀彈,需要謹慎處理。

​ 眾所周知,如果我們的賬戶信息(用戶名和密碼)洩露,存儲在服務器上的隱私數據將受到毀滅性的打擊,如果是管理員的賬戶信息洩露,系統還有被攻擊的危險。那麼,JWT的信息發生洩露,會帶來什麼樣的影響?該如何防範?這將是本文重點闡述的內容。

1、什麼是Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ Token(令牌)通常是指Security Token(安全令牌),可以分為Hardware Token(硬件令牌),Authentication Token(授權令牌),USB Token(USB令牌),Cryptographic Token(加密令牌),Virtual Token(虛擬令牌)和Key Fob(鑰匙卡)。其主要作用是驗證身份的合法性,以允許計算機系統的用戶可以操作系統資源。生活中常見的令牌如:登錄密碼,指紋,聲紋,門禁卡,銀行電子卡等。Token的主要目的是為計算機系統提供一個可以識別用戶的任意數值,例如“token123”這樣的明文字符串,或者像“41ea873f-3a4d-57c8-1e38-ef74f31015af”之類的加密字符。

​ 由於篇幅關係,Token就瞭解到這裡。接下來將聊聊有關JWT(JSON Web Token)的原理。

2、什麼是JSON Web Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ JSON Web Token(JWT)是一個基於RFC 7519的開放數據標準,它定義了一種寬鬆且緊湊的數據組合方式,使用JSON對象在各應用之間傳輸加密信息。該JSON對象可以通過數字簽名進行鑑籤和校驗,一般地,JWT可以採用HMAC算法,RSA或者ECDSA的公鑰/私鑰對數據進行簽名操作。

​ 一個JWT通常有HEADER(頭),PAYLOAD(有效載荷)和SIGNATURE(簽名)三個部分組成,三者之間使用“.”鏈接,格式如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

下面是的字符串是一個JWT的實際案例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

注意三者之間有一個點號(“.”)相連

​ 為了更直觀的瞭解JWT的創建過程和使用方式,我們通過一個簡單的例子來演示這兩個過程。

3、如何創建JWT?

​ JWT通常由“標頭.有效載荷.簽名”的格式組成。其中,標頭用於存儲有關如何計算JWT簽名的信息,如對象類型,簽名算法等。下面是JWT中Header部分的JSON對象實例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

在此JSON對象中,type表示該對象為JWT,alg表示創建JWT時使用HMAC-SHA256散列算法計算簽名。有效載荷主要用於存儲用戶信息,如用戶ID,Email,角色和權限信息等。下面是有效載荷的一個簡單示例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

而簽名則需要使用Base64URL編碼技術對標頭(Header)和有效載荷(Payload)進行編碼,並作為參數和祕鑰一同傳遞給簽名算法,生成最終的簽名(Signature)。以HMAC-SHA256算法為例,下面是生成簽名的一個偽代碼:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ 現在,我們已經瞭解了JWT的基本原理,接下來將使用Java來演示生成JWT的完整過程。

4、基於Java實現的JWT(JJWT)案例

4-1、依賴

以Maven工程為例,需要在pom.xml文件中添加入下的配置信息:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

如果是非Maven工程,你也可以到Maven中央倉庫搜索jjwt,然後選擇相應的版本(0.9.0)下載到本地,並將jar包添加到工程的類路徑(classpath)中。

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

4-2、生成JWT

​ 在工程中新建JJWTUitls.java工具類,使用jjwt提供的方法實現JWT的生成,實現細節如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

在此方法中,JJWT已經處理好JWT標頭(Header)的信息,我們只需要提供簽名所使用的算法(如SignatureAlgorithm.HS256),有效載荷,主題(包含了用戶信息),過期時間(exp-time)和祕鑰即可,最後使用jjwt的builder()方法組裝JWT。下面是生成祕鑰方法key()的源代碼:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

4-3、解析JWT

​ 使用JJWT解析JWT相對簡單,首先獲取祕鑰,然後通過Jwts.parse()方法設置祕鑰並JWT進行解析,實現細節如下:

"

越來越多的開發者開始學習JWT技術並在實際項目中運用JWT來保護應用安全。一時間,JWT技術風光無限,很多公司的應用程序也開始使用JWT(Json Web Token)來管理用戶會話信息。本文將從JWT的基本原理出發,分析在使用JWT構建基於Token的身份驗證系統時需要謹慎對待的細節。

​ 任何技術框架都有自身的侷限性,不可能一勞永逸,JWT也不例外。接下來,將從JWT的概念,基本原理和適用範圍來剖析為什麼說JWT不是銀彈,需要謹慎處理。

​ 眾所周知,如果我們的賬戶信息(用戶名和密碼)洩露,存儲在服務器上的隱私數據將受到毀滅性的打擊,如果是管理員的賬戶信息洩露,系統還有被攻擊的危險。那麼,JWT的信息發生洩露,會帶來什麼樣的影響?該如何防範?這將是本文重點闡述的內容。

1、什麼是Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ Token(令牌)通常是指Security Token(安全令牌),可以分為Hardware Token(硬件令牌),Authentication Token(授權令牌),USB Token(USB令牌),Cryptographic Token(加密令牌),Virtual Token(虛擬令牌)和Key Fob(鑰匙卡)。其主要作用是驗證身份的合法性,以允許計算機系統的用戶可以操作系統資源。生活中常見的令牌如:登錄密碼,指紋,聲紋,門禁卡,銀行電子卡等。Token的主要目的是為計算機系統提供一個可以識別用戶的任意數值,例如“token123”這樣的明文字符串,或者像“41ea873f-3a4d-57c8-1e38-ef74f31015af”之類的加密字符。

​ 由於篇幅關係,Token就瞭解到這裡。接下來將聊聊有關JWT(JSON Web Token)的原理。

2、什麼是JSON Web Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ JSON Web Token(JWT)是一個基於RFC 7519的開放數據標準,它定義了一種寬鬆且緊湊的數據組合方式,使用JSON對象在各應用之間傳輸加密信息。該JSON對象可以通過數字簽名進行鑑籤和校驗,一般地,JWT可以採用HMAC算法,RSA或者ECDSA的公鑰/私鑰對數據進行簽名操作。

​ 一個JWT通常有HEADER(頭),PAYLOAD(有效載荷)和SIGNATURE(簽名)三個部分組成,三者之間使用“.”鏈接,格式如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

下面是的字符串是一個JWT的實際案例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

注意三者之間有一個點號(“.”)相連

​ 為了更直觀的瞭解JWT的創建過程和使用方式,我們通過一個簡單的例子來演示這兩個過程。

3、如何創建JWT?

​ JWT通常由“標頭.有效載荷.簽名”的格式組成。其中,標頭用於存儲有關如何計算JWT簽名的信息,如對象類型,簽名算法等。下面是JWT中Header部分的JSON對象實例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

在此JSON對象中,type表示該對象為JWT,alg表示創建JWT時使用HMAC-SHA256散列算法計算簽名。有效載荷主要用於存儲用戶信息,如用戶ID,Email,角色和權限信息等。下面是有效載荷的一個簡單示例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

而簽名則需要使用Base64URL編碼技術對標頭(Header)和有效載荷(Payload)進行編碼,並作為參數和祕鑰一同傳遞給簽名算法,生成最終的簽名(Signature)。以HMAC-SHA256算法為例,下面是生成簽名的一個偽代碼:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ 現在,我們已經瞭解了JWT的基本原理,接下來將使用Java來演示生成JWT的完整過程。

4、基於Java實現的JWT(JJWT)案例

4-1、依賴

以Maven工程為例,需要在pom.xml文件中添加入下的配置信息:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

如果是非Maven工程,你也可以到Maven中央倉庫搜索jjwt,然後選擇相應的版本(0.9.0)下載到本地,並將jar包添加到工程的類路徑(classpath)中。

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

4-2、生成JWT

​ 在工程中新建JJWTUitls.java工具類,使用jjwt提供的方法實現JWT的生成,實現細節如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

在此方法中,JJWT已經處理好JWT標頭(Header)的信息,我們只需要提供簽名所使用的算法(如SignatureAlgorithm.HS256),有效載荷,主題(包含了用戶信息),過期時間(exp-time)和祕鑰即可,最後使用jjwt的builder()方法組裝JWT。下面是生成祕鑰方法key()的源代碼:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

4-3、解析JWT

​ 使用JJWT解析JWT相對簡單,首先獲取祕鑰,然後通過Jwts.parse()方法設置祕鑰並JWT進行解析,實現細節如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

4-4、測試JJWT

​ 最後,在工程中新建一個JavaJWT.java類,並在main方法中檢驗JJWTUtils工具類中生成和解析JWT兩個方法是否有效。實現細節如下:

"

越來越多的開發者開始學習JWT技術並在實際項目中運用JWT來保護應用安全。一時間,JWT技術風光無限,很多公司的應用程序也開始使用JWT(Json Web Token)來管理用戶會話信息。本文將從JWT的基本原理出發,分析在使用JWT構建基於Token的身份驗證系統時需要謹慎對待的細節。

​ 任何技術框架都有自身的侷限性,不可能一勞永逸,JWT也不例外。接下來,將從JWT的概念,基本原理和適用範圍來剖析為什麼說JWT不是銀彈,需要謹慎處理。

​ 眾所周知,如果我們的賬戶信息(用戶名和密碼)洩露,存儲在服務器上的隱私數據將受到毀滅性的打擊,如果是管理員的賬戶信息洩露,系統還有被攻擊的危險。那麼,JWT的信息發生洩露,會帶來什麼樣的影響?該如何防範?這將是本文重點闡述的內容。

1、什麼是Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ Token(令牌)通常是指Security Token(安全令牌),可以分為Hardware Token(硬件令牌),Authentication Token(授權令牌),USB Token(USB令牌),Cryptographic Token(加密令牌),Virtual Token(虛擬令牌)和Key Fob(鑰匙卡)。其主要作用是驗證身份的合法性,以允許計算機系統的用戶可以操作系統資源。生活中常見的令牌如:登錄密碼,指紋,聲紋,門禁卡,銀行電子卡等。Token的主要目的是為計算機系統提供一個可以識別用戶的任意數值,例如“token123”這樣的明文字符串,或者像“41ea873f-3a4d-57c8-1e38-ef74f31015af”之類的加密字符。

​ 由於篇幅關係,Token就瞭解到這裡。接下來將聊聊有關JWT(JSON Web Token)的原理。

2、什麼是JSON Web Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ JSON Web Token(JWT)是一個基於RFC 7519的開放數據標準,它定義了一種寬鬆且緊湊的數據組合方式,使用JSON對象在各應用之間傳輸加密信息。該JSON對象可以通過數字簽名進行鑑籤和校驗,一般地,JWT可以採用HMAC算法,RSA或者ECDSA的公鑰/私鑰對數據進行簽名操作。

​ 一個JWT通常有HEADER(頭),PAYLOAD(有效載荷)和SIGNATURE(簽名)三個部分組成,三者之間使用“.”鏈接,格式如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

下面是的字符串是一個JWT的實際案例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

注意三者之間有一個點號(“.”)相連

​ 為了更直觀的瞭解JWT的創建過程和使用方式,我們通過一個簡單的例子來演示這兩個過程。

3、如何創建JWT?

​ JWT通常由“標頭.有效載荷.簽名”的格式組成。其中,標頭用於存儲有關如何計算JWT簽名的信息,如對象類型,簽名算法等。下面是JWT中Header部分的JSON對象實例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

在此JSON對象中,type表示該對象為JWT,alg表示創建JWT時使用HMAC-SHA256散列算法計算簽名。有效載荷主要用於存儲用戶信息,如用戶ID,Email,角色和權限信息等。下面是有效載荷的一個簡單示例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

而簽名則需要使用Base64URL編碼技術對標頭(Header)和有效載荷(Payload)進行編碼,並作為參數和祕鑰一同傳遞給簽名算法,生成最終的簽名(Signature)。以HMAC-SHA256算法為例,下面是生成簽名的一個偽代碼:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ 現在,我們已經瞭解了JWT的基本原理,接下來將使用Java來演示生成JWT的完整過程。

4、基於Java實現的JWT(JJWT)案例

4-1、依賴

以Maven工程為例,需要在pom.xml文件中添加入下的配置信息:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

如果是非Maven工程,你也可以到Maven中央倉庫搜索jjwt,然後選擇相應的版本(0.9.0)下載到本地,並將jar包添加到工程的類路徑(classpath)中。

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

4-2、生成JWT

​ 在工程中新建JJWTUitls.java工具類,使用jjwt提供的方法實現JWT的生成,實現細節如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

在此方法中,JJWT已經處理好JWT標頭(Header)的信息,我們只需要提供簽名所使用的算法(如SignatureAlgorithm.HS256),有效載荷,主題(包含了用戶信息),過期時間(exp-time)和祕鑰即可,最後使用jjwt的builder()方法組裝JWT。下面是生成祕鑰方法key()的源代碼:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

4-3、解析JWT

​ 使用JJWT解析JWT相對簡單,首先獲取祕鑰,然後通過Jwts.parse()方法設置祕鑰並JWT進行解析,實現細節如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

4-4、測試JJWT

​ 最後,在工程中新建一個JavaJWT.java類,並在main方法中檢驗JJWTUtils工具類中生成和解析JWT兩個方法是否有效。實現細節如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

如上圖所示,“jwt”將作為JWT標頭(Header)“type”的值,有效載荷(payload)中的主題信息如下:

"

越來越多的開發者開始學習JWT技術並在實際項目中運用JWT來保護應用安全。一時間,JWT技術風光無限,很多公司的應用程序也開始使用JWT(Json Web Token)來管理用戶會話信息。本文將從JWT的基本原理出發,分析在使用JWT構建基於Token的身份驗證系統時需要謹慎對待的細節。

​ 任何技術框架都有自身的侷限性,不可能一勞永逸,JWT也不例外。接下來,將從JWT的概念,基本原理和適用範圍來剖析為什麼說JWT不是銀彈,需要謹慎處理。

​ 眾所周知,如果我們的賬戶信息(用戶名和密碼)洩露,存儲在服務器上的隱私數據將受到毀滅性的打擊,如果是管理員的賬戶信息洩露,系統還有被攻擊的危險。那麼,JWT的信息發生洩露,會帶來什麼樣的影響?該如何防範?這將是本文重點闡述的內容。

1、什麼是Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ Token(令牌)通常是指Security Token(安全令牌),可以分為Hardware Token(硬件令牌),Authentication Token(授權令牌),USB Token(USB令牌),Cryptographic Token(加密令牌),Virtual Token(虛擬令牌)和Key Fob(鑰匙卡)。其主要作用是驗證身份的合法性,以允許計算機系統的用戶可以操作系統資源。生活中常見的令牌如:登錄密碼,指紋,聲紋,門禁卡,銀行電子卡等。Token的主要目的是為計算機系統提供一個可以識別用戶的任意數值,例如“token123”這樣的明文字符串,或者像“41ea873f-3a4d-57c8-1e38-ef74f31015af”之類的加密字符。

​ 由於篇幅關係,Token就瞭解到這裡。接下來將聊聊有關JWT(JSON Web Token)的原理。

2、什麼是JSON Web Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ JSON Web Token(JWT)是一個基於RFC 7519的開放數據標準,它定義了一種寬鬆且緊湊的數據組合方式,使用JSON對象在各應用之間傳輸加密信息。該JSON對象可以通過數字簽名進行鑑籤和校驗,一般地,JWT可以採用HMAC算法,RSA或者ECDSA的公鑰/私鑰對數據進行簽名操作。

​ 一個JWT通常有HEADER(頭),PAYLOAD(有效載荷)和SIGNATURE(簽名)三個部分組成,三者之間使用“.”鏈接,格式如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

下面是的字符串是一個JWT的實際案例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

注意三者之間有一個點號(“.”)相連

​ 為了更直觀的瞭解JWT的創建過程和使用方式,我們通過一個簡單的例子來演示這兩個過程。

3、如何創建JWT?

​ JWT通常由“標頭.有效載荷.簽名”的格式組成。其中,標頭用於存儲有關如何計算JWT簽名的信息,如對象類型,簽名算法等。下面是JWT中Header部分的JSON對象實例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

在此JSON對象中,type表示該對象為JWT,alg表示創建JWT時使用HMAC-SHA256散列算法計算簽名。有效載荷主要用於存儲用戶信息,如用戶ID,Email,角色和權限信息等。下面是有效載荷的一個簡單示例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

而簽名則需要使用Base64URL編碼技術對標頭(Header)和有效載荷(Payload)進行編碼,並作為參數和祕鑰一同傳遞給簽名算法,生成最終的簽名(Signature)。以HMAC-SHA256算法為例,下面是生成簽名的一個偽代碼:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ 現在,我們已經瞭解了JWT的基本原理,接下來將使用Java來演示生成JWT的完整過程。

4、基於Java實現的JWT(JJWT)案例

4-1、依賴

以Maven工程為例,需要在pom.xml文件中添加入下的配置信息:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

如果是非Maven工程,你也可以到Maven中央倉庫搜索jjwt,然後選擇相應的版本(0.9.0)下載到本地,並將jar包添加到工程的類路徑(classpath)中。

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

4-2、生成JWT

​ 在工程中新建JJWTUitls.java工具類,使用jjwt提供的方法實現JWT的生成,實現細節如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

在此方法中,JJWT已經處理好JWT標頭(Header)的信息,我們只需要提供簽名所使用的算法(如SignatureAlgorithm.HS256),有效載荷,主題(包含了用戶信息),過期時間(exp-time)和祕鑰即可,最後使用jjwt的builder()方法組裝JWT。下面是生成祕鑰方法key()的源代碼:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

4-3、解析JWT

​ 使用JJWT解析JWT相對簡單,首先獲取祕鑰,然後通過Jwts.parse()方法設置祕鑰並JWT進行解析,實現細節如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

4-4、測試JJWT

​ 最後,在工程中新建一個JavaJWT.java類,並在main方法中檢驗JJWTUtils工具類中生成和解析JWT兩個方法是否有效。實現細節如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

如上圖所示,“jwt”將作為JWT標頭(Header)“type”的值,有效載荷(payload)中的主題信息如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

且JWT簽名的有效時間為60,000毫秒。執行main方法,輸出信息如下所示:

"

越來越多的開發者開始學習JWT技術並在實際項目中運用JWT來保護應用安全。一時間,JWT技術風光無限,很多公司的應用程序也開始使用JWT(Json Web Token)來管理用戶會話信息。本文將從JWT的基本原理出發,分析在使用JWT構建基於Token的身份驗證系統時需要謹慎對待的細節。

​ 任何技術框架都有自身的侷限性,不可能一勞永逸,JWT也不例外。接下來,將從JWT的概念,基本原理和適用範圍來剖析為什麼說JWT不是銀彈,需要謹慎處理。

​ 眾所周知,如果我們的賬戶信息(用戶名和密碼)洩露,存儲在服務器上的隱私數據將受到毀滅性的打擊,如果是管理員的賬戶信息洩露,系統還有被攻擊的危險。那麼,JWT的信息發生洩露,會帶來什麼樣的影響?該如何防範?這將是本文重點闡述的內容。

1、什麼是Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ Token(令牌)通常是指Security Token(安全令牌),可以分為Hardware Token(硬件令牌),Authentication Token(授權令牌),USB Token(USB令牌),Cryptographic Token(加密令牌),Virtual Token(虛擬令牌)和Key Fob(鑰匙卡)。其主要作用是驗證身份的合法性,以允許計算機系統的用戶可以操作系統資源。生活中常見的令牌如:登錄密碼,指紋,聲紋,門禁卡,銀行電子卡等。Token的主要目的是為計算機系統提供一個可以識別用戶的任意數值,例如“token123”這樣的明文字符串,或者像“41ea873f-3a4d-57c8-1e38-ef74f31015af”之類的加密字符。

​ 由於篇幅關係,Token就瞭解到這裡。接下來將聊聊有關JWT(JSON Web Token)的原理。

2、什麼是JSON Web Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ JSON Web Token(JWT)是一個基於RFC 7519的開放數據標準,它定義了一種寬鬆且緊湊的數據組合方式,使用JSON對象在各應用之間傳輸加密信息。該JSON對象可以通過數字簽名進行鑑籤和校驗,一般地,JWT可以採用HMAC算法,RSA或者ECDSA的公鑰/私鑰對數據進行簽名操作。

​ 一個JWT通常有HEADER(頭),PAYLOAD(有效載荷)和SIGNATURE(簽名)三個部分組成,三者之間使用“.”鏈接,格式如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

下面是的字符串是一個JWT的實際案例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

注意三者之間有一個點號(“.”)相連

​ 為了更直觀的瞭解JWT的創建過程和使用方式,我們通過一個簡單的例子來演示這兩個過程。

3、如何創建JWT?

​ JWT通常由“標頭.有效載荷.簽名”的格式組成。其中,標頭用於存儲有關如何計算JWT簽名的信息,如對象類型,簽名算法等。下面是JWT中Header部分的JSON對象實例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

在此JSON對象中,type表示該對象為JWT,alg表示創建JWT時使用HMAC-SHA256散列算法計算簽名。有效載荷主要用於存儲用戶信息,如用戶ID,Email,角色和權限信息等。下面是有效載荷的一個簡單示例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

而簽名則需要使用Base64URL編碼技術對標頭(Header)和有效載荷(Payload)進行編碼,並作為參數和祕鑰一同傳遞給簽名算法,生成最終的簽名(Signature)。以HMAC-SHA256算法為例,下面是生成簽名的一個偽代碼:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ 現在,我們已經瞭解了JWT的基本原理,接下來將使用Java來演示生成JWT的完整過程。

4、基於Java實現的JWT(JJWT)案例

4-1、依賴

以Maven工程為例,需要在pom.xml文件中添加入下的配置信息:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

如果是非Maven工程,你也可以到Maven中央倉庫搜索jjwt,然後選擇相應的版本(0.9.0)下載到本地,並將jar包添加到工程的類路徑(classpath)中。

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

4-2、生成JWT

​ 在工程中新建JJWTUitls.java工具類,使用jjwt提供的方法實現JWT的生成,實現細節如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

在此方法中,JJWT已經處理好JWT標頭(Header)的信息,我們只需要提供簽名所使用的算法(如SignatureAlgorithm.HS256),有效載荷,主題(包含了用戶信息),過期時間(exp-time)和祕鑰即可,最後使用jjwt的builder()方法組裝JWT。下面是生成祕鑰方法key()的源代碼:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

4-3、解析JWT

​ 使用JJWT解析JWT相對簡單,首先獲取祕鑰,然後通過Jwts.parse()方法設置祕鑰並JWT進行解析,實現細節如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

4-4、測試JJWT

​ 最後,在工程中新建一個JavaJWT.java類,並在main方法中檢驗JJWTUtils工具類中生成和解析JWT兩個方法是否有效。實現細節如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

如上圖所示,“jwt”將作為JWT標頭(Header)“type”的值,有效載荷(payload)中的主題信息如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

且JWT簽名的有效時間為60,000毫秒。執行main方法,輸出信息如下所示:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ 從測試結果可以看出,我們成功的使用JJWT創建並解析了JWT。接下來,我們將瞭解到在實際的應用中,JWT對用戶信息進行驗證的基本流程。

5、 JSON Web Token的工作流程

​ 在身份驗證中,當用戶成功登錄系統時,授權服務器將會把JSON Web Token返回給客戶端,用戶需要將此憑證信息存儲在本地(cookie或瀏覽器緩存)。當用戶發起新的請求時,需要在請求頭中附帶此憑證信息,當服務器接收到用戶請求時,會先檢查請求頭中有無憑證,是否過期,是否有效。如果憑證有效,將放行請求;若憑證非法或者過期,服務器將回跳到認證中心,重新對用戶身份進行驗證,直至用戶身份驗證成功。以訪問API資源為例,下圖顯示了獲取並使用JWT的基本流程:

"

越來越多的開發者開始學習JWT技術並在實際項目中運用JWT來保護應用安全。一時間,JWT技術風光無限,很多公司的應用程序也開始使用JWT(Json Web Token)來管理用戶會話信息。本文將從JWT的基本原理出發,分析在使用JWT構建基於Token的身份驗證系統時需要謹慎對待的細節。

​ 任何技術框架都有自身的侷限性,不可能一勞永逸,JWT也不例外。接下來,將從JWT的概念,基本原理和適用範圍來剖析為什麼說JWT不是銀彈,需要謹慎處理。

​ 眾所周知,如果我們的賬戶信息(用戶名和密碼)洩露,存儲在服務器上的隱私數據將受到毀滅性的打擊,如果是管理員的賬戶信息洩露,系統還有被攻擊的危險。那麼,JWT的信息發生洩露,會帶來什麼樣的影響?該如何防範?這將是本文重點闡述的內容。

1、什麼是Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ Token(令牌)通常是指Security Token(安全令牌),可以分為Hardware Token(硬件令牌),Authentication Token(授權令牌),USB Token(USB令牌),Cryptographic Token(加密令牌),Virtual Token(虛擬令牌)和Key Fob(鑰匙卡)。其主要作用是驗證身份的合法性,以允許計算機系統的用戶可以操作系統資源。生活中常見的令牌如:登錄密碼,指紋,聲紋,門禁卡,銀行電子卡等。Token的主要目的是為計算機系統提供一個可以識別用戶的任意數值,例如“token123”這樣的明文字符串,或者像“41ea873f-3a4d-57c8-1e38-ef74f31015af”之類的加密字符。

​ 由於篇幅關係,Token就瞭解到這裡。接下來將聊聊有關JWT(JSON Web Token)的原理。

2、什麼是JSON Web Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ JSON Web Token(JWT)是一個基於RFC 7519的開放數據標準,它定義了一種寬鬆且緊湊的數據組合方式,使用JSON對象在各應用之間傳輸加密信息。該JSON對象可以通過數字簽名進行鑑籤和校驗,一般地,JWT可以採用HMAC算法,RSA或者ECDSA的公鑰/私鑰對數據進行簽名操作。

​ 一個JWT通常有HEADER(頭),PAYLOAD(有效載荷)和SIGNATURE(簽名)三個部分組成,三者之間使用“.”鏈接,格式如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

下面是的字符串是一個JWT的實際案例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

注意三者之間有一個點號(“.”)相連

​ 為了更直觀的瞭解JWT的創建過程和使用方式,我們通過一個簡單的例子來演示這兩個過程。

3、如何創建JWT?

​ JWT通常由“標頭.有效載荷.簽名”的格式組成。其中,標頭用於存儲有關如何計算JWT簽名的信息,如對象類型,簽名算法等。下面是JWT中Header部分的JSON對象實例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

在此JSON對象中,type表示該對象為JWT,alg表示創建JWT時使用HMAC-SHA256散列算法計算簽名。有效載荷主要用於存儲用戶信息,如用戶ID,Email,角色和權限信息等。下面是有效載荷的一個簡單示例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

而簽名則需要使用Base64URL編碼技術對標頭(Header)和有效載荷(Payload)進行編碼,並作為參數和祕鑰一同傳遞給簽名算法,生成最終的簽名(Signature)。以HMAC-SHA256算法為例,下面是生成簽名的一個偽代碼:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ 現在,我們已經瞭解了JWT的基本原理,接下來將使用Java來演示生成JWT的完整過程。

4、基於Java實現的JWT(JJWT)案例

4-1、依賴

以Maven工程為例,需要在pom.xml文件中添加入下的配置信息:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

如果是非Maven工程,你也可以到Maven中央倉庫搜索jjwt,然後選擇相應的版本(0.9.0)下載到本地,並將jar包添加到工程的類路徑(classpath)中。

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

4-2、生成JWT

​ 在工程中新建JJWTUitls.java工具類,使用jjwt提供的方法實現JWT的生成,實現細節如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

在此方法中,JJWT已經處理好JWT標頭(Header)的信息,我們只需要提供簽名所使用的算法(如SignatureAlgorithm.HS256),有效載荷,主題(包含了用戶信息),過期時間(exp-time)和祕鑰即可,最後使用jjwt的builder()方法組裝JWT。下面是生成祕鑰方法key()的源代碼:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

4-3、解析JWT

​ 使用JJWT解析JWT相對簡單,首先獲取祕鑰,然後通過Jwts.parse()方法設置祕鑰並JWT進行解析,實現細節如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

4-4、測試JJWT

​ 最後,在工程中新建一個JavaJWT.java類,並在main方法中檢驗JJWTUtils工具類中生成和解析JWT兩個方法是否有效。實現細節如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

如上圖所示,“jwt”將作為JWT標頭(Header)“type”的值,有效載荷(payload)中的主題信息如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

且JWT簽名的有效時間為60,000毫秒。執行main方法,輸出信息如下所示:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ 從測試結果可以看出,我們成功的使用JJWT創建並解析了JWT。接下來,我們將瞭解到在實際的應用中,JWT對用戶信息進行驗證的基本流程。

5、 JSON Web Token的工作流程

​ 在身份驗證中,當用戶成功登錄系統時,授權服務器將會把JSON Web Token返回給客戶端,用戶需要將此憑證信息存儲在本地(cookie或瀏覽器緩存)。當用戶發起新的請求時,需要在請求頭中附帶此憑證信息,當服務器接收到用戶請求時,會先檢查請求頭中有無憑證,是否過期,是否有效。如果憑證有效,將放行請求;若憑證非法或者過期,服務器將回跳到認證中心,重新對用戶身份進行驗證,直至用戶身份驗證成功。以訪問API資源為例,下圖顯示了獲取並使用JWT的基本流程:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ 現在,我們已經完全瞭解了JWT是什麼,怎麼實現以及用來幹什麼這三個問題。在上述的案例中,我們使用HS256算法對JWT進行簽名,在這個過程中,只有身份驗證服務器和應用服務器知道祕鑰是什麼。如果身份驗證服務器和應用服務器完全獨立,則應用服務器的JWT校驗工作也可以交由認證服務器完成。當客戶端對應用服務器發起調用時,應用服務器會使用祕鑰對簽名進行校驗,如果簽名有效且未過期,則允許客戶端的請求,反之則拒絕請求。

6、使用JSON Web Token的利弊

​ 優勢與劣勢是相對而言的,這裡主要以傳統的Session模式作為參考,總結使用JWT可以獲得優勢以及帶來的弊端。

6-1、 使用JWT的優勢

​ 使用JSON Web Token保護應用安全,你至少可以獲得以下幾個優勢:

  1. 更少的數據庫連接:因其基於算法來實現身份認證,在使用JWT時查詢數據的次數更少(更少的數據連接不等於不連接數據庫),可以獲得更快的系統響應時間。
  2. 構建更簡單:如果你的應用程序本身是無狀態的,那麼選擇JWT可以加快系統構建過程。
  3. 跨服務調用:你可以構建一個認證中心來處理用戶身份認證和發放簽名的工作,其他應用服務在後續的用戶請求中不需要(理論上)在詢問認證中心,可使用自有的公鑰對用戶簽名進行驗證。
  4. 無狀態:你不需要向傳統的Web應用那樣將用戶狀態保存於Session中。

6-2、使用JWT的弊端

​ JWT不是萬能的,使用JWT也會帶來諸多問題。就個人使用情況,使用JWT時可能會面臨以下幾個麻煩:

  1. 嚴重依賴於祕鑰:JWT的生成與解析過程都需要依賴於祕鑰(Secret),且都以硬編碼的方式存在於系統中(也有放在外部配置文件中的)。如果祕鑰不小心洩露,系統的安全性將收到威脅。
  2. 服務端無法管理客戶端的信息:如果用戶身份發生異常(信息洩露,或者被攻擊),服務端很難向操作Session那樣主動將異常用戶進行隔離。
  3. 服務端無法主動推送消息:服務端由於是無狀態的,他將無法使用像Session那樣的方式推送消息到客戶端,例如過期時間將至,服務端無法主動為用戶續約,需要客戶端向服務端發起續約請求。
  4. 冗餘的數據開銷:一個JWT簽名的大小要遠比一個Session ID長很多,如果你對有效載荷(payload)中的數據不做有效控制,其長度會成幾何倍數增長,且在每一次請求時都需要負擔額外的網絡開銷。

​ JSON Web Token 很流行,但是它相比於Session,OIDC(OpenId Connect)等技術還比較新,支持JSON Web Token的庫還比較少,而且JWT也並非比傳統Session更安全,他們都沒有解決CSRF和XSS的問題。因此,在決定使用JWT前,你需要仔細考慮其利弊。

7、JSON Web Token並非銀彈,“蹲坑”需謹慎

考慮這樣一個問題:如果客戶端的JWT令牌洩露或者被盜取,會發生什麼嚴重的後果?有什麼補救措施?

​ 如果單純的依靠JSON Web Token解決用戶認證的所有問題,那麼系統的安全性將是脆弱的。由於JWT令牌存儲於客戶端中,一旦客戶端存儲的令牌發生洩露事件或者被攻擊,攻擊者就可以輕而易舉的偽造用戶身份去修改/刪除系統資源,歲如按JWT自帶過期時間,但在過期之前,攻擊者可以肆無忌憚的操作系統數據。通過算法來校驗用戶身份合法性是JWT的優勢,同時也是最大的弊端——它太過於依賴算法。

​ 反觀傳統的用戶認證措施,通常會包含多種組合,如手機驗證碼,人臉識別,語音識別,指紋鎖等。用戶名和密碼只做用戶身份識別使用,當用戶名和密碼洩露後,在遇到敏感操作時(如新增,修改,刪除,下載,上傳),都會採用另外的方式對用戶的合法性進行驗證(發送驗證碼,郵箱驗證碼,指紋信息等)以確保數據安全。

​ 與傳統的身份驗證方式相比,JWT過多的依賴於算法,缺乏靈活性,而且服務端往往是被動執行用戶身份驗證操作,無法及時對異常用戶進行隔離。那是否有補救措施呢?答案是坑定的。接下來,將介紹在發生令牌洩露事件後,如何保證系統的安全。

8、使用JSON Web Token 爬坑指南

​ 不管是基於Sessions還是基於JSON Web Token,一旦密令被盜取,都是一件棘手的事情。接下來,將講述基於JSON Web Token的方式發生令牌洩露是該採取什麼樣的措施(解決方案包含但不侷限與本文所涉及的內容)。

"

越來越多的開發者開始學習JWT技術並在實際項目中運用JWT來保護應用安全。一時間,JWT技術風光無限,很多公司的應用程序也開始使用JWT(Json Web Token)來管理用戶會話信息。本文將從JWT的基本原理出發,分析在使用JWT構建基於Token的身份驗證系統時需要謹慎對待的細節。

​ 任何技術框架都有自身的侷限性,不可能一勞永逸,JWT也不例外。接下來,將從JWT的概念,基本原理和適用範圍來剖析為什麼說JWT不是銀彈,需要謹慎處理。

​ 眾所周知,如果我們的賬戶信息(用戶名和密碼)洩露,存儲在服務器上的隱私數據將受到毀滅性的打擊,如果是管理員的賬戶信息洩露,系統還有被攻擊的危險。那麼,JWT的信息發生洩露,會帶來什麼樣的影響?該如何防範?這將是本文重點闡述的內容。

1、什麼是Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ Token(令牌)通常是指Security Token(安全令牌),可以分為Hardware Token(硬件令牌),Authentication Token(授權令牌),USB Token(USB令牌),Cryptographic Token(加密令牌),Virtual Token(虛擬令牌)和Key Fob(鑰匙卡)。其主要作用是驗證身份的合法性,以允許計算機系統的用戶可以操作系統資源。生活中常見的令牌如:登錄密碼,指紋,聲紋,門禁卡,銀行電子卡等。Token的主要目的是為計算機系統提供一個可以識別用戶的任意數值,例如“token123”這樣的明文字符串,或者像“41ea873f-3a4d-57c8-1e38-ef74f31015af”之類的加密字符。

​ 由於篇幅關係,Token就瞭解到這裡。接下來將聊聊有關JWT(JSON Web Token)的原理。

2、什麼是JSON Web Token?

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ JSON Web Token(JWT)是一個基於RFC 7519的開放數據標準,它定義了一種寬鬆且緊湊的數據組合方式,使用JSON對象在各應用之間傳輸加密信息。該JSON對象可以通過數字簽名進行鑑籤和校驗,一般地,JWT可以採用HMAC算法,RSA或者ECDSA的公鑰/私鑰對數據進行簽名操作。

​ 一個JWT通常有HEADER(頭),PAYLOAD(有效載荷)和SIGNATURE(簽名)三個部分組成,三者之間使用“.”鏈接,格式如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

下面是的字符串是一個JWT的實際案例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

注意三者之間有一個點號(“.”)相連

​ 為了更直觀的瞭解JWT的創建過程和使用方式,我們通過一個簡單的例子來演示這兩個過程。

3、如何創建JWT?

​ JWT通常由“標頭.有效載荷.簽名”的格式組成。其中,標頭用於存儲有關如何計算JWT簽名的信息,如對象類型,簽名算法等。下面是JWT中Header部分的JSON對象實例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

在此JSON對象中,type表示該對象為JWT,alg表示創建JWT時使用HMAC-SHA256散列算法計算簽名。有效載荷主要用於存儲用戶信息,如用戶ID,Email,角色和權限信息等。下面是有效載荷的一個簡單示例:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

而簽名則需要使用Base64URL編碼技術對標頭(Header)和有效載荷(Payload)進行編碼,並作為參數和祕鑰一同傳遞給簽名算法,生成最終的簽名(Signature)。以HMAC-SHA256算法為例,下面是生成簽名的一個偽代碼:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ 現在,我們已經瞭解了JWT的基本原理,接下來將使用Java來演示生成JWT的完整過程。

4、基於Java實現的JWT(JJWT)案例

4-1、依賴

以Maven工程為例,需要在pom.xml文件中添加入下的配置信息:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

如果是非Maven工程,你也可以到Maven中央倉庫搜索jjwt,然後選擇相應的版本(0.9.0)下載到本地,並將jar包添加到工程的類路徑(classpath)中。

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

4-2、生成JWT

​ 在工程中新建JJWTUitls.java工具類,使用jjwt提供的方法實現JWT的生成,實現細節如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

在此方法中,JJWT已經處理好JWT標頭(Header)的信息,我們只需要提供簽名所使用的算法(如SignatureAlgorithm.HS256),有效載荷,主題(包含了用戶信息),過期時間(exp-time)和祕鑰即可,最後使用jjwt的builder()方法組裝JWT。下面是生成祕鑰方法key()的源代碼:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

4-3、解析JWT

​ 使用JJWT解析JWT相對簡單,首先獲取祕鑰,然後通過Jwts.parse()方法設置祕鑰並JWT進行解析,實現細節如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

4-4、測試JJWT

​ 最後,在工程中新建一個JavaJWT.java類,並在main方法中檢驗JJWTUtils工具類中生成和解析JWT兩個方法是否有效。實現細節如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

如上圖所示,“jwt”將作為JWT標頭(Header)“type”的值,有效載荷(payload)中的主題信息如下:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

且JWT簽名的有效時間為60,000毫秒。執行main方法,輸出信息如下所示:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ 從測試結果可以看出,我們成功的使用JJWT創建並解析了JWT。接下來,我們將瞭解到在實際的應用中,JWT對用戶信息進行驗證的基本流程。

5、 JSON Web Token的工作流程

​ 在身份驗證中,當用戶成功登錄系統時,授權服務器將會把JSON Web Token返回給客戶端,用戶需要將此憑證信息存儲在本地(cookie或瀏覽器緩存)。當用戶發起新的請求時,需要在請求頭中附帶此憑證信息,當服務器接收到用戶請求時,會先檢查請求頭中有無憑證,是否過期,是否有效。如果憑證有效,將放行請求;若憑證非法或者過期,服務器將回跳到認證中心,重新對用戶身份進行驗證,直至用戶身份驗證成功。以訪問API資源為例,下圖顯示了獲取並使用JWT的基本流程:

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

​ 現在,我們已經完全瞭解了JWT是什麼,怎麼實現以及用來幹什麼這三個問題。在上述的案例中,我們使用HS256算法對JWT進行簽名,在這個過程中,只有身份驗證服務器和應用服務器知道祕鑰是什麼。如果身份驗證服務器和應用服務器完全獨立,則應用服務器的JWT校驗工作也可以交由認證服務器完成。當客戶端對應用服務器發起調用時,應用服務器會使用祕鑰對簽名進行校驗,如果簽名有效且未過期,則允許客戶端的請求,反之則拒絕請求。

6、使用JSON Web Token的利弊

​ 優勢與劣勢是相對而言的,這裡主要以傳統的Session模式作為參考,總結使用JWT可以獲得優勢以及帶來的弊端。

6-1、 使用JWT的優勢

​ 使用JSON Web Token保護應用安全,你至少可以獲得以下幾個優勢:

  1. 更少的數據庫連接:因其基於算法來實現身份認證,在使用JWT時查詢數據的次數更少(更少的數據連接不等於不連接數據庫),可以獲得更快的系統響應時間。
  2. 構建更簡單:如果你的應用程序本身是無狀態的,那麼選擇JWT可以加快系統構建過程。
  3. 跨服務調用:你可以構建一個認證中心來處理用戶身份認證和發放簽名的工作,其他應用服務在後續的用戶請求中不需要(理論上)在詢問認證中心,可使用自有的公鑰對用戶簽名進行驗證。
  4. 無狀態:你不需要向傳統的Web應用那樣將用戶狀態保存於Session中。

6-2、使用JWT的弊端

​ JWT不是萬能的,使用JWT也會帶來諸多問題。就個人使用情況,使用JWT時可能會面臨以下幾個麻煩:

  1. 嚴重依賴於祕鑰:JWT的生成與解析過程都需要依賴於祕鑰(Secret),且都以硬編碼的方式存在於系統中(也有放在外部配置文件中的)。如果祕鑰不小心洩露,系統的安全性將收到威脅。
  2. 服務端無法管理客戶端的信息:如果用戶身份發生異常(信息洩露,或者被攻擊),服務端很難向操作Session那樣主動將異常用戶進行隔離。
  3. 服務端無法主動推送消息:服務端由於是無狀態的,他將無法使用像Session那樣的方式推送消息到客戶端,例如過期時間將至,服務端無法主動為用戶續約,需要客戶端向服務端發起續約請求。
  4. 冗餘的數據開銷:一個JWT簽名的大小要遠比一個Session ID長很多,如果你對有效載荷(payload)中的數據不做有效控制,其長度會成幾何倍數增長,且在每一次請求時都需要負擔額外的網絡開銷。

​ JSON Web Token 很流行,但是它相比於Session,OIDC(OpenId Connect)等技術還比較新,支持JSON Web Token的庫還比較少,而且JWT也並非比傳統Session更安全,他們都沒有解決CSRF和XSS的問題。因此,在決定使用JWT前,你需要仔細考慮其利弊。

7、JSON Web Token並非銀彈,“蹲坑”需謹慎

考慮這樣一個問題:如果客戶端的JWT令牌洩露或者被盜取,會發生什麼嚴重的後果?有什麼補救措施?

​ 如果單純的依靠JSON Web Token解決用戶認證的所有問題,那麼系統的安全性將是脆弱的。由於JWT令牌存儲於客戶端中,一旦客戶端存儲的令牌發生洩露事件或者被攻擊,攻擊者就可以輕而易舉的偽造用戶身份去修改/刪除系統資源,歲如按JWT自帶過期時間,但在過期之前,攻擊者可以肆無忌憚的操作系統數據。通過算法來校驗用戶身份合法性是JWT的優勢,同時也是最大的弊端——它太過於依賴算法。

​ 反觀傳統的用戶認證措施,通常會包含多種組合,如手機驗證碼,人臉識別,語音識別,指紋鎖等。用戶名和密碼只做用戶身份識別使用,當用戶名和密碼洩露後,在遇到敏感操作時(如新增,修改,刪除,下載,上傳),都會採用另外的方式對用戶的合法性進行驗證(發送驗證碼,郵箱驗證碼,指紋信息等)以確保數據安全。

​ 與傳統的身份驗證方式相比,JWT過多的依賴於算法,缺乏靈活性,而且服務端往往是被動執行用戶身份驗證操作,無法及時對異常用戶進行隔離。那是否有補救措施呢?答案是坑定的。接下來,將介紹在發生令牌洩露事件後,如何保證系統的安全。

8、使用JSON Web Token 爬坑指南

​ 不管是基於Sessions還是基於JSON Web Token,一旦密令被盜取,都是一件棘手的事情。接下來,將講述基於JSON Web Token的方式發生令牌洩露是該採取什麼樣的措施(解決方案包含但不侷限與本文所涉及的內容)。

JSON Web Token絕非銀彈,新手“蹲坑”指南(珍藏版)

為了防止用戶JWT令牌洩露而威脅系統安全,你可以在以下幾個方面完善系統功能:

  1. 清除已洩露的令牌:此方案最直接,也容易實現,你需將JWT令牌在服務端也存儲一份,若發現有異常的令牌存在,則從服務端令牌列表中將此異常令牌清除。當用戶發起請求時,強制用戶重新進行身份驗證,直至驗證成功。對於服務端的令牌存儲,可以藉助Redis等緩存服務器進行管理,也可以使用Ehcache將令牌信息存儲在內存中。
  2. 敏感操作保護:在涉及到諸如新增,修改,刪除,上傳,下載等敏感性操作時,定期(30分鐘,15分鐘甚至更短)檢查用戶身份,如手機驗證碼,掃描二維碼等手段,確認操作者是用戶本人。如果身份驗證不通過,則終止請求,並要求重新驗證用戶身份信息。
  3. 地域檢查:通常用戶會在一個相對固定的地理範圍內訪問應用程序,可以將地理位置信息作為一個輔助來甄別用戶的JWT令牌是否存在問題。如果發現用戶A由經常所在的地區1變到了相對較遠的地區2,或者頻繁在多個地區間切換,不管用戶有沒有可能在短時間內在多個地域活動(一般不可能),都應當終止當前請求,強制用戶重新進行驗證身份,頒發新的JWT令牌,並提醒(或要求)用戶重置密碼。
  4. 監控請求頻率:如果JWT密令被盜取,攻擊者或通過某些工具偽造用戶身份,高頻次的對系統發送請求,以套取用戶數據。針對這種情況,可以監控用戶在單位時間內的請求次數,當單位時間內的請求次數超出預定閾值值,則判定該用戶密令是有問題的。例如1秒內連續超過5次請求,則視為用戶身份非法,服務端終止請求並強制將該用戶的JWT密令清除,然後回跳到認證中心對用戶身份進行驗證。
  5. 客戶端環境檢查:對於一些移動端應用來說,可以將用戶信息與設備(手機,平板)的機器碼進行綁定,並存儲於服務端中,當客戶端發起請求時,可以先校驗客戶端的機器碼與服務端的是否匹配,如果不匹配,則視為非法請求,並終止用戶的後續請求。

總結

​ 本文從Token的基本含義,JSON Web Token的原理和流程出發,並結合實際的案例分析了使用JSON Web Token的優勢與劣勢;與此同時,結合自己實際使用JSON Web Token過程中發現的問題給出了避免“踩坑”的解決方案。

​ 世上沒有完美的解決方案,系統的安全性需要開發者積極主動地去提升,其過程是漫長且複雜的,也許一開始的MVP系統並不需要那麼強大的安全性,但隨著業務的增長系統需要升級,或者說最終將重寫整個系統,提前瞭解技術背後可能會遇到的問題,不失為一種好的編程習慣。

​ JSON Web Token的出現,為解決Web應用安全性問題提供了一種新思路。但JSON Web Token也不是銀彈,你任然需要做很多複雜的工作才能提升系統的安全性。

"

相關推薦

推薦中...