」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 有狀態與無狀態身份驗證

有狀態與無狀態身份驗證

發佈於2024-11-04
瀏覽:167

無狀態和有狀態架構

指的是應用程式的狀態,即給定時間的條件品質。在無狀態身份驗證中,不儲存會話或用戶,僅包含靜態內容。這與有狀態不同,有狀態是動態內容

無狀態處理程序是一種孤立的資源,它不引用任何其他服務或與另一個系統的交互作用。它僅在代碼的該部分中運行,不會從舊事務中引入信息,因為無狀態身份驗證不存儲此類數據;每個操作都是從頭開始完成

狀態驗證允許資訊多次使用,並基於先前事務的上下文執行。因此,在需要等待回應或預先存在的資料的應用程式中,無論是否存在於另一個系統或資料庫中,都使用有狀態。

無狀態認證

無狀態驗證包含一種策略,在該策略中,使用者在提供憑證後會收到存取權杖作為回應。此令牌已包含識別產生它的使用者所需的所有信息,而無需不斷查詢頒發令牌的服務或資料庫。

此令牌儲存在客戶端(瀏覽器),因此伺服器只能透過確認有效負載和簽章匹配來檢查令牌的有效性。

無狀態認證 JWT

JSON Web Token (JWT) 是具有RFC-7519 中建立的標準​​的密鑰,包含聲明形式的實體,這些實體是獨立的,無需調用伺服器重新驗證令牌。

是使用密鑰以base64標準編碼的字串,如範例所示:

Autenticação Stateful x Stateless

優點和缺點

優點:

  • 伺服器記憶體消耗低。
  • 在可擴展性方面非常出色。
  • 非常適合分散式應用程序,例如 API 和微服務。
  • 在獨立的應用程式中產生和分發令牌,不依賴第三方。
  • 輕鬆解釋和驗證代幣用戶資料。

缺點:

  • 存取控制困難。
  • 無法隨時輕易撤銷令牌。
  • 如果有人有權存取令牌,它可以促進惡意第三方的進入。
  • 在令牌過期之前,會話無法變更。
  • JWT 令牌更加複雜,在中心化應用程式(例如整體式應用程式)中可能變得不必要。

狀態認證

常用於各種應用程序,尤其是那些不需要太多可擴展性的應用程序,有狀態會話在應用程序的後端中創建,並將會話引用發送回相應的用戶。每次使用者發出請求時,應用程式的一部分都會產生令牌。從那時起,對於每個新請求,該令牌將再次發送到應用程式以重新驗證存取權限。在這個模型中,如果使用者資料發生任何變化,令牌可以很容易地被撤銷。

這些是不透明的存取令牌,即專有格式的簡單字串,不包含與該令牌相關的任何識別碼或使用者資料。接收者需要呼叫創建令牌的伺服器來驗證它。

範例代幣:8c90e55a-e867-45d5-9e42-8fcbd9c30a74

此 ID 必須與擁有該令牌的使用者一起儲存在資料庫中。

優點和缺點

優點:

  • 集中實作邏輯。
  • 簡化存取管理和控制。
  • 非常適合單體應用、MVC 應用程式和內部流程。
  • 更安全地抵禦惡意第三方。

缺點:

  • 負責驗證令牌的 API 中可能存在過載。
  • 可擴展性方面失敗。
  • 在微服務之間分配身份驗證的難度更高。
  • 在分散式應用程式中,如果身分驗證服務失敗,則所有其他服務將變得不可用。
  • 更高的實施複雜性。
  • 與第三方系統整合難度較高。

何時使用每種方法?

何時使用 JWT 令牌和無狀態身份驗證

  • 當需要更高的效能而不用擔心 API 過載時。
  • 當服務之間分佈有多個通訊時。
  • 當需要識別哪個使用者在不同服務中的系統中執行操作時。
  • 當不打算保留用戶的資料時,僅保留他們的初始註冊。
  • 如果需要產生對服務的外部存取。
  • 如果有必要在對系統影響最小的情況下操縱執行特定操作的人員的資料。

