前言
小編一直使用的是服務器的session,最近的項目,小編做成了前後端分離,遇到了一些問題:
- 前後端項目分屬於兩個域名,如果要使用session,則需要解決跨域問題
- 如果接口存在多個服務器的話,session小編就不建議使用了
所以這時候,小編就想到了使用token,來驗證用戶的合法性。
Token和session的區別
- 跨域問題:token沒有跨域問題,session有跨域問題;
- 容易擴展:token不儲存於服務器中,適用於服務器的分佈式應用;
- CSRF:不依賴與cookie,不會受到跨站請求偽造的攻擊;
- 性能:相對於session,少了一次sessionid的計算;
以上是小編認為Token和session之間的一些不同之處,所以小編覺得使用token比較方便。
JWT Token(JSON WEB TOKEN)
小編對於token的使用,是基於JWT的,因為這個標準也是比較主流的一種使用規範。JWT主要由三部分組成:
- 頭部(header)
- 載荷(payload)
- 簽證(sign)
頭部(header)
JWT的頭部主要由兩部分信息組成:
- 聲明類型,這裡上jwt
- 聲明加密算法,如: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