token驗證 什麼是token?我相信很多開發者都或多或少聽過基於 token 的用戶鑒權和基於 session 的用戶鑒權,而今天說的 token 驗證就是第一種了。token 的意思是“令牌”,是用戶第一次登錄伺服器返回的,它能讓用戶不需要提交賬戶和密碼就能進行伺服器驗證身份,它是被放在請求頭 ...
token驗證
什麼是token?我相信很多開發者都或多或少聽過基於 token 的用戶鑒權和基於 session 的用戶鑒權,而今天說的 token 驗證就是第一種了。token 的意思是“令牌”,是用戶第一次登錄伺服器返回的,它能讓用戶不需要提交賬戶和密碼就能進行伺服器驗證身份,它是被放在請求頭中一起提交給伺服器的。
為什麼用 token 驗證?怎麼用 token 驗證?現在簡單介紹一下,有錯誤請大牛指出,我會立即更正!
首先是為什麼用?
- 為了驗證用戶的登錄情況,畢竟不是登錄狀態的話很多東西是不允許訪問和呈現出來的。
- 減少資料庫的頻繁查詢,增加伺服器性能,使得伺服器更加健壯。
- 它可以在多個服務間共用,完全由應用管理,可以避開瀏覽器的同源策略。
- 增加擴展性、安全性和減少伺服器記憶體開銷。傳統的伺服器驗證是使用 cookie + session 驗證,伺服器需要每一次都驗證客戶端的請求去辨別客戶端身份,並且還要創建一個記錄將用戶信息存儲起來,然而隨著現在科技發達,這種驗證弊端也就顯露出來了,例如用戶增多從而引發記憶體資源消耗變大、CORS(跨域資源共用)和 CSRF(跨域請求偽造)等。
那麼怎麼用呢?
流程:
- 客戶端的用戶輸入賬戶密碼請求登錄。
- 服務端收到請求併進行驗證,成功則生成一個 token 值並返回給客戶端。
- 客戶端收到 token 值並將其存儲,例如 本地存儲:localStore 或 放在Cookie。
- 客戶端每次請求都將 token 值放在請求頭中發給伺服器,伺服器進行驗證有效性。
- 成功則返回客戶端請求的數據,失敗可以讓用戶進行登錄重新獲取新的 token 值。
token的組成
一般 token 組成:
- Uid(用戶身份的唯一標識)
- time(時間戳)
- sign(簽名)
JWT 組成:
JWT(JSON Web Tokens) 讀:jot
標準的組成:
- header(頭部),參數主要包括:類型--JWT,簽名的演算法--HS256。
private static $header=array(
'alg'=>'HS256', //生成signature的演算法
'typ'=>'JWT' //類型
);
- poyload(負荷):一般是自己想要放置的數據(因為信息會暴露,不建議放敏感信息)。
$time = time();
$tokenInfo = [
'iss'=>'CIMS',
'iat'=>$time,
'nbf'=>$time+2,
'jti'=>md5(uniqid('JWT').$time),
'sub'=>$data,
'exp'=> $time+7200
];
- sign(簽名):為了防止被惡意篡改數據。
/**
* HMACSHA256簽名 https://jwt.io/ 中HMACSHA256簽名實現
* @param string $input 為base64編碼後連接而成的的header和poyload的字元串:base64UrlEncode(header).".".base64UrlEncode(tokenInfo)
* @param string $key
* @param string $alg 演算法方式
* @return mixed
*/
private static function signature(string $input, string $key, string $alg = 'HS256')
{
$alg_config=array(
'HS256'=>'sha256'
);
return self::base64UrlEncode(hash_hmac($alg_config[$alg], $input, $key,true));
}
結果:一般會使用 base64 編碼,中間用.隔開
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsIm5hbWUiOiJjZXNoaSIsImF1ZCI6IiIsImV4cCI6MTY4MTIyNDY0OCwiaWF0IjoxNjgxMjIxMDQ4LCJpc3MiOiIiLCJqdGkiOiJkN2UxYTBiNGU3MDZmODUxMjgzZWZkZWVlZjQ5MWEwOSIsIm5iZiI6MTY4MTIyMTA0OCwic3ViIjoiIn0.qRTyO1pYHHJxBNRwHUz032NWKKqS3C9dakOHASJyASk
總結
擴展
放請求頭:
JWT 缺點:1.簽發生成後無法修改。2.不包含許可權控制。
解決token 註銷問題:儘快讓 token 失效,退出登錄後刪除 cookie,對失效的 token 形成黑名單,會違無狀態特性,但是標記時間短,會減少伺服器壓力。
解決token 續簽問題:後端在用戶登錄的介面添加 token 有效期判斷:例如即將過期那就重新生成一個返回。
token驗證目前是非常流行的,不僅僅只是在web網站上,移動端、小程式也會用到。例如小程式用的是使用 login 獲取 code 發送給後端進行一系列使用微信官方API介面獲取數據再進行加密等操作才返回 token,這裡就不詳細展開了吧,有興趣哈哈哈哈自己查下看看啦。
關於 token 更多的問題請在評論區留言!!!
參考文獻
https://blog.csdn.net/MINGJU2020/article/details/103039418
https://blog.csdn.net/HD243608836/article/details/115732104
https://zhuanlan.zhihu.com/p/267771576
創作不易,若需轉載請備註出處!