JWT--- json web token 服務(wù)端身份驗證使用心得
一臀稚、為什么使用jwt
JSON Web Token(JWT)是目前最流行的跨域身份驗證解決方案,
- 傳統(tǒng)身份驗證手段session:
通過在客戶端cookie中存儲session id 输吏,
發(fā)起請求時攜帶cookie诫尽,
服務(wù)器根據(jù)cookie存儲的session id 到臨時文件夾中查找對應(yīng)的session
讀取session信息并對比數(shù)據(jù),達到確認身份的目的
這種方式的問題是沒有分布式架構(gòu)佩耳,擴展不易留夜,如果只使用一臺服務(wù)器,該模式?jīng)]有問題撵摆,如果使用多臺服務(wù)器集群,則需要一個統(tǒng)一的session數(shù)據(jù)庫來保存信息害晦,這樣負載均衡下特铝,各個服務(wù)器才能實現(xiàn)數(shù)據(jù)共享,達到統(tǒng)一驗證的效果壹瘟;另一個問題是會產(chǎn)生較大的I/O 開銷鲫剿,加大服務(wù)器壓力
二、jwt介紹
使用過程
用戶登錄后稻轨,服務(wù)端生成一個唯一字符串并返回灵莲,成為token (令牌)
用戶后續(xù)操作攜帶都token,服務(wù)端獲取token并進行身份驗證,token不正確或者過期均攔截后續(xù)操作
結(jié)構(gòu)介紹
分為三個部分殴俱,header,payload,sign 分別成為頭部政冻,有效載荷,簽名
header:
{
"typ":"JWT",
"alg":"HS256"
}
一般包括兩部分线欲,typ名稱明场,alg表示簽名使用的算法,
- payload:
{
"iss":"發(fā)行人",
"exp":"到期時間",
"sub":"主題",
"aud":"用戶",
"nbf":"在此之前不可用",
"iat":"發(fā)布時間",
"jti":"jwt id 用于標(biāo)識該jwt",
"username":"admin",
"timestamp" :"時間戳"
}
有效載荷包含默認字段和自定義字段
- sign簽名哈希:
$header_str = base64_encode($header);
$payload_str = base64_encode($payload);
$secret = "自定義密鑰";
$sign = hash_hmac("HS256",$header_str.$payload_str,$secret)
簽名哈希由頭和有效荷載連接后,添加自定義的密鑰后按照指定的加密方式生成l
- 最終token:
header 李丰、 payload苦锨、sign 由 . 連接為一個字符串后 組成token
使用方法
客戶端接收服務(wù)器返回的JWT,將其存儲在Cookie或localStorage中趴泌。
此后舟舒,客戶端將在與服務(wù)器交互中都會帶JWT。如果將它存儲在Cookie中嗜憔,就可以自動發(fā)送秃励,但是不會跨域,因此一般是將它放入HTTP請求的Header Authorization字段中痹筛。
Authorization: Bearer
當(dāng)跨域時莺治,也可以將JWT被放置于POST請求的數(shù)據(jù)主體中;
問題和趨勢
JWT默認不加密帚稠,但可以加密。生成原始令牌后床佳,可以使用改令牌再次對其進行加密滋早。
當(dāng)JWT未加密方法是,一些私密數(shù)據(jù)無法通過JWT傳輸砌们。
JWT不僅可用于認證杆麸,還可用于信息交換搁进。善用JWT有助于減少服務(wù)器請求數(shù)據(jù)庫的次數(shù)。
JWT的最大缺點是服務(wù)器不保存會話狀態(tài)昔头,所以在使用期間不可能取消令牌或更改令牌的權(quán)限饼问。也就是說,一旦JWT簽發(fā)揭斧,在有效期內(nèi)將會一直有效莱革。
JWT本身包含認證信息,因此一旦信息泄露讹开,任何人都可以獲得令牌的所有權(quán)限盅视。為了減少盜用,JWT的有效期不宜設(shè)置太長旦万。對于某些重要操作闹击,用戶在使用時應(yīng)該每次都進行進行身份驗證。
為了減少盜用和竊取成艘,JWT不建議使用HTTP協(xié)議來傳輸代碼赏半,而是使用加密的HTTPS協(xié)議進行傳輸。