JWT— json web token 服務端身份驗證使用心得
參考連接
一、爲什麼使用jwt
JSON Web Token(JWT)是目前最流行的跨域身份驗證解決方案,
-
傳統身份驗證手段session:
- 通過在客戶端cookie中存儲session id ,
- 發起請求時攜帶cookie,
- 服務器根據cookie存儲的session id 到臨時文件夾中查找對應的session
- 讀取session信息並對比數據,達到確認身份的目的
這種方式的問題是沒有分佈式架構,擴展不易,如果只使用一臺服務器,該模式沒有問題,如果使用多臺服務器集羣,則需要一個統一的session數據庫來保存信息,這樣負載均衡下,各個服務器才能實現數據共享,達到統一驗證的效果;另一個問題是會產生較大的I/O 開銷,加大服務器壓力
二、jwt介紹
使用過程
- 用戶登錄後,服務端生成一個唯一字符串並返回,成爲token (令牌)
- 用戶後續操作攜帶都token,服務端獲取token並進行身份驗證,token不正確或者過期均攔截後續操作
結構介紹
-
分爲三個部分,header,payload,sign 分別成爲頭部,有效載荷,簽名
-
header:
{ "typ":"JWT", "alg":"HS256" }
一般包括兩部分,typ名稱,alg表示簽名使用的算法,
-
payload:
{ "iss":"發行人", "exp":"到期時間", "sub":"主題", "aud":"用戶", "nbf":"在此之前不可用", "iat":"發佈時間", "jti":"jwt id 用於標識該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
使用方法
- 客戶端接收服務器返回的JWT,將其存儲在Cookie或localStorage中。
- 此後,客戶端將在與服務器交互中都會帶JWT。如果將它存儲在Cookie中,就可以自動發送,但是不會跨域,因此一般是將它放入HTTP請求的Header Authorization字段中。
- Authorization: Bearer
- 當跨域時,也可以將JWT被放置於POST請求的數據主體中;
問題和趨勢
- JWT默認不加密,但可以加密。生成原始令牌後,可以使用改令牌再次對其進行加密。
- 當JWT未加密方法是,一些私密數據無法通過JWT傳輸。
- JWT不僅可用於認證,還可用於信息交換。善用JWT有助於減少服務器請求數據庫的次數。
- JWT的最大缺點是服務器不保存會話狀態,所以在使用期間不可能取消令牌或更改令牌的權限。也就是說,一旦JWT簽發,在有效期內將會一直有效。
- JWT本身包含認證信息,因此一旦信息泄露,任何人都可以獲得令牌的所有權限。爲了減少盜用,JWT的有效期不宜設置太長。對於某些重要操作,用戶在使用時應該每次都進行進行身份驗證。
- 爲了減少盜用和竊取,JWT不建議使用HTTP協議來傳輸代碼,而是使用加密的HTTPS協議進行傳輸。