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

有狀態與無狀態身份驗證

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

無狀態和有狀態架構

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

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

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

無狀態認證

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

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

無狀態認證 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]刪除
最新教學 更多>
  • 為什麼Microsoft Visual C ++無法正確實現兩台模板的實例?
    為什麼Microsoft Visual C ++無法正確實現兩台模板的實例?
    在Microsoft Visual C 中,Microsoft consions用戶strate strate strate strate strate strate strate strate strate strate strate strate strate strate strate st...
    程式設計 發佈於2025-05-28
  • Java中Lambda表達式為何需要“final”或“有效final”變量?
    Java中Lambda表達式為何需要“final”或“有效final”變量?
    Lambda Expressions Require "Final" or "Effectively Final" VariablesThe error message "Variable used in lambda expression shou...
    程式設計 發佈於2025-05-28
  • Java是否允許多種返回類型:仔細研究通用方法?
    Java是否允許多種返回類型:仔細研究通用方法?
    在Java中的多個返回類型:一種誤解類型:在Java編程中揭示,在Java編程中,Peculiar方法簽名可能會出現,可能會出現,使開發人員陷入困境,使開發人員陷入困境。 getResult(string s); ,其中foo是自定義類。該方法聲明似乎擁有兩種返回類型:列表和E。但這確實是如此嗎...
    程式設計 發佈於2025-05-28
  • 為什麼使用Firefox後退按鈕時JavaScript執行停止?
    為什麼使用Firefox後退按鈕時JavaScript執行停止?
    導航歷史記錄問題:JavaScript使用Firefox Back Back 此行為是由瀏覽器緩存JavaScript資源引起的。要解決此問題並確保在後續頁面訪問中執行腳本,Firefox用戶應設置一個空功能。 警報'); }; alert('inline Alert')...
    程式設計 發佈於2025-05-28
  • Java開發者如何保護數據庫憑證免受反編譯?
    Java開發者如何保護數據庫憑證免受反編譯?
    在java 在單獨的配置文件保護數據庫憑證的最有效方法中存儲憑據是將它們存儲在單獨的配置文件中。該文件可以在運行時加載,從而使登錄數據從編譯的二進製文件中遠離。 使用prevereness class import java.util.prefs.preferences; 公共類示例{ 首選...
    程式設計 發佈於2025-05-28
  • 如何在Java字符串中有效替換多個子字符串?
    如何在Java字符串中有效替換多個子字符串?
    在java 中有效地替換多個substring,需要在需要替換一個字符串中的多個substring的情況下,很容易求助於重複應用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    程式設計 發佈於2025-05-28
  • C++成員函數指針正確傳遞方法
    C++成員函數指針正確傳遞方法
    如何將成員函數置於c [&& && && && && && && && && && &&&&&&&&&&&&&&&&&&&&&&&華儀的函數時,在接受成員函數指針的函數時,要在函數上既要提供指針又可以提供指針和指針到函數的函數。需要具有一定簽名的功能指針。要通過成員函數,您需要同時提供對象指針(此...
    程式設計 發佈於2025-05-28
  • 如何使用PHP將斑點(圖像)正確插入MySQL?
    如何使用PHP將斑點(圖像)正確插入MySQL?
    essue VALUES('$this->image_id','file_get_contents($tmp_image)')";This code builds a string in PHP, but the function call fil...
    程式設計 發佈於2025-05-28
  • 如何使用Depimal.parse()中的指數表示法中的數字?
    如何使用Depimal.parse()中的指數表示法中的數字?
    在嘗試使用Decimal.parse(“ 1.2345e-02”中的指數符號表示法表示的字符串時,您可能會遇到錯誤。這是因為默認解析方法無法識別指數符號。 成功解析這樣的字符串,您需要明確指定它代表浮點數。您可以使用numbersTyles.Float樣式進行此操作,如下所示:[&& && && ...
    程式設計 發佈於2025-05-28
  • 您如何在Laravel Blade模板中定義變量?
    您如何在Laravel Blade模板中定義變量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配變量對於存儲以後使用的數據至關重要。在使用“ {{}}”分配變量的同時,它可能並不總是最優雅的解決方案。 幸運的是,Blade通過@php Directive提供了更優雅的方法: $ old_section =...
    程式設計 發佈於2025-05-28
  • 如何為PostgreSQL中的每個唯一標識符有效地檢索最後一行?
    如何為PostgreSQL中的每個唯一標識符有效地檢索最後一行?
    postgresql:為每個唯一標識符提取最後一行,在Postgresql中,您可能需要遇到與在數據庫中的每個不同標識相關的信息中提取信息的情況。考慮以下數據:[ 1 2014-02-01 kjkj 在數據集中的每個唯一ID中檢索最後一行的信息,您可以在操作員上使用Postgres的有效效率: ...
    程式設計 發佈於2025-05-28
  • 在C#中如何高效重複字符串字符用於縮進?
    在C#中如何高效重複字符串字符用於縮進?
    在基於項目的深度下固定字符串時,重複一個字符串以進行凹痕,很方便有效地有一種有效的方法來返回字符串重複指定的次數的字符串。使用指定的次數。 constructor 這將返回字符串“ -----”。 字符串凹痕= new String(' - ',depth); console.W...
    程式設計 發佈於2025-05-28
  • 人臉檢測失敗原因及解決方案:Error -215
    人臉檢測失敗原因及解決方案:Error -215
    錯誤處理:解決“ error:( - 215)!empty()in Function openCv in Function MultSiscale中的“檢測”中的錯誤:在功能檢測中。”當Face Cascade分類器(即面部檢測至關重要的組件)未正確加載時,通常會出現此錯誤。 要解決此問題,必...
    程式設計 發佈於2025-05-28
  • 在JavaScript中如何並發運行異步操作並正確處理錯誤?
    在JavaScript中如何並發運行異步操作並正確處理錯誤?
    同意操作execution 在執行asynchronous操作時,相關的代碼段落會遇到一個問題,當執行asynchronous操作:此實現在啟動下一個操作之前依次等待每個操作的完成。要啟用並發執行,需要進行修改的方法。 第一個解決方案試圖通過獲得每個操作的承諾來解決此問題,然後單獨等待它們: c...
    程式設計 發佈於2025-05-28
  • 如何使用不同數量列的聯合數據庫表?
    如何使用不同數量列的聯合數據庫表?
    合併列數不同的表 當嘗試合併列數不同的數據庫表時,可能會遇到挑戰。一種直接的方法是在列數較少的表中,為缺失的列追加空值。 例如,考慮兩個表,表 A 和表 B,其中表 A 的列數多於表 B。為了合併這些表,同時處理表 B 中缺失的列,請按照以下步驟操作: 確定表 B 中缺失的列,並將它們添加到表的...
    程式設計 發佈於2025-05-28

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

Copyright© 2022 湘ICP备2022001581号-3