淺談JWT Token機制

前言

小編一直使用的是服務器的session,最近的項目,小編做成了前後端分離,遇到了一些問題:

  1. 前後端項目分屬於兩個域名,如果要使用session,則需要解決跨域問題
  2. 如果接口存在多個服務器的話,session小編就不建議使用了

所以這時候,小編就想到了使用token,來驗證用戶的合法性。

Token和session的區別

  1. 跨域問題:token沒有跨域問題,session有跨域問題;
  2. 容易擴展:token不儲存於服務器中,適用於服務器的分佈式應用;
  3. CSRF:不依賴與cookie,不會受到跨站請求偽造的攻擊;
  4. 性能:相對於session,少了一次sessionid的計算;

以上是小編認為Token和session之間的一些不同之處,所以小編覺得使用token比較方便。

JWT Token(JSON WEB TOKEN)

小編對於token的使用,是基於JWT的,因為這個標準也是比較主流的一種使用規範。JWT主要由三部分組成:

  1. 頭部(header)
  2. 載荷(payload)
  3. 簽證(sign)

頭部(header)

JWT的頭部主要由兩部分信息組成:

  1. 聲明類型,這裡上jwt
  2. 聲明加密算法,如:HMAC、SHA256、HS256

下邊的json,就是一個完整的頭部信息:

{
	"typ": "JWT",
	"alg": "HS256"
}

我們將這個頭部信息使用base64加密,就得到了我們JWT的第一部分信息了:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

載荷(payload)

主要有三部分組成:標準中註冊的聲明、公共的聲明、私有的聲明。

  • iss:jwt簽發者
  • sub:jwt所面向的用戶
  • aud:接收jwt的一方
  • exp:jwt的過期時間,這個過期時間必須大於簽發時間
  • nbf:定義在什麼時間之前,該token都是不可用的
  • iat:jwt的簽發時間
  • jti:jwt的唯一身份標識,避免重複

用戶自己添加的一些信息,比如用戶姓名、手機號等一些不敏感信息。

我們來看看一個完整的載荷(payload)的json數據:

{
 "iss": 'jwt'
 "sub": "13011912019",
 "exp": "1530000000",
 "iat": "1529000000",
 "jti": "638069ab7a97771edcb91180f491d01e",
 "nickname": "kafei",
 "avatar": "http://oy98jbaeo.bkt.clouddn.com/avatar-1532401501"
}

我們繼續將這個載荷(payload)信息使用base64加密,就得到了我們JWT的第二部分信息了:

eyJpc3MiOiJqd3QiLCJzdWIiOiIxMzAxMTkxMjAxOSIsImV4cCI6IjE1MzAwMDAwMDAiLCJpYXQiOiIxNTI5MDAwMDAwIiwianRpIjoiNjM4MDY5YWI3YTk3NzcxZWRjYjkxMTgwZjQ5MWQwMWUiLCJuaWNrbmFtZSI6ImthZmVpIiwiYXZhdGFyIjoiaHR0cDovL295OThqYmFlby5ia3QuY2xvdWRkbi5jb20vYXZhdGFyLTE1MzI0MDE1MDEifQ

簽證(sign)

前邊我們已經獲取到了頭部信息的base64和載荷的base64的信息了,現在我們需要用這兩個信息,生成一個簽證(sign),這就是我們需要的第三部分信息了:

最後,我們將這三部分連接起來,就是我們需要的JWT了:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJqd3QiLCJzdWIiOiIxMzAxMTkxMjAxOSIsImV4cCI6IjE1MzAwMDAwMDAiLCJpYXQiOiIxNTI5MDAwMDAwIiwianRpIjoiNjM4MDY5YWI3YTk3NzcxZWRjYjkxMTgwZjQ5MWQwMWUiLCJuaWNrbmFtZSI6ImthZmVpIiwiYXZhdGFyIjoiaHR0cDovL295OThqYmFlby5ia3QuY2xvdWRkbi5jb20vYXZhdGFyLTE1MzI0MDE1MDEifQ.eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

前端請求

將token放入到header裡邊的Authorization中,作為驗證,如:

fetch('api/user/1', {
 headers: {
 'Authorization': 'Bearer ' + token
 }
})

優點

  • 不需要儲存在服務器的session中,更容易擴展服務器
  • 由於用戶信息可以放入token中,所以可以少了一次數據庫 / 緩存的查詢操作,有更好的性能
  • 不需要預防CSRF的攻擊

不足

  • token一經洩露或者被盜取,將會暴露該用戶

建議

  • 設置token的過期時間,不宜過長
  • 非常重要的操作,需要手機驗證碼,支付密碼等二次驗證作為保險
  • 儘量使用 https

轉載地址:
https://zhuanlan.zhihu.com/p/43094841


分享到:


相關文章: