結論:
最直觀的: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去查數據庫