jwt---json web token 身份驗證

JWT— json web token 服務端身份驗證使用心得

參考連接
一、爲什麼使用jwt

JSON Web Token(JWT)是目前最流行的跨域身份驗證解決方案,

  1. 傳統身份驗證手段session

    • 通過在客戶端cookie中存儲session id ,
    • 發起請求時攜帶cookie,
    • 服務器根據cookie存儲的session id 到臨時文件夾中查找對應的session
    • 讀取session信息並對比數據,達到確認身份的目的

    這種方式的問題是沒有分佈式架構,擴展不易,如果只使用一臺服務器,該模式沒有問題,如果使用多臺服務器集羣,則需要一個統一的session數據庫來保存信息,這樣負載均衡下,各個服務器才能實現數據共享,達到統一驗證的效果;另一個問題是會產生較大的I/O 開銷,加大服務器壓力

二、jwt介紹

使用過程

  1. 用戶登錄後,服務端生成一個唯一字符串並返回,成爲token (令牌)
  2. 用戶後續操作攜帶都token,服務端獲取token並進行身份驗證,token不正確或者過期均攔截後續操作

結構介紹

  1. 分爲三個部分,header,payload,sign 分別成爲頭部,有效載荷,簽名

  2. header:

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

    一般包括兩部分,typ名稱,alg表示簽名使用的算法,

  3. payload:

    {
        "iss":"發行人",
        "exp":"到期時間",
        "sub":"主題",
        "aud":"用戶",
        "nbf":"在此之前不可用",
        "iat":"發佈時間",
        "jti":"jwt id 用於標識該jwt",
        "username":"admin",
        "timestamp" :"時間戳"
    }
    

    有效載荷包含默認字段和自定義字段

  4. sign簽名哈希:

    $header_str = base64_encode($header);
    $payload_str = base64_encode($payload);
    $secret = "自定義密鑰";
    $sign = hash_hmac("HS256",$header_str.$payload_str,$secret)
    

    簽名哈希由頭和有效荷載連接後,添加自定義的密鑰後按照指定的加密方式生成l

  5. 最終token:

    header 、 payload、sign 由 . 連接爲一個字符串後 組成token

使用方法

  1. 客戶端接收服務器返回的JWT,將其存儲在Cookie或localStorage中。
  2. 此後,客戶端將在與服務器交互中都會帶JWT。如果將它存儲在Cookie中,就可以自動發送,但是不會跨域,因此一般是將它放入HTTP請求的Header Authorization字段中。
  3. Authorization: Bearer
  4. 當跨域時,也可以將JWT被放置於POST請求的數據主體中;

問題和趨勢

  1. JWT默認不加密,但可以加密。生成原始令牌後,可以使用改令牌再次對其進行加密。
  2. 當JWT未加密方法是,一些私密數據無法通過JWT傳輸。
  3. JWT不僅可用於認證,還可用於信息交換。善用JWT有助於減少服務器請求數據庫的次數。
  4. JWT的最大缺點是服務器不保存會話狀態,所以在使用期間不可能取消令牌或更改令牌的權限。也就是說,一旦JWT簽發,在有效期內將會一直有效。
  5. JWT本身包含認證信息,因此一旦信息泄露,任何人都可以獲得令牌的所有權限。爲了減少盜用,JWT的有效期不宜設置太長。對於某些重要操作,用戶在使用時應該每次都進行進行身份驗證。
  6. 爲了減少盜用和竊取,JWT不建議使用HTTP協議來傳輸代碼,而是使用加密的HTTPS協議進行傳輸。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章