繁體中文(台灣)
  • 401
  • 403
  • http status code
  • authorization
  • authentication

HTTP 狀態碼 401 或 403? 鑑別身份驗證和授權錯誤的差異

401 未授權 表示客戶端未經身份驗證,需要提供有效的憑證。 403 禁止 意味著客戶端已經驗證身份但缺乏訪問資源所需的權限。

Guamian
Guamian
Product & Design

每次你加載網頁、付款或登入應用程式時,你的設備和伺服器之間都會發生一段隱形對話。這有點像發送消息等待回覆——有時是大拇指豎起,有時是禮貌的“再試一次”,偶爾則是徹底的“拒絕”。這些回應,就是所謂的 HTTP 狀態碼,是互聯網的無名英雄,默默地引導通信流,確保一切順利運行——或者至少讓你知道何時出現問題。

什麼是 HTTP 狀態碼

HTTP 狀態碼就像是客戶端(例如你的瀏覽器或應用)和伺服器之間對話的信號。它們提供了有關你所提出的請求結果的快速和明確的更新——無論是一切順利、出現問題,以及是否需要額外的行動。讓我們把它想像成訪問一個管理良好的麵包店:

200: 一切完美無缺

你要求一個可頌麵包,麵包師微笑著遞給你並說,“給你!” 這就是一個 HTTP 200 OK——請求成功,一切按預期工作。

200 OK HTTP 狀態碼是最常用的代碼之一,它表示來自客戶端的請求已經被伺服器成功接收、理解和處理。

301: 我們搬家了

你到達你喜歡的麵包店,卻看到一個告示寫著,“我們搬到了新街 123 號。” 這是個 301 永久移動。伺服器告訴你的瀏覽器自動轉向新地址。

301 永久移動 HTTP 狀態碼表示請求的資源已永久移動到一個新 URL。此狀態碼告知客戶端(例如瀏覽器或 API 客戶端)更新其記錄並在將來的請求中使用新 URL。

404: 對不起,不在這裡

你要求一個巧克力司康,麵包師說,“我們這裡不做這些。” 這就是 404 找不到——你尋找的資源在伺服器上不存在。

404 找不到 HTTP 狀態碼表示伺服器找不到請求的資源。這個回應意味著客戶端的請求有效,但伺服器無法定位所請求的資源。

401: 你是誰?

你試著進入 VIP 休息室,但保鏢攔住你並說,“你需要出示你的會員卡。” 這是 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.png

401 未授權 HTTP 狀態碼用於客戶端請求需要身份驗證,但它要麼缺失、無效或失敗。

401 未授權 必須包含一個 WWW-Authenticate 頭,提供如何進行身份驗證的詳細信息。

那麼,什麼是 401 未授權 常見的使用場景呢?

  1. 缺少身份驗證

    請求不包括所需的身份驗證憑證。例如:請求保護 API 端點時未包含 Authorization 頭。

  2. 身份驗證憑證無效

    客戶端提供憑證,但它們不正確或不符合伺服器的預期。例如,使用者發送無效的 API 金鑰或格式不正確的令牌。

  3. 身份驗證令牌過期

    身份驗證令牌有效但已過期,需要客戶端重新驗證。例如,一個 JWT 令牌具有過去的到期日期(exp 申索)。

  4. 授權頭缺失或格式錯誤

    授權頭是必需的,但未提供或格式不正確。

  5. 不支持的身份驗證方案

    伺服器不支持客戶端提供的身份驗證方法。例如:客戶端發送 Basic 身份驗證頭,但伺服器只支持 Bearer 令牌。

  6. 會話無效或令牌吊銷

    使用者的會話已經失效,或其令牌已被撤銷。例如:使用者登出,但仍使用同一令牌訪問受保護的資源。

回應範例

何時使用 403 禁止?

403.png

403 禁止 HTTP 狀態碼意味著伺服器理解請求和客戶端的身份(如果已驗證),但由於權限不足而拒絕訪問。它明確表示,“你不被允許這樣做”,確保清晰的訪問邊界並加強安全策略。

