這兩個英文長得很像,但意思完全不同!
- Authentication(驗證)
- Authorization(授權)
很多新手會搞混,連 HTTP 狀態碼 401 和 403 也常常搞不清楚什麼時候該用哪個。這篇一次講清楚。
Authentication(驗證)
核心問題:你是誰?
就是確認「你是不是你說的那個人」。
生活中的例子
- 刷學生證進校門 → 確認你是這間學校的學生
- 輸入帳號密碼登入 → 確認你是這個帳號的主人
- 刷臉解鎖手機 → 確認你是手機的主人
結果
只有兩種:通過 或 不通過。
Authorization(授權)
核心問題:你能做什麼?
通過身份驗證之後,再決定「你有多少權限」。
生活中的例子
- 你刷學生證進了校門,但你不能進教師辦公室(因為你不是老師)
- 你登入了 Netflix,但你只能看基本方案的內容(因為你沒買進階方案)
- 你登入了公司系統,但你不能看財務報表(因為你不是財務部門)
結果
是等級制的:你可以做到哪些事、不能做哪些事。
兩者的關係
通常是先 Authentication,再 Authorization:
- 先確認你是誰(Authentication)
- 再決定你能幹嘛(Authorization)
實際例子:刪除文章
有人想刪除網站上的一篇文章
第一關 – Authentication:這個人登入了嗎?
- 沒登入 → 請先登入
- 有登入 → 進入第二關
第二關 – Authorization:這個人有權限刪除嗎?
- 是文章作者 → 可以刪
- 是管理員 → 可以刪
- 都不是 → 不好意思,你沒這個權限
HTTP 狀態碼:401 vs 403
講完觀念,來看實際開發中會遇到的 HTTP 狀態碼。
400 開頭的是「客戶端錯誤」,其中有兩個跟驗證 / 授權有關:
| 狀態碼 | 名稱 | 意思 |
|---|---|---|
| 401 | Unauthorized | 驗證失敗(你是誰?我不認識你) |
| 403 | Forbidden | 授權失敗(我知道你是誰,但你沒權限) |
名稱Unauthorized
意思驗證失敗(你是誰?我不認識你)
名稱Forbidden
意思授權失敗(我知道你是誰,但你沒權限)
401 Unauthorized:驗證沒過
什麼時候回傳 401?
當使用者沒有提供正確的身份證明時。
例如:
- 沒有登入,卻想存取需要登入的頁面
- 帶了 Token,但 Token 過期或是錯的
- 帳號密碼打錯
用學校的例子來說:你沒帶學生證,門口警衛不讓你進去。
使用者:我要進去!
伺服器:你的學生證呢?
使用者:我沒帶 / 我帶的是假的
伺服器:回傳 401 Unauthorized403 Forbidden:授權沒過
什麼時候回傳 403?
當使用者有登入、身份也對,但權限不夠時。
例如:
- 一般會員想進管理員後台
- 想存取別人的私人資料
- 想執行超出自己權限的操作
用學校的例子來說:你有學生證,也刷卡進校門了,但你想進教師辦公室,門禁系統不讓你進。
使用者:我要進教師辦公室!
伺服器:我知道你是學生,但這裡只有老師能進
使用者:可是我有學生證...
伺服器:回傳 403 Forbidden401 vs 403 快速判斷
| 情境 | 回傳 |
|---|---|
| 沒登入就想看會員專區 | 401 |
| Token 過期 | 401 |
| 帳號密碼錯誤 | 401 |
| 登入了,但想進管理員後台(你不是管理員) | 403 |
| 登入了,但想看別人的私人資料 | 403 |
| 登入了,但想刪除不是自己的文章 | 403 |
回傳401
回傳401
回傳401
回傳403
回傳403
回傳403
一句話記法
- 401:你誰啊?我不認識你(身份有問題)
- 403:我知道你是誰,但你不能做這件事(權限不夠)
總結
| Authentication | Authorization | |
|---|---|---|
| 問題 | 你是誰? | 你能幹嘛? |
| 結果 | 對 or 錯 | 等級高低 |
| 失敗時的狀態碼 | 401 Unauthorized | 403 Forbidden |
| 白話文 | 驗證身份 | 驗證權限 |
Authentication你是誰?
Authorization你能幹嘛?
Authentication對 or 錯
Authorization等級高低
Authentication401 Unauthorized
Authorization403 Forbidden
Authentication驗證身份
Authorization驗證權限
記住這個順序:

下次看到 401 或 403,就知道是哪一關沒過了!