<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] > [阮一峰](http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html) ## 概述 認證的兩種方式 1. session 數據持久化,寫入數據庫或別的持久層。各種服務收到請求后,都向持久層請求數據。這種方案的優點是架構清晰,缺點是工程量比較大。另外,持久層萬一掛了,就會單點失敗。 2. 服務器索性不保存 session 數據了,所有數據都保存在客戶端,每次請求都發回服務器。JWT 就是這種方案的一個代表。 ## JWT 的數據結構 ![](https://www.wangbase.com/blogimg/asset/201807/bg2018072303.jpg) ### Header(頭部) json 對象使用 Base64URL 算法轉成字符串 ``` { "alg": "HS256", //默認是 HMAC SHA256(寫成 HS256) "typ": "JWT" } ``` ### Payload(負載) JWT 規定了7個官方字段,供選用。 * iss (issuer):簽發人 * exp (expiration time):過期時間 * sub (subject):主題 * aud (audience):受眾 * nbf (Not Before):生效時間 * iat (Issued At):簽發時間 * jti (JWT ID):編號 還可的定義私有字段 ``` { "sub": "1234567890", "name": "John Doe", "admin": true } ``` >JWT 默認是不加密的,任何人都可以讀到,所以不要把秘密信息放在這個部分 > JSON 對象也要使用 Base64URL 算法轉成字符串 ### Signature(簽名) Signature 部分是對前兩部分的簽名,防止數據篡改 首先,需要指定一個密鑰(secret)。這個密鑰只有服務器才知道。使用 Header 里面指定的簽名算法(默認是 HMAC SHA256) ``` HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret) ``` ### Base64URL 說明 JWT 作為一個令牌(token),有些場合可能會放到 URL(比如 `api.example.com/?token=xxx`)。Base64 有三個字符`+`、`/`和`=`,在 URL 里面有特殊含義,所以要被替換掉:`=`被省略、`+`替換成`-`,`/`替換成`_`。這就是 Base64URL 算法。 ### JWT 的使用方式 可以儲存在 Cookie 里面,也可以儲存在 localStorage 1. 客戶端每次與服務器通信,都要帶上這個 JWT。你可以把它放在 Cookie 里面自動發送,但是這樣不能跨域,所以更好的做法是放在 HTTP 請求的頭信息`Authorization`字段里面 2. 另一種做法是,跨域的時候,JWT 就放在 POST 請求的數據體里面。 ## 五、JWT 的幾個特點 1. JWT 默認是不加密,但也是可以加密的。生成原始 Token 以后,可以用密鑰再加密一次。 2. JWT 不加密的情況下,不能將秘密數據寫入 JWT。 3. JWT 不僅可以用于認證,也可以用于交換信息。有效使用 JWT,可以降低服務器查詢數據庫的次數。 4. JWT 的最大缺點是,由于服務器不保存 session 狀態,因此無法在使用過程中廢止某個 token,或者更改 token 的權限。也就是說,一旦 JWT 簽發了,在到期之前就會始終有效,除非服務器部署額外的邏輯。 5. JWT 本身包含了認證信息,一旦泄露,任何人都可以獲得該令牌的所有權限。為了減少盜用,JWT 的有效期應該設置得比較短。對于一些比較重要的權限,使用時應該再次對用戶進行認證。 6. 為了減少盜用,JWT 不應該使用 HTTP 協議明碼傳輸,要使用 HTTPS 協議傳輸。 ## 實現庫 ### php [php-jwt 封裝 JWT 加解密](../PHP/Composer/%E7%BD%91%E7%BB%9C/php-jwt.md)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看