401 未授權與 403 禁止的區別在於它們在身份驗證和授權上下文中的角色。

授權與 身份驗證 是一種獨立的機制。身份驗證識別你是誰,而授權確定你是否可以訪問特定資源以及你可以在其上執行哪些操作。

要了解更多有關身份驗證和授權的詳細區別,請查看以下文章。

什麼是 AuthZ

什麼是 AuthN

那麼,什麼是 403 禁止 常見的使用場景呢?

  1. 已驗證但缺乏權限

    客戶端已登錄或已驗證但沒有所需的權限或角色。例如,具有“查看者”角色的使用者嘗試刪除需要“編輯者”權限的文件。

  2. 資源訪問受限

    資源的訪問被有意地限制在特定的使用者或組。例子:特定使用者共享的私人文件被訪問到不在訪問列表中的人。

  3. IP 或地理位置阻止

    伺服器阻止客戶端的 IP 地址或地理位置。例如:來自受限地區的使用者嘗試訪問僅在特定國家運營的服務。

  4. 遵循政策禁止的行動

    客戶端嘗試伺服器策略或規則禁止的操作。例如:使用者嘗試修改被標記為“只讀”的資源。

  5. 阻止靜態資源

    伺服器為安全原因拒絕訪問特定靜態文件或目錄。

    例子:使用者嘗試訪問 .htaccess 文件或伺服器的配置文件。

  6. 帳戶被暫停或禁用

    客戶端的帳戶因違規或不活動而被禁用或阻止。例如:被暫停帳戶的使用者嘗試登錄或訪問資源。

  7. 行動需要提升權限

    請求的行動需要特別權限(例如,管理員或超級用戶)。例如:標準使用者嘗試訪問僅限管理員的端點。

回應範例:

如何排查 401 未授權錯誤

401 錯誤通常表示需要身份驗證且已失敗。

檢查憑證

確保 Authorization 頭部存在且正確格式化,驗證憑證(API 金鑰、令牌或密碼)正確且未過期。輸入錯誤的使用者名稱或密碼是造成 401 錯誤的最常見原因之一。

確認身份驗證方法

伺服器可能期望與客戶端提供的不同身份驗證方法。如果客戶端和伺服器在身份驗證協議上不一致,這種情況可能會發生。根據伺服器的規定使用正確的方法(例如,Basic, Bearer, API Key),並檢查頭部的正確語法。

檢查伺服器響應

檢查回應正文以獲取錯誤詳細信息並查看 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)等場景中實際使用這些代碼的實例。

  1. 登錄場景:一位用戶嘗試訪問受保護的頁面卻未登錄或提供有效憑證。伺服器回應並拋出 401 未授權錯誤:“你需要登錄或提供有效憑證以訪問此頁面。”
  2. 訪問控制場景:同一位用戶成功登錄但嘗試訪問需要管理員角色的頁面。伺服器回應並拋出 403 禁止:“你已登錄,但你沒有訪問此頁面的權限。”
  3. 多租戶場景:同一位用戶登錄但隸屬於 租戶 A,嘗試訪問 租戶 B 的資源,但該資源未授權給他們。伺服器回應並拋出 403 禁止:“你已經驗證身份,但沒有權限訪問租戶 B 的資源。”
  4. MFA 場景:一位用戶嘗試登錄但未完成所需的多因素身份驗證(MFA)。伺服器回應並拋出 401 未授權錯誤:“身份驗證不完整。請完成 MFA 以繼續。”

使用 Logto 作為身份驗證和授權提供者

Logto 主要是一個身份驗證提供者,提供基於開放標準協議(例如 OIDCOAuth 2.0SAML)的關鍵方法,如無密碼登錄、電子郵件和密碼、多因素身份驗證、企業 SSO 和社交登入。

Logto Cloud 還提供基本的授權功能,包括基於角色的訪問控制(RBAC)組織(多租戶)自訂令牌宣稱以滿足各種授權需求。