天天看點

解釋一下什麼是前後端分離的核心 JWTJWT 詳解應用

JWT 詳解

JWT是為了在網絡應用中,前後端傳遞中,進行頁面傳值的一種手段。

該TOKEN 設計緊湊,安全,适用于分布式站點的單點登入。

起源

傳統的HTTP協定是無狀态的,一個使用者,隻能儲存一份使用者資訊。

這份登入資訊,會在傳遞的時候,無狀态的傳遞給浏覽器,告訴其儲存為cookie。以便下次的時候,告訴那個使用者。

即傳統的給予session的前後端認證。

基于Token的鑒權機制。基于token的鑒權機制,類似于HTTP也是無狀态的,不需要服務端保留,使用者的資訊。意味着token認證機制,不需要考慮在那台機器上登入了。

具體的流程如下

  1. 使用者使用使用者名密碼請求伺服器。
  2. 伺服器驗證,使用者資訊。
  3. 伺服器通過認證,頒發token
  4. 用戶端儲存token。每次請求附帶token。
  5. 伺服器端驗證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 标注

解釋一下什麼是前後端分離的核心 JWTJWT 詳解應用

繼續閱讀