HTTP 狀態碼 401 還是 403?身份驗證和授權錯誤的差異
401 未授權表示客戶端尚未進行身份驗證,需要有效的憑證。403 禁止訪問表示客戶端已進行身份驗證,但缺乏訪問資源所需的權限。
每次你加載網頁、進行付款或登錄應用程式時,設備和伺服器之間都會發生一場無形的對話。這就像發送一條信息並等待回覆——有時是一個豎起大拇指的讚,有時是禮貌地“再試一次”,偶爾則是直接的“拒絕”。這些回應被稱為 HTTP 狀態碼,是互聯網上的無名英雄,默默地引導著通信的流向,確保一切順利運行——至少讓你知道何時出現問題。
什麼是 HTTP 狀態碼
HTTP 狀態碼就像客戶端(如瀏覽器或應用程式)與伺服器之間對話的信號。它們提供了關於請求發生情況的迅速而清晰的更新——無論是一切順利,還是有所偏差,或者需要額外的行動。我們可以把它想像成參觀一家運營良好的麵包店:
200:一切完美
你要求一個可頌麵包,麵包師微笑著把它遞給你,並說:“拿去吧!”這就是 HTTP 200 OK——請求成功,一切按預期運行。
200 OK HTTP 狀態碼是最常用的代碼之一,表示從客戶端發出的請求已被伺服器成功接收、理解並處理。
301:我們搬家了
你到達你最喜歡的麵包店,但有個標誌上 寫著,“我們已搬到新街 123 號。”這是 301 永久移動。伺服器告訴你的瀏覽器自動前往新地址。
301 永久移動 HTTP 狀態碼表示請求的資源已永久移動到新 URL。此狀態碼告知客戶端(例如,瀏覽器或 API 客戶端)更新其記錄並在未來的請求中使用新 URL。
404:抱歉,不在這裡
你要求一個巧克力烤餅,麵包師說:“我們這裡不做那種東西。”這就是 404 找不到——你尋找的資源在伺服器上不存在。
404 找不到 HTTP 狀態碼表示伺服器無法找到請求的資源。這個回應意味著客戶端的請求是有效的,但伺服器無法定位所請求的資源。
401:你是誰?
你想進入貴賓休息室,但保鏢攔住你,並說,“你需要出示會員卡。”這就是 401 未授權——需要進行身份驗證才能訪問資源。
401 未授權 HTTP 狀態碼表示客戶端的請求未被應用,因為它缺乏有效的身份驗證憑證。伺服器要求客戶端進行身份驗證以訪問請求的資源。
403:不適合你
你出示會員卡,但保鏢說,“只有白金會員才能進入。”這就是 403 禁止訪問——你已進行身份驗證,但沒有訪問資源所需的權 限。
403 禁止訪問 HTTP 狀態碼表示伺服器理解客戶端的請求,但由於客戶端沒有必要的權限而拒絕滿足請求。這與 401 未授權狀態不同,因為客戶端已進行身份驗證(或者請求不需要身份驗證),但資源的訪問被明確拒絕。
500:烤箱著火了
你下了一個訂單,但突然之間,廚房裡開始冒煙。麵包師說:“我們無法滿足你的訂單;內部出現了一些問題。”這就是 500 內部伺服器錯誤——伺服器遇到了意外問題。
500 內部伺服器錯誤 HTTP 狀態碼表示伺服器遇到了阻止其完成請求的意外情況。這是一個通用錯誤回應,未提供具體的錯誤細節。
503:暫時不可用
你來到麵包店,但有一個“維修中暫停營業”的特牌。麵包店稍後將重新開放。這就是 503 服務不可用——伺服器暫時無法處理你的請求,通常是由於超載或維護。
503 服務不可用 HTTP 狀態碼表示伺服器暫時無法處理請求。這可能是由於伺服器超載、維護或其他臨時條件。與 500 內部伺服器錯誤不同,503 表示該問題預期將很快解決。
HTTP 狀態碼是保持客戶端和伺服器之間有效通信的關鍵。它們快速通知客戶端其請求是否成功、失敗或需要進一步的行動。對於開發人員和 IT 專業人員來說,了解這些代碼有助於調試問題、設計更好的 錯誤處理並改善整體用戶體驗。
把它們當作互聯網持續對話中的專業標準信號。
本文重點關注 401 和 403 錯誤,因為它們與身份驗證(AuthN)和授權(AuthZ)密切相關。
什麼時候使用 401 未授權?
401 未授權 HTTP 狀態碼用於當客戶端請求需要身份驗證,但要麼缺失、無效或失敗。它告訴客戶端他們需要進行身份驗證以訪問請求的資源。身份驗證與 401 未授權狀態碼之間的關係在於身份驗證在決定請求是否可以進行中所扮演的角色。
401 未授權必須包括一個 WWW-Authenticate 標頭,其中提供如何進行身份驗證的詳情。
那麼,使用 401 未授權的常見情況有哪些呢?
-
缺少身份驗證
請求未包括所需的身份驗證憑證。例如:向受保護的 API 端點發出請求但未提供 Authorization 標頭。
-
無效的身份驗證憑證
客戶端提供了憑證,但它們不正確或與伺服器期望的不匹配。例如,使用者發送了一個無效的 API 密鑰或一個格式錯誤的令牌。
-
身份驗證令牌過期
身份驗證令牌有效但已過期,需要客戶端重新進行身份驗證。例如,帶有過去過期日期(exp 聲明)的 JWT 令牌。
-
缺少或格式不正確的授權標頭
授權標頭是必需的,但要麼未提供,要麼格式不正確。
-
不支持的身份驗證方案
伺服器不支持客戶端提供的身份驗證方法。例如 :客戶端發送一個基本身份驗證標頭,但伺服器只支持持有者令牌。
-
無效的會話或令牌撤銷
使用者的會話已經失效,或者其令牌已被撤銷。例如:用戶登出,但仍使用同一個令牌訪問受保護的資源。
示例回應
什麼時候使用 403 禁止訪問?
403 禁止訪問 HTTP 狀態碼表示伺服器理解請求和客戶端的身份(如果已進行身份驗證),但由於權限不足而拒絕訪問。它明確表示,“你不被允許這樣做,” 確保明確的訪問界限並加強安全策略。
401 未授權與 403 禁止訪問之間的區別在於它們在身份驗證和授權上下文中的角色。
授權是與 身份驗證 分開的機制。身份驗證識別你是誰,而授權則決定你是否可以訪問特定資源以及可以對其執行哪些操作。
要了解 authN 和 authZ 的詳細區別,請查看以下文章。
那麼,使用 403 禁止訪問的常見情況有哪些呢?
-
已認證但缺乏許可
客戶端已登錄或進行了身份驗證,但沒有所需的權限或角色。例如,用戶具有“查看者”角色,試圖刪除文件,但需要“編輯者”權限。
-
資源訪問受限
資源的訪問被有意限制給特定的用戶或群組。例如:只有特定用戶可以訪問的私人文件被不在訪問列表中的人員訪問。
-
IP 或地理位置封鎖
客戶端的 IP 地址或地理位置被伺服器封鎖。例如:來自受限地區的用戶嘗試訪問僅在特定國家運營的服務。
-
因策略而被封鎖的行為
客戶端正在嘗試伺服器端政策或規則所禁止的行為。例如:用戶嘗試修改被標記為“只讀”的資源。
-
被封鎖的靜態資源
出於安全原因,伺服器拒絕訪問特定的靜態文件或目錄。
示例:用戶嘗試訪問 .htaccess 文件或伺服器的配置文件。
-
帳戶被暫停或禁用
客戶端的帳戶因違規或不活躍而被禁用或封鎖。例如:用戶嘗試登錄或訪問資源,但帳戶被暫停。
-
動作需要更高的權限
請求的動作需要特殊特權(例如,管理員或超級用戶)。例如:普通用戶嘗試訪問僅限於管理員的端點。
示例回應:
我該如何排除 401 未授權錯誤
401 錯誤通常表示需要進行身份驗證且已失敗。
檢查憑證
確保 Authorization 標頭存在且格式正確,驗證憑證(API 密鑰、令牌或密碼)是否正確且未過期。輸入錯誤的使用者名稱或密碼是引發 401 錯誤的最常見原因之一。
確認身份驗證方式
伺服器可能預期不同於正在提供的身份驗證方法。如果客戶端和伺服器在身份驗證協議上不一致,則可能發生此情況。使用伺服器指定的正確方法(例如,基本、持有者、API 密鑰)並檢查標頭中的正確語法。
檢查伺服器回應
查看回應正文中的錯誤詳細資訊並檢查 WWW-Authenticate 標頭中的身份驗證說明。
驗證請求
確認端點、查詢參數和主機正確,並確保訪問的資源需要身份驗證。
檢查令牌問題
解碼並檢查令牌(例如,使用 https://logto.io/jwt-decoder)以檢查有效性、過期和宣告,並將令牌的受眾(aud)與 API 的要求相匹配。
我該如何排除 403 禁止訪問錯誤
403 禁止訪問錯誤 通常意味著已完成授權過程,但訪問仍被拒絕。為了排除此錯誤,請考慮以下條件:
驗證權限
確認你的帳戶、API 密鑰或令牌是否擁有資源所需的權限。檢查資源是否限制於特定的角色或群組。
確保身份驗證正確
確保你正確地進行了身份驗證(例如,具有有效的令牌或憑證)。
檢查伺服器要求的身份驗證方式。
驗證資源
確認所請求的資源是否存在且你可以訪問它。如果使用的是 API,請在文件中確認端點要求。
檢查 IP 或位置封鎖
檢查伺服器是否對你的 IP 地址或地理位置進行了限制。
查看伺服器政策
確保請求的動作不違反伺服器端規則或政策(例如,訪問只讀資源)。
檢查伺服器回應
查看回應正文以獲取有關説明 403 錯誤原因的詳細資訊。
單一請求可以返回 401 和 403 狀態碼嗎
不,單一 HTTP 請求不能同時返回 401 未授權 和 403 禁止訪問 狀態碼,因為一個 HTTP 回應只能包含一個狀態碼。
在身份驗證和授權中實際使用 401 和 403 錯誤代碼
在現代應用程式開發中,401 未授權 和 403 禁止訪問 是開發人員經常遇到的兩個 HTTP 狀態碼。雖然它們看似相似,但它們的意義和使用情景迥異。為了澄清它們的區別,本文探索了這些代碼在身份驗證、授權、多租戶和多因素身份驗證(MFA)等情景中的實際 示例。
- 登錄情景:用戶嘗試訪問受保護的頁面但未登錄或提供有效的憑證。伺服器回應並拋出 401 未授權錯誤:“你需要登入或提供有效的憑證才能訪問此頁面。”
- 訪問控制情景:同一用戶登入成功,但試圖訪問不具備所需管理角色的僅供管理員訪問的頁面。伺服器回應並拋出 403 禁止訪問:“你已登入,但你沒有權限訪問此頁面。”
- 多租戶情景:同一用戶登入但屬於 租戶 A,並試圖訪問 租戶 B 的資源,他們沒有訪問權限。伺服器回應並拋出 403 禁止訪問:“你已認證,但你沒有權限訪問租戶 B 的資源。”
- MFA 情景:用戶嘗試登入但尚未完成所需的多因素身份驗證(MFA)。伺服器回應並拋出 401 未授權錯誤:“身份驗證未完成。請完成 MFA 以繼續。”
使用 Logto 作為身份驗證和授權提供者
Logto 主要是一個身份驗證提供者,提供了主要方法,如無密碼登錄、郵件和密碼、MFA、企業 SSO 和社交登入,所有這些都基於開放標準協議,如 OIDC、OAuth 2.0 和 SAML。
Logto Cloud 還提供了基本的授權功能,包括 基於角色的訪問控制(RBAC)、組織(多租戶) 以及 自定義令牌聲明,以滿足各種授權需求。