何時使用不透明令牌和狀態身份驗證

  • 如果需要對系統使用者進行完全存取控制,主要是定義存取層次結構。
  • 在集中式應用程式中,沒有分散式服務,也沒有與外部服務通訊。

最終考慮因素:

  • 在某些地方,例如“API 壓力”,為了清楚起見,該術語可能會替換為“API 開銷”。
  • 如果目標受眾需要更多上下文,「JWT 令牌」部分可以包含對 RFC-7519 中提到的「聲明」內容的更詳細解釋。
  • 在狀態身份驗證部分中,可以透過解釋應用程式的哪個特定部分負責這一點來澄清「應用程式的一部分將產生令牌」這一短語。
版本聲明 本文轉載於:https://dev.to/oleobarreto/autenticacao-stateful-x-stateless-e8i?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何克服PHP的功能重新定義限制?
    如何克服PHP的功能重新定義限制?
    克服PHP的函數重新定義限制在PHP中,多次定義一個相同名稱的函數是一個no-no。嘗試這樣做,如提供的代碼段所示,將導致可怕的“不能重新列出”錯誤。 但是,PHP工具腰帶中有一個隱藏的寶石:runkit擴展。它使您能夠靈活地重新定義函數。 runkit_function_renction_...
    程式設計 發佈於2025-04-06
  • 找到最大計數時,如何解決mySQL中的“組函數\”錯誤的“無效使用”?
    找到最大計數時,如何解決mySQL中的“組函數\”錯誤的“無效使用”?
    如何在mySQL中使用mySql 檢索最大計數,您可能會遇到一個問題,您可能會在嘗試使用以下命令:理解錯誤正確找到由名稱列分組的值的最大計數,請使用以下修改後的查詢: 計數(*)為c 來自EMP1 按名稱組 c desc訂購 限制1 查詢說明 select語句提取名稱列和每個名稱...
    程式設計 發佈於2025-04-06
  • 如何正確使用與PDO參數的查詢一樣?
    如何正確使用與PDO參數的查詢一樣?
    在pdo 中使用類似QUERIES在PDO中的Queries時,您可能會遇到類似疑問中描述的問題:此查詢也可能不會返回結果,即使$ var1和$ var2包含有效的搜索詞。錯誤在於不正確包含%符號。 通過將變量包含在$ params數組中的%符號中,您確保將%字符正確替換到查詢中。沒有此修改,PD...
    程式設計 發佈於2025-04-06
  • 大批
    大批
    [2 數組是對象,因此它們在JS中也具有方法。 切片(開始):在新數組中提取部分數組,而無需突變原始數組。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    程式設計 發佈於2025-04-06
  • 如何從PHP中的數組中提取隨機元素?
    如何從PHP中的數組中提取隨機元素?
    從陣列中的隨機選擇,可以輕鬆從數組中獲取隨機項目。考慮以下數組:; 從此數組中檢索一個隨機項目,利用array_rand( array_rand()函數從數組返回一個隨機鍵。通過將$項目數組索引使用此鍵,我們可以從數組中訪問一個隨機元素。這種方法為選擇隨機項目提供了一種直接且可靠的方法。
    程式設計 發佈於2025-04-06
  • 為什麼我的CSS背景圖像出現?
    為什麼我的CSS背景圖像出現?
    故障排除:CSS背景圖像未出現 ,您的背景圖像儘管遵循教程說明,但您的背景圖像仍未加載。圖像和样式表位於相同的目錄中,但背景仍然是空白的白色帆布。 而不是不棄用的,您已經使用了CSS樣式: bockent {背景:封閉圖像文件名:背景圖:url(nickcage.jpg); 如果您的html,cs...
    程式設計 發佈於2025-04-06
  • 如何使用不同數量列的聯合數據庫表?
    如何使用不同數量列的聯合數據庫表?
    合併列數不同的表 當嘗試合併列數不同的數據庫表時,可能會遇到挑戰。一種直接的方法是在列數較少的表中,為缺失的列追加空值。 例如,考慮兩個表,表 A 和表 B,其中表 A 的列數多於表 B。為了合併這些表,同時處理表 B 中缺失的列,請按照以下步驟操作: 確定表 B 中缺失的列,並將它們添加到表的...
    程式設計 發佈於2025-04-06
  • 為什麼使用固定定位時,為什麼具有100%網格板柱的網格超越身體?
    為什麼使用固定定位時,為什麼具有100%網格板柱的網格超越身體?
    網格超過身體,用100%grid-template-columns 為什麼在grid-template-colms中具有100%的顯示器,當位置設置為設置的位置時,grid-template-colly修復了? 問題: 考慮以下CSS和html: class =“ snippet-code”> ...
    程式設計 發佈於2025-04-06
  • 如何處理PHP文件系統功能中的UTF-8文件名?
    如何處理PHP文件系統功能中的UTF-8文件名?
    在PHP的Filesystem functions中處理UTF-8 FileNames 在使用PHP的MKDIR函數中含有UTF-8字符的文件很多flusf-8字符時,您可能會在Windows Explorer中遇到comploreer grounder grounder grounder gro...
    程式設計 發佈於2025-04-06
  • 如何在其容器中為DIV創建平滑的左右CSS動畫?
    如何在其容器中為DIV創建平滑的左右CSS動畫?
    通用CSS動畫,用於左右運動 ,我們將探索創建一個通用的CSS動畫,以向左和右移動DIV,從而到達其容器的邊緣。該動畫可以應用於具有絕對定位的任何div,無論其未知長度如何。 問題:使用左直接導致瞬時消失 更加流暢的解決方案:混合轉換和左 [並實現平穩的,線性的運動,我們介紹了線性的轉換。...
    程式設計 發佈於2025-04-06
  • 如何修復\“常規錯誤:2006 MySQL Server在插入數據時已經消失\”?
    如何修復\“常規錯誤:2006 MySQL Server在插入數據時已經消失\”?
    How to Resolve "General error: 2006 MySQL server has gone away" While Inserting RecordsIntroduction:Inserting data into a MySQL database can...
    程式設計 發佈於2025-04-06
  • 為什麼Microsoft Visual C ++無法正確實現兩台模板的實例?
    為什麼Microsoft Visual C ++無法正確實現兩台模板的實例?
    The Mystery of "Broken" Two-Phase Template Instantiation in Microsoft Visual C Problem Statement:Users commonly express concerns that Micro...
    程式設計 發佈於2025-04-06
  • 如何使用PHP從XML文件中有效地檢索屬性值?
    如何使用PHP從XML文件中有效地檢索屬性值?
    從php PHP陷入困境。 使用simplexmlelement :: attributes()函數提供了簡單的解決方案。此函數可訪問對XML元素作為關聯數組的屬性: - > attributes()為$ attributeName => $ attributeValue){ echo...
    程式設計 發佈於2025-04-06
  • 如何有效地轉換PHP中的時區?
    如何有效地轉換PHP中的時區?
    在PHP 利用dateTime對象和functions DateTime對象及其相應的功能別名為時區轉換提供方便的方法。例如: //定義用戶的時區 date_default_timezone_set('歐洲/倫敦'); //創建DateTime對象 $ dateTime = ne...
    程式設計 發佈於2025-04-06
  • 為什麼PHP的DateTime :: Modify('+1個月')會產生意外的結果?
    為什麼PHP的DateTime :: Modify('+1個月')會產生意外的結果?
    使用php dateTime修改月份:發現預期的行為在使用PHP的DateTime類時,添加或減去幾個月可能並不總是會產生預期的結果。正如文檔所警告的那樣,“當心”這些操作的“不像看起來那樣直觀。 考慮文檔中給出的示例:這是內部發生的事情: 現在在3月3日添加另一個月,因為2月在2001年只有2...
    程式設計 發佈於2025-04-06

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3