JWT 詳解
JWT是為了在網絡應用中,前後端傳遞中,進行頁面傳值的一種手段。
該TOKEN 設計緊湊,安全,适用于分布式站點的單點登入。
起源
傳統的HTTP協定是無狀态的,一個使用者,隻能儲存一份使用者資訊。
這份登入資訊,會在傳遞的時候,無狀态的傳遞給浏覽器,告訴其儲存為cookie。以便下次的時候,告訴那個使用者。
即傳統的給予session的前後端認證。
基于Token的鑒權機制。基于token的鑒權機制,類似于HTTP也是無狀态的,不需要服務端保留,使用者的資訊。意味着token認證機制,不需要考慮在那台機器上登入了。
具體的流程如下
- 使用者使用使用者名密碼請求伺服器。
- 伺服器驗證,使用者資訊。
- 伺服器通過認證,頒發token
- 用戶端儲存token。每次請求附帶token。
- 伺服器端驗證token值,并傳回資料。
JWT 長什麼樣子
由三部分組成。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
構成
第一部分我們稱它為頭部(header),第二部分我們稱其為載荷(payload, 類似于飛機上承載的物品),第三部分是簽證(signature).
頭部
聲明類型,這裡是jwt
聲明加密的算法 通常直接使用 HMAC SHA256
對頭部進行加密
{
'typ': 'JWT',
'alg': 'HS256'
}
然後進行base64加密
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
playload
儲存有效資訊的地方。
通常包含三個部分
标準中注冊的聲明
公共的聲明
私有的聲明
iss: jwt簽發者
sub: jwt所面向的使用者
aud: 接收jwt的一方
exp: jwt的過期時間,這個過期時間必須要大于簽發時間
nbf: 定義在什麼時間之前,該jwt都是不可用的.
iat: jwt的簽發時間
jti: jwt的唯一身份辨別,主要用來作為一次性token,進而回避重播攻擊。
公共的聲明 :
公共的聲明可以添加任何的資訊,一般添加使用者的相關資訊或其他業務需要的必要資訊.但不建議添加敏感資訊,因為該部分在用戶端可解密.
私有的聲明 :
私有聲明是提供者和消費者所共同定義的聲明,一般不建議存放敏感資訊,因為base64是對稱解密的,意味着該部分資訊可以歸類為明文資訊。
signature
用于驗證jwt是否發生了改變。
通過秘鑰加密,實作jwt是否發生了更改
// javascript
var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);
var signature = HMACSHA256(encodedString, 'secret'); // TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
這樣通過加密實作了base64位的加密
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
應用
Authorization 加上 Bearer 标注
