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

有狀態與無狀態身份驗證

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

無狀態和有狀態架構

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

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

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

無狀態認證

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

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

無狀態認證 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]刪除
最新教學 更多>
  • 什麼時候手動呼叫析構函數是合法的做法?
    什麼時候手動呼叫析構函數是合法的做法?
    何時手動呼叫析構函數是合理的? 手動調用析構函數表明存在缺陷的設計這一概念經常被斷言。然而,這引出了一個問題:這條規則有例外嗎? 反例:需要手動析構函數呼叫的情況確實,在某些情況下有必要這樣做明確調用析構函數:1.受控記憶體釋放:當記憶體分配和釋放獨立於物件建構和銷毀進行管理時,手動析構函式呼叫變得...
    程式設計 發佈於2024-11-17
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-11-17
  • 為什麼我在 Django 資料庫查詢中收到「InterfaceError (0, \'\')\」?
    為什麼我在 Django 資料庫查詢中收到「InterfaceError (0, \'\')\」?
    在Django 查詢執行中遇到InterfaceError (0, '')Django 使用者可能會遇到持久的「InterfaceError (0 , '')” " 嘗試資料庫操作時出錯,特別是在伺服器重新啟動後。遊標,顧名思義,是與資料庫的持久連接,在多個...
    程式設計 發佈於2024-11-17
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2024-11-17
  • 使用 Go Module 部署 Go Cloud Functions 時如何解決「Build failed: go: parsing /models/go.mod: open /models/go.mod: no such file or directory\」錯誤?
    使用 Go Module 部署 Go Cloud Functions 時如何解決「Build failed: go: parsing /models/go.mod: open /models/go.mod: no such file or directory\」錯誤?
    使用Go 模組部署Google Cloud Function 錯誤嘗試使用Go 模組在Go 1.11 中部署Google Cloud Function 時,開發者可能會遇到錯誤,「建置失敗:go:解析/models/go.mod:開啟/models/go.mod:沒有這樣的檔案或目錄。」Go模組結構...
    程式設計 發佈於2024-11-17
  • 為什麼我的 Golang `exec.Command` 回傳「退出狀態 1」?
    為什麼我的 Golang `exec.Command` 回傳「退出狀態 1」?
    如何找出Golang的exec.Command中出現「Exit Status 1」錯誤的原因在Golang中執行exec.Command方法時,收到「退出狀態1」錯誤可能會非常模糊。缺乏特定資訊會阻礙有效的調試。 要檢索更詳細的信息,請利用 Command 物件的 Stderr 屬性。這是透過以下方...
    程式設計 發佈於2024-11-17
  • 如何使用「setState」更新狀態中的巢狀物件?
    如何使用「setState」更新狀態中的巢狀物件?
    使用setState 更新state.item[1] 在這種情況下,您正在嘗試更新物件內的物件使用setState 在在您的狀態中。若要正確更新狀態,您需要複製整個狀態對象,修改副本,然後將狀態設定為更新後的副本。 以下是如何更新 state.item[1] 使用setState:// 1. Mak...
    程式設計 發佈於2024-11-17
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-11-17
  • 將 PHP 連接到資料庫:MySQL 初學者
    將 PHP 連接到資料庫:MySQL 初學者
    在PHP 中連接到MySQL 資料庫至關重要,步驟如下:安裝MySQL 擴充功能使用mysqli_connect() 函數建立連接,參數包括主機、使用者名稱、密碼和資料庫名稱使用mysqli_connect_error() 函數檢查連接是否成功實戰案例:取得所有用戶,透過查詢資料庫並使用mysqli...
    程式設計 發佈於2024-11-17
  • 為什麼 CSS `visibility:hidden` 無法達到懸停效果?
    為什麼 CSS `visibility:hidden` 無法達到懸停效果?
    揭開謎團:為什麼CSS 可見性在懸停時失敗CSS 可見性提供了操作元素可見性的便捷方法,但有時它會偶然發現意想不到的障礙。考慮這樣一個場景,您定義了一個「擾流器」類別來使文字最初不可見,並在滑鼠懸停時顯示它。儘管您有期望,文字仍然頑固地保持在隱藏狀態,無視您的懸停努力。 深入探討原因這種令人困惑的行...
    程式設計 發佈於2024-11-17
  • 何時在 JavaScript 中使用 parseInt() 和 Number() 進行字串到數字的轉換?
    何時在 JavaScript 中使用 parseInt() 和 Number() 進行字串到數字的轉換?
    使用parseInt()和Number()將字串轉換為數字在JavaScript中將字串轉換為數字時,兩個常用的函數是parseInt () 和數字()。雖然它們都具有相同的數值轉換目的,但它們的方法和行為有所不同。 parseInt()parseInt() 執行更具體的任務,稱為解析。它嘗試從字串...
    程式設計 發佈於2024-11-17
  • 項目 避免不必要地使用檢查異常
    項目 避免不必要地使用檢查異常
    檢查異常是 Java 中的一個強大工具,因為它們迫使程式設計師處理異常情況,從而提高程式碼可靠性。然而,過度使用可能會導致 API 難以使用。為了證明檢查異常是合理的,情況必須是真正的異常並且程式設計師能夠採取有用的操作。否則,未經檢查的異常可能更合適。 Java 8 為檢查異常的使用帶來了額外的...
    程式設計 發佈於2024-11-17
  • 為什麼我的 PDO 更新查詢無法修改 MySQL 中的特定行?
    為什麼我的 PDO 更新查詢無法修改 MySQL 中的特定行?
    使用PDO 進行MySQL 更新查詢當嘗試使用PDO 和MySQL 更新資料庫行時,您可能會遇到這樣的情況:您的程式碼執行失敗。本指南探討了此錯誤的可能原因並提供了解決方案。 錯誤:不正確的 UPDATE 語法您遇到的錯誤源自於不正確的 UPDATE 語法。具體來說,您的查詢正在嘗試用提供的值替換 ...
    程式設計 發佈於2024-11-17
  • 資料庫遷移對於 Golang 服務,為什麼重要?
    資料庫遷移對於 Golang 服務,為什麼重要?
    DB Migration, why it matters? Have you ever faced the situations when you deploy new update on production with updated database schemas, but ...
    程式設計 發佈於2024-11-17
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-11-17

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

Copyright© 2022 湘ICP备2022001581号-3