1. 程式人生 > >Winter is almost upon us

Winter is almost upon us

相同:

都是訪問資源的令牌,都可以記錄使用者的資訊,都是隻有驗證成功後,客戶端才能連結服務端

區別:

服務端驗證客戶端傳送的token資訊要進行資料的查詢操作
Jwt驗證客戶端發來的token就不用,在服務端使用金鑰校驗就可以了,不用資料庫的查詢。

最直觀的:token需要查庫驗證token 是否有效,而JWT不用查庫或者少查庫,直接在服務端進行校驗,並且不用查庫。因為使用者的資訊及加密資訊在第二部分payload和第三部分簽證中已經生成,只要在服務端進行校驗就行,並且校驗也是JWT自己實現的。

TOKEN

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

Token的認證流程:

  1. 使用者輸入使用者名稱和密碼,傳送給伺服器。
  2. 伺服器驗證使用者名稱和密碼,正確的話就返回一個簽名過的token(token 可以認為就是個長長的字串),瀏覽器客戶端拿到這個token。
  3. 客戶端自己儲存token,後續每次請求中,瀏覽器會把token作為http header傳送給伺服器,伺服器驗證簽名是否有效,如果有效那麼認證就成功,可以返回客戶端需要的資料。

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

JWT

概念:
JWT是json web token縮寫。可以使用在RESTFUL介面定義,也可以使用在普通的web。它將使用者資訊加密到token裡,伺服器不儲存任何使用者資訊。伺服器通過使用儲存的金鑰驗證token的正確性,只要正確即通過驗證。

組成:
JWT包含三個部分: 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資訊的傳送者是誰,並保證資訊沒有被修改 。

驗證流程:

  1. 在頭部資訊中宣告加密演算法和常量,然後把header使用json轉化為字串
  2. 在載荷中宣告使用者資訊,同時還有一些其他的內容,再次使用json把在和部分進行轉化,轉化為字串
  3. 使用在header中宣告的加密演算法來進行加密,把第一部分字串和第二部分的字串結合和每個專案隨機生成的secret字串進行加密,生成新的字串,此字串是獨一無二的
  4. 解密的時候,只要客戶端帶著jwt來發起請求,服務端就直接使用secret進行解密,解簽證解出第一部分和第二部分,然後比對第二部分的資訊和客戶端穿過來的資訊是否一致。如果一致驗證成功,否則驗證失敗。

特點:

  1. 三部分組成,每一部分都進行字串的轉化
  2. 解密的時候沒有使用資料庫,僅僅使用的是secret進行解密
  3. Jwt使用的secret千萬不能丟失

例如下面這個例子:

現在有一個介面/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去查資料庫