1. 程式人生 > 其它 >jwt和token的區別

jwt和token的區別

結論:

最直觀的:token需要查庫驗證token是否有效,而JWT不用查庫或者少查庫,直接在服務端進行校驗並且不用查庫

因為使用者的資訊及加密資訊在第二部分payload和第三部分簽證中已經生成,只要在服務端進行校驗就行,並且校驗也是JWT自己實現的。

TOKEN

概念: 令牌, 是訪問資源的憑證。

Token的認證流程:

1. 使用者輸入使用者名稱和密碼,傳送給伺服器。

2. 伺服器驗證使用者名稱和密碼,正確的話就返回一個簽名過的token(token 可以認為就是個長長的字串),瀏覽器客戶端拿到這個token。

3. 後續每次請求中,瀏覽器會把token作為http header傳送給伺服器,伺服器驗證簽名是否有效,如果有效那麼認證就成功,可以返回客戶端需要的資料。

特點:

這種方式的特點就是客戶端的token中自己保留有大量資訊,伺服器沒有儲存這些資訊。

JWT

概念:

JWT是json web token縮寫。它將使用者資訊加密到token裡,伺服器不儲存任何使用者資訊。伺服器通過使用儲存的金鑰驗證token的正確性,只要正確即通過驗證。

組成:

WT包含三個部分: Header頭部,Payload負載和Signature簽名。由三部分生成token,三部分之間用“.”號做分割。 列如 : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

1. Header 在Header中通常包含了兩部分:type:代表token的型別,這裡使用的是JWT型別。 alg:使用的Hash演算法,例如HMAC SHA256或RSA.

{ "alg": "HS256", "typ": "JWT" } 這會被經過base64Url編碼形成第一部分

2. Payload token的第二個部分是荷載資訊,它包含一些宣告Claim(實體的描述,通常是一個User資訊,還包括一些其他的元資料) 宣告分三類: 1)Reserved Claims,這是一套預定義的宣告,並不是必須的,這是一套易於使用、操作性強的宣告。包括:iss(issuer)、exp(expiration time)、sub(subject)、aud(audience)等 2)Plubic Claims, 3)Private Claims,交換資訊的雙方自定義的宣告 { "sub": "1234567890", "name": "John Doe", "admin": true } 同樣經過Base64Url編碼後形成第二部分

3. signature 使用header中指定的演算法將編碼後的header、編碼後的payload、一個secret進行加密。 例如使用的是HMAC SHA256演算法,大致流程類似於: HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret) 這個signature欄位被用來確認JWT資訊的傳送者是誰,並保證資訊沒有被修改 。

例如下面這個例子:

現在有一個介面/viptest只能是vip使用者訪問,我們看看服務端如何根據Token判斷使用者是否有效。

普通token版:

1. 查庫判斷是否過期

2. 查庫判斷時候是VIP

JWT 版本:

假如payload部分如下:

{

"exp": 1518624000,

"isVip": true,

"uid":1

}

1. 解析JWT

2. 判斷簽名是否正確,根據生成簽名時使用的金鑰和加密演算法,只要這一步過了就說明是payload是可信的

3. 判斷JWT token是否過期,根據exp,判斷是否是VIP,根據isVip

JWT版是沒有查庫的,他所需要的基礎資訊可以直接放到JWT裡,服務端只要判斷簽名是否正確就可以判斷出該使用者是否可以訪問該介面,當然JWT裡的內容也不是無限多的,其他更多的資訊我們就可以通過id去查資料庫

轉載自https://www.cnblogs.com/chentao17180/p/14514494.html