什麼是JWT(JSON Web Tokens)?
-
JWT(JSON Web Token)是一個非常輕巧的規範,允許我們使用JWT在用戶和服務器之間傳遞安全可靠的信息。
為什麼冒出個JWT(JSON Web Tokens)?有什麼用,解決什麼問題?
傳統session、cookies有以下明顯的缺點:
a、cookies的安全性不好,攻擊者可以通過獲取本地cookies進行欺騙或者利用cookies進行CSRF攻擊。
b、使用cookies時,在多個域名下,會存在跨域問題。
c、session在一定的時間裡,需要存放在服務端,因此當擁有大量用戶時,也會大幅度降低服務端的性能。
d、多服務器時需要共享session。
2. 為了解決這些問題,JWT出現了。它不再有session、cookies上面列舉的缺點,不易被攻擊者利用,安全性提高了。利用Http傳輸token,沒有跨域問題。信息分散存儲在客戶端,服務端佔用資源變少,也就不存在session共享問題。
JWT(JSON Web Tokens)是如何工作的?
要了解工作原理,我們先看下JWT的組成結構
JWT實際上是一個字符串,由三部分組成,頭部(HEADER)、載荷(PAYLOAD)、簽名(VERIFY SIGNATURE)。
頭部
頭部用於描述關於該JWT的最基本的信息,例如其類型以及簽名所用的算法等。
{
"alg": "HS256",
"typ": "JWT"
}
這是一個頭部樣例,描述了token的類型為JWT,使用的算法是HS256
載荷
載荷用於存儲數據,可以包含JWT標準字段,也可以自定義。列舉幾個標準字段以及含義:
iss: JWT的簽發者
sub: JWT所面向的用戶
aud: 接收JWT的一方
exp(expires): 什麼時候過期
iat(issued at): 什麼時候簽發
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
這就是一個載荷樣例,有3個字段,意思是:在這個1516239022(Unix時間戳)簽發的包含name=John Doe的token發送給1234567890用戶。
簽名
對頭部和載荷編碼連接內容使用加密算法進行加密,加密過程使用特定秘鑰。
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
) secret base64 encoded
2.JWT的工作流程:
客戶端使用賬戶密碼登錄
登錄成功後服務端返回JWT
客戶端再次請求其他時帶上JWT
服務端接收到JWT後驗證簽名的有效性。
閱讀更多 Lucif墮落天使 的文章