<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>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                面對信息化時代,稍不注意就會脫軌,所以及時的補充知識才能讓我們與時俱進,今天給大家帶來的是關于token可以被竊取嗎和盜取token的一篇文章,相信會給你帶來較大的幫助! ## 11 | 登錄前端實現 前端任務點,編寫登錄請求函數,和 用戶注冊 類似,前端拿到用戶名和密碼發起 POST 請求。 收到 token 如何持久化存儲,如何讓每次請求都攜帶 token 是這里的點。 用戶登錄的接口詳情可以點 這里 。 這里有可以優化的點,未來可能需要添加驗證碼等附加信息,這個時候就需要添加函數參數,就會比較麻煩,可以將參數數據格式包裝成一個對象。當然,這里還是使用第一種方法了。 這不是重點,重點是登錄成功后,我們要做的事情。 按照接口約定,登錄成功我們可以得到如下信息: 這里我們要用到 token 字段,是我們現在有 token 了,但一刷新就沒了,所以我們要做一下持久化存儲,你想存哪里就存哪里,只要你能找到。這里就存儲 localStorage 中了,在 Chorme86 中你甚至可以存到一個本地的文本文件中,只不過讀取速度比較慢罷了。 除了 token,我們還要將用戶信息存下來,比如首頁展示用的用戶頭像等信息。 關于本地信息的安全性問題,本地保存的用戶信息并不作為數據請求的憑證,僅供展示使用,當用戶更改本地的用戶信息對于登錄的狀態不會有影響,因為后端的判斷依據是 token,token 有效就登錄成功,而不是說本地存儲的用戶信息是誰服務端就認為你是誰,前端是不可信的。這種登錄方式的危險點在于用戶 token 被盜,但這很難避免,最不安全的是人。。。 登錄成功,返回首頁,用戶名或者是用戶頭像并沒有同步更新,這是因為,這里是單頁應用,你在 login 頁面將登錄用戶信息存到 localStorage 中,然后跳轉到了首頁,此時頁面沒有刷新,而 localStorage 中的信息沒有及時更新到 DOM 中,此時的用戶信息還是你沒有進入 login 頁面的用戶信息,自然是無法展示的,怎么解決呢?很簡單,刷新一下。 當頁面刷新時,用戶信息會從 localStorage 中讀取,顯示的就是現在的登錄用戶了,但。。。 我不想刷新。 也很簡單,搞成響應式數據就好了呀。來人呀,上Vuex。 當你將 token 存在 cookie 中,前端并不需要主動設置,默認就攜帶傳給了服務端,而這里我們存到 Authorization 中,就需要我們設置一下,攔截請求,在請求發送前添加 token。 好的,來捋一捋流程。 用戶訪問 /login,被前端路由處理,指向Login.vue,用戶看到登錄框,填入自己的賬號,當用戶填寫賬號時,name password被實時監聽,同時會對登錄按鈕的可操作產生影響,只有當用戶將賬密輸入完整時,登錄按鈕可用。 前端收集用戶信息,調用 network 中封裝的 longin 請求函數,該請求發送前被攔截,添加 token,可能為空,使用賬密登錄時,token沒實際效用。 后端檢查成功給響應,前端將響應中數據的 token 通過觸發 mutations 更新 Vuex 中 state,同時,將該 token 存到 localStorage,以免用戶關掉頁面導致 token 丟失。 登錄成功跳到應用首頁,用戶頭像等信息通過 Vuex 獲取,因為 Vuex 中的數據是響應式的,此時從 login 跳轉到首頁,用戶頭像等信息也會得到相應的更新。 當用戶新增文章時,只需向服務器傳文章數據就可以了,而對于文章作者的相關信息則由后端從請求頭中的 token 解析得到,這里需要注意,前端不要將本地的用戶信息作為準確的作者信息,對于用戶可以偽造的信息要做最小化的信任,用戶完全有能力將本地用戶名從張三改為李四,而最終作者是那個則需要由用戶提供的 token 來判定,雖說 token 也有可能被偽造,但難度相對較大,往往是被竊取的可能性更大。 無密碼登錄其實還是需要“密碼”的,只不過是換了一個臨時性的對人不可讀的字符串來代替罷了,并且每次請求幫你填好了。 在不考慮安全性的情況下本質上其實就是你將密碼存到了瀏覽器里,然后你每次訪問網站時讓瀏覽器幫你輸入用戶名和密碼,這個過程你是無感知的,這樣自己就不用像個憨憨一樣每次刷新就要填一遍表單。 填表是一件非常無聊的事。 要學一波 TypeScript 了呀。 ![](https://www.bangqike.com//d/file/p/2022/11/9154429506333704236.jpeg) ## 鑒權必須了解的 5 個兄弟:cookie、session、token、jwt、單點登錄 本文你將看到: \*\*「前端存儲」\*\*這就涉及到一發、一存、一帶,發好辦,登陸接口直接返回給前端,存儲就需要前端想辦法了。 前端的存儲方式有很多。 有,cookie。cookie 也是前端存儲的一種,但相比于 localStorage 等其他方式,借助 HTTP 頭、瀏覽器能力,cookie 可以做到前端無感知。一般過程是這樣的: 「配置:Domain / Path」 cookie 是要限制::「空間范圍」::的,通過 Domain(域)/ Path(路徑)兩級。 「配置:Expires / Max-Age」 cookie 還可以限制::「時間范圍」::,通過 Expires、Max-Age 中的一種。 「配置:Secure / HttpOnly」 cookie 可以限制::「使用方式」::。 \*\*「HTTP 頭對 cookie 的讀寫」\*\*回過頭來,HTTP 是如何寫入和傳遞 cookie 及其配置的呢?HTTP 返回的一個 Set-Cookie 頭用于向瀏覽器寫入「一條(且只能是一條)」cookie,格式為 cookie 鍵值 配置鍵值。例如: 那我想一次多 set 幾個 cookie 怎么辦?多給幾個 Set-Cookie 頭(一次 HTTP 請求中允許重復) HTTP 請求的 Cookie 頭用于瀏覽器把符合當前「空間、時間、使用方式」配置的所有 cookie 一并發給服務端。因為由瀏覽器做了篩選判斷,就不需要歸還配置內容了,只要發送鍵值就可以。 \*\*「前端對 cookie 的讀寫」\*\*前端可以自己創建 cookie,如果服務端創建的 cookie 沒加HttpOnly,那恭喜你也可以修改他給的 cookie。調用document.cookie可以創建、修改 cookie,和 HTTP 一樣,一次document.cookie能且只能操作一個 cookie。 調用document.cookie也可以讀到 cookie,也和 HTTP 一樣,能讀到所有的非HttpOnly cookie。 現在回想下,你刷卡的時候發生了什么? 這種操作,在前后端鑒權系統中,叫 session。典型的 session 登陸/驗證流程: \*\*「Session 的存儲方式」\*\*顯然,服務端只是給 cookie 一個 sessionId,而 session 的具體內容(可能包含用戶信息、session 狀態等),要自己存一下。存儲的方式有幾種: 「Session 的過期和銷毀」\*\*很簡單,只要把存儲的 session 數據銷毀就可以。\*\*\*\*「Session 的分布式問題」\*\*通常服務端是集群,而用戶請求過來會走一次負載均衡,不一定打到哪臺機器上。那一旦用戶后續接口請求到的機器和他登錄請求的機器不一致,或者登錄請求的機器宕機了,session 不就失效了嗎?這個問題現在有幾種解決方式。 但通常還是采用第一種方式,因為第二種相當于閹割了負載均衡,且仍沒有解決「用戶請求的機器宕機」的問題。\*\*「node.js 下的 session 處理」\*\*前面的圖很清楚了,服務端要實現對 cookie 和 session 的存取,實現起來要做的事還是很多的。在npm中,已經有封裝好的中間件,比如 express-session - npm,用法就不貼了。這是它種的 cookie: express-session - npm 主要實現了: session 的維護給服務端造成很大困擾,我們必須找地方存放它,又要考慮分布式的問題,甚至要單獨為了它啟用一套 Redis 集群。有沒有更好的辦法? 回過頭來想想,一個登錄場景,也不必往 session 存太多東西,那為什么不直接打包到 cookie 中呢?這樣服務端不用存了,每次只要核驗 cookie 帶的「證件」有效性就可以了,也可以攜帶一些輕量的信息。這種方式通常被叫做 token。 token 的流程是這樣的: \*\*「客戶端 token 的存儲方式」 在前面 cookie 說過,cookie 并不是客戶端存儲憑證的唯一方式。token 因為它的「無狀態性」,有效期、使用限制都包在 token 內容里,對 cookie 的管理能力依賴較小,客戶端存起來就顯得更自由。但 web 應用的主流方式仍是放在 cookie 里,畢竟少操心。 「token 的過期」\*\*那我們如何控制 token 的有效期呢?很簡單,把「過期時間」和數據一起塞進去,驗證時判斷就好。 編碼的方式豐儉由人。\*\*「base64」\*\*比如 node 端的 cookie-session - npm 庫 默認配置下,當我給他一個 userid,他會存成這樣: 這里的 eyJ1c2VyaWQiOiJhIn0=,就是 {"userid":"abb”} 的 base64 而已。 「防篡改」 是的。所以看情況,如果 token 涉及到敏感權限,就要想辦法避免 token 被篡改。解決方案就是給 token 加簽名,來識別 token 是否被篡改過。例如在 cookie-session - npm 庫中,增加兩項配置: 這樣會多種一個 .sig cookie,里面的值就是 {"userid":"abb”} 和 iAmSecret通過加密算法計算出來的,常見的比如HMACSHA256 類 (System.Security.Cryptography) | Microsoft Docs。 好了,現在 cdd 雖然能偽造出eyJ1c2VyaWQiOiJhIn0=,但偽造不出 sig 的內容,因為他不知道 secret。\*\*「JWT」\*\*但上面的做法額外增加了 cookie 數量,數據本身也沒有規范的格式,所以 JSON Web Token Introduction - jwt.io 橫空出世了。 它是一種成熟的 token 字符串生成方案,包含了我們前面提到的數據、簽名。不如直接看一下一個 JWT token 長什么樣: 這串東西是怎么生成的呢?看圖: 類型、加密算法的選項,以及 JWT 標準數據字段,可以參考 RFC 7519 - JSON Web Token (JWT)node 上同樣有相關的庫實現:express-jwt - npm koa-jwt - npm token,作為權限守護者,最重要的就是「安全」。業務接口用來鑒權的 token,我們稱之為 access token。越是權限敏感的業務,我們越希望 access token 有效期足夠短,以避免被盜用。但過短的有效期會造成 access token 經常過期,過期后怎么辦呢?一種辦法是,讓用戶重新登錄獲取新 token,顯然不夠友好,要知道有的 access token 過期時間可能只有幾分鐘。另外一種辦法是,再來一個 token,一個專門生成 access token 的 token,我們稱為 refresh token。 有了 refresh token 后,幾種情況的請求流程變成這樣: 如果 refresh token 也過期了,就只能重新登錄了。 session 和 token 都是邊界很模糊的概念,就像前面說的,refresh token 也可能以 session 的形式組織維護。狹義上,我們通常認為 session 是「種在 cookie 上、數據存在服務端」的認證方案,token 是「客戶端存哪都行、數據存在 token 里」的認證方案。對 session 和 token 的對比本質上是「客戶端存 cookie / 存別地兒」、「服務端存數據 / 不存數據」的對比。\*\*「客戶端存 cookie / 存別地兒」\*\*存 cookie 固然方便不操心,但問題也很明顯: 存別的地方,可以解決沒有 cookie 的場景;通過參數等方式手動帶,可以避免 CSRF 攻擊。 「服務端存數據 / 不存數據」 前面我們已經知道了,在同域下的客戶端/服務端認證系統中,通過客戶端攜帶憑證,維持一段時間內的登錄狀態。但當我們業務線越來越多,就會有更多業務系統分散到不同域名下,就需要「一次登錄,全線通用」的能力,叫做「單點登錄」。 簡單的,如果業務系統都在同一主域名下,比如wenku.baidu.com tieba.baidu.com,就好辦了。可以直接把 cookie domain 設置為主域名 baidu.com,百度也就是這么干的。 比如滴滴這么潮的公司,同時擁有didichuxing.com xiaojukeji.com didiglobal.com等域名,種 cookie 是完全繞不開的。這要能實現「一次登錄,全線通用」,才是真正的單點登錄。這種場景下,我們需要獨立的認證服務,通常被稱為 SSO。 「一次「從 A 系統引發登錄,到 B 系統不用登錄」的完整流程」 \*\*「完整版本:考慮瀏覽器的場景」\*\*上面的過程看起來沒問題,實際上很多[](https://www.bangqike.com/caijing/130385.html)[app](https://www.bangqike.com/caijing/130385.html)等端上這樣就夠了。但在瀏覽器下不見得好用。看這里: 對瀏覽器來說,SSO 域下返回的數據要怎么存,才能在訪問 A 的時候帶上?瀏覽器對跨域有嚴格限制,cookie、localStorage 等方式都是有域限制的。這就需要也只能由 A 提供 A 域下存儲憑證的能力。一般我們是這么做的: 圖中我們通過顏色把瀏覽器當前所處的域名標記出來。注意圖中灰底文字說明部分的變化。 謝謝大家哦 ## [](https://www.bangqike.com/caijing/130385.html)[app](https://www.bangqike.com/caijing/130385.html)怎樣防止token被盜取? token是個憑條,不過它比門票溫柔多了,門票丟了重新花錢買,token丟了重新操作下認證一個就可以了,因此token丟失的代價是可以忍受的——前提是你別丟太頻繁,要是讓用戶隔三差五就認證一次那就損失用戶體驗了。 客戶端方面這個除非你有一個非常安全的辦法,比如操作系統提供的隱私數據存儲,那token肯定會存在泄露的問題。比如我拿到你的手機,把你的token拷出來,在過期之前就都可以以你的身份在別的地方登錄。 解決這個問題的一個簡單辦法 1、在存儲的時候把token進行對稱加密存儲,用時解開。 2、將請求URL、時間戳、token三者進行合并加鹽簽名,服務端校驗有效性。 這兩種辦法的出發點都是:竊取你存儲的數據較為容易,而反匯編你的程序hack你的加密解密和簽名算法是比較難的。然而其實說難也不難,所以終究是防君子不防小人的做法。話說加密存儲一個你要是被人扒開客戶端看也不會被噴明文存儲…… 方法1它拿到存儲的密文解不開、方法2它不知道你的簽名算法和鹽,兩者可以結合食用。 但是如果token被人拷走,他自然也能植入到自己的手機里面,那到時候他的手機也可以以你的身份來用著,這你就瞎了。 于是可以提供一個讓用戶可以主動expire一個過去的token類似的機制,在被盜的時候能遠程止損。 話說一個人連自己手機都保護不好還談什么安全…… 在網絡層面上token明文傳輸的話會非常的危險,所以建議一定要使用HTTPS,并且把token放在post body里。 ## JWT-token—前后端分離架構的api安全問題 前后端分離架構帶來的好處一搜一大堆,我們來看一下分離后后端接口的安全問題。 前后端分離架構現狀: 這樣的情況后端api是暴露在外網中,因為常規的web項目無論如何前端都是要通過公網訪問到后臺api的,帶來的隱患也有很多。 1.接口公開,誰都可以訪問 2.數據請求的參數在傳輸過程被篡改 3.接口被重復調用 ... session和cookie都是客戶端與服務端通訊需要提供的認證,當客戶端的值和服務器的值吻合時,才允許請求api,解決了第1個問題,但是當攻擊者獲取到了傳輸過程中的session或者cookie值后,就可以進行第2、3種攻擊了 JWT標準的token包含三部分: 頭部用于描述關于該JWT的最基本的信息,例如其類型以及簽名所用的算法等 將上面的JSON對象進行 \[base64編碼\] 可以得到下面的字符串。這個字符串我們將它稱作JWT的Header Payload也是一個JSON對象。包含了一些其他的信息 這里面的前五個字段都是由JWT的標準所定義的。 將上面的JSON對象進行 \[base64編碼\] 可以得到下面的字符串。這個字符串我們將它稱作JWT的Payload 將上面的兩個編碼后的字符串都用句號 . 連接在一起(頭部在前),就形成了 最后,我們將上面拼接完的字符串用 HS256算法 進行加密。在加密的時候,我們還需要提供一個 密鑰(secret) 。如果我們用 mystar 作為密鑰的話,那么就可以得到我們加密后的內容 這一部分叫做 簽名 最后將這一部分簽名也拼接在被簽名的字符串后面,我們就得到了完整的JWT 簽名解決了數據傳輸過程中參數被篡改的風險 一般而言,加密算法對于不同的輸入產生的輸出總是不一樣的,如果有人 對Header以及Payload的內容解碼之后進行修改,再進行編碼的話,那么新的頭部和載荷的簽名和之前的簽名就將是不一樣的。 而且,如果不知道服務器加密的時候用的密鑰的話,得出來的簽名也一定會是不一樣的。 解決了篡改數據的問題,還有第3個問題,那就是攻擊者不修改數據,只是重復攻擊 比如在瀏覽器端通過用戶名/密碼驗證獲得簽名的Token被木馬竊取。即使用戶登出了系統,黑客還是可以利用竊取的Token模擬正常請求,而服務器端對此完全不知道, 因為JWT機制是無狀態的。 可以在Payload里增加時間戳并且前后端都參與來解決: ## php中的token怎么用 token一般理解為通行證,經過各種算法處理的唯一加密的字符串 比如用戶登錄,你只需cookie記錄用戶uid 和 token token沒有超時的話,不用驗證密碼直接登錄 這樣也能保證用戶信息、密碼不被cookie竊取 token可以被竊取嗎的介紹就聊到這里吧,感謝你花時間閱讀本站內容,更多關于盜取token、token可以被竊取嗎的信息別忘了在本站進行查找喔。
                  <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>

                              哎呀哎呀视频在线观看