Authentication 與 Authorization:你是誰,和你能做什麼

文字解析 · 1 支影片 · 產生於 2026-10-01 00:54

🎧 語音解析📝 筆記✍️ 練習

🎧 語音解析 18m27s · TTS 講解與作者原聲交錯;點章節可跳。
邊聽邊看逐句講稿,點任一句從那裡開始
章節(9)

1. Outline

  1. 起點 · Authorization vs Authentication - Whats the Difference? | Developer Concepts Explained
    用一棟辦公大樓的門禁把兩個概念分開:刷卡進大樓是 authentication,每一扇房間門各自判斷你能不能進是 authorization;再把整套比喻一比一翻譯成 token、role 與 permission。

2. YouTuber 的思維推導

Authorization vs Authentication - Whats the Difference? | Developer Concepts Explained

Roberts Dev Talk · 5m40s · 字幕 en · vision=off (整支影片是固定機位的講者鏡頭,只有兩三個一秒的 B-roll(門禁鍵盤、登入表單),沒有任何圖表、程式碼或白板;transcript 也完全沒有「你看這張圖」類的視覺指示語。依 rules/segment.md,shots_mode 由 auto 降為 none,vision 一律 false。) · YouTube

預估 vs 實際耗時
階段預估實際
fetch 6s 2s
segment 41s 5m00s
shot 38s –
analyze 3m45s 7m48s
render 5s –

作者的起點是一個語言問題:authorization 和 authentication 在日常用語裡幾乎被當成同義詞,所以他不從定義出發——定義只會讓兩個長得像的字更難分。他改用一棟辦公大樓:先讓你刷識別碼、掃臉、拿到一張編碼了你角色的通行證,演完「進得了門」,再回頭說這就是 authentication;接著把場景一比一翻成 web 應用,識別碼與臉換成帳號密碼,通行證換成 access token,並順手量了一次頻率——一個 session 認證一次。翻譯完成後他做整支影片的轉折:認證只擋得住匿名的人,擋不住一個已經拿到 token 的人去碰不該碰的東西;這個缺口把 authorization 邏輯地逼了出來。

第二輪他讓同一個人帶著同一張通行證去撞頂樓實驗室的讀卡機,紅燈;下樓刷自己辦公室,綠燈——認證這個變數被釘死,差別只剩通行證上的角色與那扇門的要求。由此抽出規則:每一次存取資源都要檢查編碼在 access token 上的 roles。最後用會計軟體把 role 剖成更細的 permission(付款管理員含 create payments、read payments),跑完一次完整判斷,並把兩個概念的頻率並排——認證一次,授權每次。

結論不是二選一,而是兩者一起保護 API;影片收在他自己的提醒:想清楚容易,做對不容易,所以下一步是 Auth0 與實際實作。

推理鏈:每段留給下一段的線索

每一列是一段,箭頭後的字是這段留給下一段的線索。點段落標題跳到該段。

  1. 兩個最常被混淆的字 → 作者宣告了要講「合作」而不是「取捨」,但到這裡他一個定義都還沒給。留下的問題是:這兩件事放在同一個場景裡,究竟是怎麼分工的?
  2. 辦公大樓比喻:進得了門 → 故事版的認證演完了,但故事不能拿來寫程式。留給下一段的是一個一對一的翻譯問題:識別碼和臉在 web 應用裡對應到什麼?那張帶著角色資訊的通行證,又是什麼東西?
  3. Web 版的認證:換成 token → 認證的流程完整了,而且被量了一次頻率:一個 session 一次。但作者接著沒有繼續講怎麼把認證做得更好,反而要問它擋不住什麼——留下的線索是:一個已經拿到 token 的人,還能做什麼你不希望他做的事?
  4. 認證擋不住的那件事 → 作者到這裡只給了 authorization 一個負面定義——它是用來補認證缺口的東西。它自己是什麼、靠什麼判斷,都還沒說。線索留在第 2 段那張通行證上:上面早就寫了角色,它接下來要派什麼用場?
  5. 拿著通行證仍被擋在門外 → 紅燈與綠燈說明了授權靠什麼判斷,但還沒說這個判斷該多常做。大樓裡是每一扇門都裝了讀卡機——留給下一段的是一個節奏問題:web 應用裡的「每一扇門」,究竟是什麼?
  6. 每次存取都要再檢查一次 → 規則有了,但「檢查 roles」裡的 role 到現在仍然只是一個寫在通行證上的字——它裡面裝什麼、粒度多細,都還沒拆開。留給下一段的是:role 到底是由什麼組成的?
  7. 會計軟體:role 包住 permission → 兩層結構與完整的判斷流程都齊了,兩個概念也各自量出了頻率。剩下的是把散在前面各段的定義收回同一個畫面——線索是:如果只能留兩句話給讀者,該留哪兩句?
  8. 並排總結:一次 vs 每次 → 概念收束了,但整支影片到這裡沒有出現過任何一行程式。留給下一段的是作者自己也要承認的落差:想清楚很容易,做對不容易。
  9. 難的是實作,下一步是 Auth0

3. 逐段說明

Authorization vs Authentication - Whats the Difference? | Developer Concepts Explained

1. 兩個最常被混淆的字 0:00–0:22

作者開門見山問:authorization 和 authentication 到底是什麼、差在哪、你的應用需要哪一個。他指出這兩個概念經常被混為一談,而這支影片要說明它們如何「合作」保護 API——注意他從一開始就把兩者定位成互補而非二選一。

承上 前情提要裡提到,多數人早就在登入頁、API 金鑰、後台權限設定這些地方同時碰過這兩個字,卻說不出差別在哪。作者一開場就直接把這個混淆當成起點,而不是先假設讀者需要補什麼背景。

推理因為 authorization 和 authentication 在日常用語裡幾乎被當成同義詞,所以作者不先給定義,而是先把問題攤成三句:它們各是什麼、差在哪、你的應用需要哪一個。接著他補上第四句,也是真正決定整支影片走向的一句——他要講的是這兩件事「如何一起」保護 API。這句話等於先否定了第三個問題裡「二選一」的暗示:答案不是挑一個,而是兩個都要,只是各管一段。

AI 補充值得補的是這兩個字為什麼特別容易混:它們都以 auth 開頭、程式庫裡都縮寫成 auth(`authMiddleware`、`auth.js` 到底是哪一個?),而且常常被塞進同一個 middleware 一起執行。連 HTTP 協定自己都搞錯過——狀態碼 401 的正式名稱是 Unauthorized,但它真正的意思是「你還沒認證」,而「認證過了但沒權限」是 403 Forbidden。也就是說,這個混淆不只是初學者的問題,它已經固化在我們每天用的工具與規格裡,所以值得花一支影片把它分乾淨。

authentication

認證(身分驗證)

確認「你是誰」的過程:使用者提出憑證,系統驗證這個人確實是他聲稱的那個人。

常被縮寫成 AuthN。它回答的問題只有一個:你是不是你說的那個人。它不管你能做什麼——一個通過認證的使用者可能什麼權限都沒有。常見誤解是把「登入成功」等同於「可以用這個系統」,但登入只證明身分,能不能用某個功能是另一件事。認證的產物通常不是一個是/否,而是一張帶著身分資訊的憑據(session、token、cookie),這張憑據會被後面每一次請求拿來用。

相關術語: authorization (前提)、credentials (輸入)

出處:第 1 段「兩個最常被混淆的字」

authorization

授權(權限判斷)

確認「你能不能做這件事」的過程:判斷一個已知身分的使用者,有沒有存取某個資源的權限。

常被縮寫成 AuthZ。它的輸入是「已經確定的身分」加上「這次要碰的資源」,所以它必然發生在認證之後——不知道你是誰,就無從判斷你能做什麼。常見誤解是以為授權只是登入流程的一部分;實際上授權是每一次資源存取都要重跑的判斷,而登入通常只跑一次。把 AuthN 和 AuthZ 寫在同一個 middleware 裡是很常見的做法,但它們的觸發時機並不相同。

相關術語: authentication (承接)、permission (判斷依據)

出處:第 1 段「兩個最常被混淆的字」

API

應用程式介面

程式對外開放的一組操作入口,別的程式可以透過它讀寫你的資料或觸發你的功能。

作者整支影片的保護對象都是 API 而不是網頁,這個選擇有意義:網頁可以靠「把按鈕藏起來」製造出安全的錯覺,API 沒有畫面可藏,任何人只要知道網址就能直接送請求。所以在 API 的世界裡,認證與授權必須真的寫在伺服器端的每一個入口上,而不是靠前端不顯示某個選項。

相關術語: resource (所暴露的對象)

出處:第 1 段「兩個最常被混淆的字」

留給下一段 作者宣告了要講「合作」而不是「取捨」,但到這裡他一個定義都還沒給。留下的問題是:這兩件事放在同一個場景裡,究竟是怎麼分工的?

2. 辦公大樓比喻:進得了門 0:22–1:04

作者用一個真實場景取代定義:你到高科技公司上班,在門禁鍵盤輸入識別碼,保全系統掃你的臉。系統做兩件事——確認這個識別碼屬於某位員工,並比對臉部資料確認你就是本人。通過後發給你一張通行證,證件上編碼了你的身分資訊與你在公司裡的角色。這整段就是真實世界的 authentication。

承上 上一段留下的問題是「兩件事在同一個場景裡怎麼分工」。作者沒有用定義回答,而是直接搬出一個辦公大樓的場景,先把其中一半——「進得了門」這一半——完整演一次。

推理因為上一段刻意不給定義,所以作者接著用一個幾乎每個人都做過的動作來代替定義:在門禁鍵盤輸入識別碼、被掃臉、拿到通行證。他把保全系統的動作明確拆成兩步——先確認這個識別碼屬於一位在這裡工作的員工,再拿臉部掃描比對檔案,確認你就是你聲稱的那個人——然後才把名字補上:你剛剛經歷的就是真實世界的 authentication。順序是刻意的:先有體感,再有名字,這樣名字就不會退回成一個和另一個字長得很像的空殼。

AI 補充作者拆出的兩步其實有各自的名字,值得分開看:輸入識別碼是 identification(你宣稱你是誰),掃臉是 verification(證明你的宣稱為真)。少了第二步,任何人知道你的識別碼就能變成你——這也是為什麼真實的門禁很少只有鍵盤。另外,這段有一句容易滑過去、但其實是整支影片最重要的伏筆:「通行證上編碼了你的資訊與你在公司裡的角色」。這代表認證的產物不只是一個「通過/不通過」的布林值,而是一張帶著資料的憑據。如果通行證上只寫「此人已認證」,那麼大樓裡每一扇門都無從判斷該不該開——後面所有的推論都建立在「這張證上寫了角色」這件事上。

術語:credentialsmulti-factor authentication

credentials

憑證

使用者用來證明自己身分的東西,例如識別碼、密碼、臉部掃描。

憑證通常分成三類:你知道的(密碼、PIN)、你持有的(門禁卡、手機、硬體金鑰)、你本身是的(指紋、臉)。這段裡識別碼屬於第一類,臉部掃描屬於第三類。憑證的共通特性是它必須難以被別人取得或偽造,而且一旦外洩就該能夠更換——這正是生物特徵作為憑證的先天弱點,因為臉換不掉。

相關術語: authentication (輸入)、multi-factor authentication (疊加使用)

出處:第 2 段「辦公大樓比喻:進得了門」

multi-factor authentication

多因素認證(MFA)

同時要求兩類以上不同性質的憑證,任一類被破解都還不足以冒充身分。

這段的門禁其實就是一次 MFA:識別碼是「你知道的」,臉是「你本身是的」。關鍵不在於要幾個憑證,而在於它們是否來自不同類別——要求兩組密碼不算多因素,因為同一次外洩就會兩組一起丟。實務上最常見的組合是密碼加上手機收到的一次性碼或 App 認可。作者沒有點名這個概念,但他設計場景時已經自然地用上了。

相關術語: credentials (由多類組成)

出處:第 2 段「辦公大樓比喻:進得了門」

role

角色

把一群人依職務歸類的標籤,代表這類人在組織裡被預期要做哪些事。

在這段裡,角色被寫進通行證,成為認證產物的一部分——這一步決定了後面的門禁能不能自己判斷。角色的價值在於它是一個中間層:門不必認得每一個員工,只要認得「哪些角色可以進」;人事異動時只要換人的角色,不必去改每一扇門。這個「中間層」的作用在後面拆解會計軟體時會更清楚。要注意角色描述的是身分歸類,不是具體動作——具體能做什麼是更細一層的事。

相關術語: authorization (判斷輸入)、credentials (不是憑證)

出處:第 2 段「辦公大樓比喻:進得了門」

留給下一段 故事版的認證演完了,但故事不能拿來寫程式。留給下一段的是一個一對一的翻譯問題:識別碼和臉在 web 應用裡對應到什麼?那張帶著角色資訊的通行證,又是什麼東西?

3. Web 版的認證:換成 token 1:04–1:40

作者把比喻一比一搬到 web 應用:使用者交出帳號密碼這組 credentials,系統確認這個使用者存在、密碼與資料庫相符,然後發出一個 token。token 上編碼了使用者是誰、以及他在應用裡的角色——正好對應通行證上的資訊。關鍵在頻率:這通常一個 session 只發生一次,access token 有到期時間,使用者也許一天只認證一次。

承上 接下上一段的翻譯問題——通行證在 web 應用裡是什麼。作者的答案是 token,而且他讓每一個元件都對得上:識別碼與臉換成帳號密碼,發通行證換成發 token,通行證上編碼的角色換成 token 上編碼的角色。

推理因為上一段把認證的產物定調為「一張帶資料的憑據」,所以作者接著要證明這個結構在真實系統裡確實成立:使用者交出 credentials → 系統確認這個使用者存在、再確認密碼與資料庫相符 → 發出一個 token,token 上編碼了他是誰以及他在應用裡的角色。翻譯完成之後,他多說了一件故事裡沒有的事——頻率:這通常一個 session 只發生一次,access token 有到期時間,使用者也許一天只需要認證一次。這句聽起來像順帶補充,其實是他等一下要拿來對比的那把尺。

AI 補充有兩件作者跳過的事值得補。第一,token 上「編碼的那些資訊」在規格裡有名字,叫 claims(宣稱),例如 sub 是使用者是誰、exp 是到期時間、roles 是角色;後面所有的權限判斷讀的就是這些欄位。第二,為什麼要發 token,而不是每次請求都重送一次帳號密碼?因為密碼是長期祕密,一旦在某次請求中外洩,攻擊者拿到的是永久通行權;token 則是短期、可設定到期、可以撤銷、還能限定用途的替代品。換句話說,發 token 這一步的重點不只是方便,而是把「長期祕密」換成「短期憑據」,讓外洩的損害有時間上限。另外,作者一句帶過的「比對密碼」在實務上並不是字面上那樣做——見本段勘誤。

token

權杖

認證成功後系統發給使用者的一小段資料,後續每次請求都帶著它來代表身分。

token 就是通行證在程式裡的對應物(見第 2 段)。最常見的格式是 JWT:一段可以被任何人讀取、但被伺服器簽章因此無法被竄改的 JSON。要特別注意「無法竄改」不等於「無法被看見」——JWT 的內容是編碼而非加密,所以不該把祕密放進去。token 通常放在 HTTP 的 Authorization 標頭裡送出。

相關術語: access token (一種)、claim (內含)

出處:第 3 段「Web 版的認證:換成 token」

access token

存取權杖

專門用來代表「這次請求有權存取某些資源」的短效 token。

它和用來換新 token 的 refresh token 是不同的東西:access token 每次請求都送出去,因此暴露面大,設計上壽命很短;refresh token 只在換發時送給認證伺服器,壽命長很多。作者這段把兩者的效果合在一起講(見本段勘誤),但實作時分清楚很重要——access token 該短、refresh token 該能被撤銷。

相關術語: token (一種)、session (存活於)

出處:第 3 段「Web 版的認證:換成 token」

claim

宣稱

token 裡的一個欄位,記載關於這個使用者的一項事實,例如他是誰、角色是什麼、什麼時候到期。

claim 這個字選得很精確:token 裡的內容是發證方「宣稱」為真的事,接收方之所以相信它,是因為簽章證明這張證確實出自它信任的發證方,而不是因為它自己驗證過內容。這解釋了一個常見的疑惑——為什麼服務可以不查資料庫就知道使用者的角色。代價是這些宣稱是發證當下的快照,發出去之後就不會自動更新。

相關術語: token (組成單位)、role (常見的一種)

出處:第 3 段「Web 版的認證:換成 token」

session

工作階段

使用者從登入到登出(或逾時)之間的一段連續使用期間。

作者用 session 當成量頻率的單位:認證一個 session 一次。session 的長度是一個安全與體驗的取捨——太短使用者一直被迫重新登入,太長裝置被拿走的風險就拉長。實務上會用「閒置多久登出」加上「最長存活多久」兩條線一起限制,敏感操作(改密碼、轉帳)則另外要求當場再認證一次。

相關術語: access token (承載於)

出處:第 3 段「Web 版的認證:換成 token」

見仁見智 1:14
「make sure the password matches that stored in the database」
照字面聽會以為資料庫裡存著密碼、拿來直接比對。現行做法不會儲存密碼本身,而是存加鹽的單向雜湊(bcrypt、scrypt、Argon2);登入時是把使用者送來的密碼用同樣方式算一次,比對雜湊值。差別很實際:資料庫外洩時,前者等於所有人的密碼一起外流,後者攻擊者拿到的只是難以還原的雜湊。作者這裡是為了講流程而簡化,但這句正好是最常被初學者照字面實作的一句。
依據: OWASP Password Storage Cheat Sheet;NIST SP 800-63B 對密碼儲存的要求
見仁見智 1:30
「The access token normally has an expiry time, so the user only has to authenticate perhaps once per day.」
「一天認證一次」這個體感沒錯,但撐住它的通常不是 access token 的到期時間。現行 OAuth 2.0 實務建議 access token 短命,常見是 5 到 60 分鐘;使用者之所以不必一直登入,是因為背後有 refresh token 或 session cookie 在默默換發新的 access token。把兩者混為一談,容易寫出把 access token 有效期設成一天的實作,等於讓一張被竊的權杖有一整天的通行權。
依據: RFC 9700(OAuth 2.0 Security Best Current Practice)建議縮短 access token 存活期並搭配 refresh token
留給下一段 認證的流程完整了,而且被量了一次頻率:一個 session 一次。但作者接著沒有繼續講怎麼把認證做得更好,反而要問它擋不住什麼——留下的線索是:一個已經拿到 token 的人,還能做什麼你不希望他做的事?

4. 認證擋不住的那件事 1:40–2:01

作者指出 authentication 的能力邊界:它擋掉匿名使用者,讓你知道是誰在存取系統,某種程度上也能依「使用者是誰」控制他看到什麼。但它擋不住一個已經通過認證的人去碰你不想給他的資源。這個缺口就是 authorization 存在的理由。

承上 回答上一段留下的線索——拿到 token 之後還剩下什麼風險。作者先把 authentication 的功勞算清楚,再指出它的邊界在哪裡。

推理因為上一段的 token 讓系統知道了「你是誰」,所以作者接著做一件推理上必要的事:把「知道你是誰」能換來的保護先列出來——擋掉匿名使用者,所以你知道是誰在存取系統;某種程度上也能依據使用者是誰來控制他看到哪些資源——然後在同一句話裡踩煞車。他的轉折句下得很準:你真正還需要的,是一個辦法阻止「已經通過認證的」使用者去存取你不希望他碰的資源。威脅的身分在這一句裡從外人變成了內部人,門檻也就從「你是誰」變成「你能做什麼」。authorization 是被這個缺口逼出來的,不是作者硬塞進來的。

AI 補充作者說「某種程度上你可以根據使用者是誰控制他看到什麼」,這一步其實已經在做授權了,只是把授權規則直接寫死在身分上(`if user.id == 42`)。這種寫法在使用者只有幾個時能動,人一多就會散落在程式各處、無人敢改——這正是「把身分」和「能做什麼」拆開的動機。另外值得補一個具體的失敗樣貌:只有認證沒有授權的系統,最典型的漏洞是 IDOR——網址是 `/invoices/1001`,你把它改成 `/invoices/1002` 就看到別人的帳單。攻擊者完全合法地登入、token 完全有效、每一次請求都通過認證,但他拿到了不屬於他的東西。這就是作者說的「認證擋不住的那件事」的實際長相。

術語:anonymous access

anonymous access

匿名存取

沒有提供任何身分憑證就能使用系統的狀態。

認證的第一個作用就是把匿名擋在外面,讓每一次操作都能追溯到一個人。這不只是防禦,也是稽核的前提——出事時要知道是誰做的。但要注意匿名不必然是壞事:公開的首頁、文件、健康檢查端點本來就該匿名可存取,重點是明確地決定哪些入口允許匿名,而不是預設全開。

相關術語: authentication (所排除的對象)

出處:第 4 段「認證擋不住的那件事」

resource

資源

系統裡可以被存取的具體對象,例如一筆訂單、一份檔案、一個 API 端點。

授權判斷永遠是「某個人」對「某個資源」做「某個動作」的三元組,所以資源是授權裡不可省略的一角——這也是為什麼授權不能只在登入時做一次:登入時還沒有資源,判斷無從發生。實務上要留意資源有兩種粒度:型別層級(能不能看發票這種東西)和個體層級(能不能看第 1002 號這張發票),只做前者正是 IDOR 的成因。

相關術語: authorization (判斷對象)、IDOR (個體層級失守)

出處:第 4 段「認證擋不住的那件事」

IDOR

不安全的直接物件參照

系統只憑網址或參數裡的識別碼就取出資料,沒有檢查這個使用者是否有權看它。

全名 Insecure Direct Object Reference,長年名列 OWASP 的存取控制失效類別榜首。它之所以特別常見,是因為它不需要任何攻擊技巧——把網址上的數字加一就行。常見的錯誤修法是把識別碼換成猜不到的亂數(UUID),但那只是讓它變難猜,不是變安全;正確的修法是在取出資料之後、回傳之前,檢查這個使用者對這一筆資料有沒有權限。

相關術語: authorization (缺席的後果)、resource (被越權存取)

出處:第 4 段「認證擋不住的那件事」

留給下一段 作者到這裡只給了 authorization 一個負面定義——它是用來補認證缺口的東西。它自己是什麼、靠什麼判斷,都還沒說。線索留在第 2 段那張通行證上:上面早就寫了角色,它接下來要派什麼用場?

5. 拿著通行證仍被擋在門外 2:01–2:49

作者把同一個大樓故事往前推:你想上頂樓看研發實驗室,刷卡卻亮紅燈。你明明有通行證、明明已經在大樓裡——保全系統做的是讀取通行證上編碼的角色,判定你沒有被授權進入那個區域。回到自己的辦公室刷卡就亮綠燈。同一張通行證、不同的門,結果不同,差別只在權限。

承上 接住上一段留下的線索——通行證上的角色要派什麼用場。作者回到同一棟大樓,讓你帶著已經到手的通行證,去撞一扇打不開的門。

推理因為上一段把 authorization 定義成「擋住已經通過認證的人」,所以作者需要一個畫面能同時滿足兩個條件:這個人確實已通過認證,而且確實被擋下來。頂樓的研發實驗室正好——他刻意連問三句「你明明有通行證、你已經通過認證、你人就在大樓裡」,把認證這個變數釘死,讓紅燈的原因只剩下一個:保全系統讀了通行證上編碼的角色,判定你沒有被授權進入那個區域。接著他讓你搭電梯下樓,刷自己辦公室的門,亮綠燈。同一個人、同一張通行證、不同的門,結果相反——差別就只可能出在那扇門要求什麼。

AI 補充這個紅燈綠燈的對照真正的價值,是它把授權判斷的兩個輸入分開了:一邊是主體帶來的(你的角色,寫在證上),一邊是客體要求的(這個區域需要什麼角色才能進)。判斷發生在兩者相遇的那一刻,所以它必然是逐扇門各判各的——這對應到系統設計上一句很重要的話:授權是每個資源自己的事,不能只在入口做一次。還有一個細節值得指出來:讀卡機是因為「沒看到允許的依據」而亮紅燈,不是因為「看到了禁止的規則」。這叫預設拒絕,也是所有存取控制系統應有的預設值——漏寫一條規則的後果應該是打不開門,而不是門大開。作者沒說破這件事,但他描述的行為完全符合。

permission

權限

對某個資源執行某個動作的許可,例如「可以進入頂樓實驗室」「可以讀取這筆資料」。

權限是授權判斷裡最細的一格,它描述的是動作,不是身分——這正是它和角色(見第 2 段)的分工:角色說你是誰這一類人,權限說可以做哪一件事。作者在這段第一次讓「你沒有權限」這句話落地:你有身分、有憑據、人也在裡面,缺的只是這一格。實務上權限常寫成 `動詞:名詞` 的形式,例如 `read:invoices`、`create:payments`。

相關術語: role (被角色包含)、authorization (判斷依據)

出處:第 5 段「拿著通行證仍被擋在門外」

access control

存取控制

決定「誰可以對什麼做什麼」並實際執行這個決定的整套機制。

存取控制是授權的上位概念:授權是那個判斷,存取控制還包含規則怎麼寫、存在哪裡、由誰執行、以及執行點放在哪一層。大樓故事裡,規則是「哪些角色能進哪個區域」,執行點是每一扇門上的讀卡機——執行點的位置決定了系統的實際安全性,把讀卡機只裝在大門口,樓上就形同不設防。

相關術語: authorization (包含)、deny by default (預設策略)

出處:第 5 段「拿著通行證仍被擋在門外」

deny by default

預設拒絕

沒有明確允許的存取一律拒絕,而不是沒有明確禁止就放行。

這是存取控制最重要的一條預設值,因為它決定了「漏寫規則」的後果。預設拒絕時,漏寫一條規則的症狀是有人抱怨打不開門——會被立刻發現並修好;預設允許時,漏寫一條規則的症狀是沒有任何症狀,直到有人越權存取為止。實作上的具體樣貌是:新加的 API 端點如果沒有掛上授權檢查就應該回 403,而不是暢通無阻。

相關術語: access control (設計原則)

出處:第 5 段「拿著通行證仍被擋在門外」

留給下一段 紅燈與綠燈說明了授權靠什麼判斷,但還沒說這個判斷該多常做。大樓裡是每一扇門都裝了讀卡機——留給下一段的是一個節奏問題:web 應用裡的「每一扇門」,究竟是什麼?

6. 每次存取都要再檢查一次 2:49–3:14

作者從故事抽出通則:能進大樓不代表能去任何地方。搬到 web 應用,每一次使用者要存取一個資源,應用程式都應該檢查他是否被授權,做法就是檢查編碼在 access token 上的 roles。這裡出現和第 3 段的頻率對照——認證一次,授權每次。

承上 回答上一段的節奏問題:web 應用裡的「每一扇門」,就是每一次資源存取。作者先把大樓故事抽成一句通則,再把它翻回程式。

推理因為上一段已經用紅燈綠燈把畫面演完了,所以作者接著只需要把它換成一句可執行的規則:被允許進入大樓不代表被授權去任何地方;相對應地,每一次使用者要存取一個資源,應用程式都應該檢查他是否被授權,通常的做法就是檢查編碼在 access token 上的 roles。這一句同時把前面幾段的零件全部接上——第 3 段發出的 token、第 2 段寫在通行證上的角色、第 5 段那台逐扇門各判各的讀卡機。第 3 段量出的那把尺也在這裡完成對照:認證一個 session 一次,授權每一次存取都做。

AI 補充「每次都檢查」聽起來理所當然,但它是實務上最常漏掉的一步,而且失敗的方式很固定。最常見的是把授權寫在前端——沒有權限就不顯示那顆按鈕;畫面看起來對了,但 API 仍然照收請求,任何人用 curl 就繞過去了。第二種是只在 API gateway 或登入時檢查一次,之後內部服務彼此信任,於是一個入口被繞過就全面失守。真正的檢查點必須落在資源被讀寫的那一層,也就是最接近資料的地方。另外,作者說的「檢查 token 上的 roles」是最簡單也最快的做法,但它有一個內建的代價——見本段勘誤。

術語:RBACtoken revocation

RBAC

角色型存取控制

以「使用者屬於哪些角色」為依據來決定他能存取什麼的授權模型。

全名 Role-Based Access Control,是作者這段描述的做法的正式名稱:規則掛在角色上,人掛在角色上,兩者透過角色這個中間層連起來。它的好處是好懂、好稽核、好交給非工程師維護——「誰是付款管理員」這種問題人資也答得出來。它的極限出現在規則需要看情境時,例如「只能看自己部門的資料」「只在上班時間可以匯出」,這類條件無法只用角色表達。

相關術語: role (判斷依據)、access control (一種模型)

出處:第 6 段「每次存取都要再檢查一次」

token revocation

權杖撤銷

在 token 到期之前主動讓它失效的機制。

把角色寫進 token 換來了速度——伺服器不必查資料庫就知道你能做什麼——但也帶來一個問題:token 是發證當下的快照(見第 3 段的 claim)。使用者被降權、離職、或帳號被盜之後,手上那張 token 在到期前仍然帶著舊角色暢行無阻。解法有三種取捨:把 token 壽命縮到很短、維護一份撤銷清單(等於放棄了不查資料庫的好處)、或在敏感操作時強制回查授權服務。沒有免費的選項,只有選哪一邊付代價。

相關術語: access token (作用對象)、claim (因快照而必要)

出處:第 6 段「每次存取都要再檢查一次」

見仁見智 3:11
「by checking the roles encoded on the access」
只讀 token 上的角色來判斷授權,是最省事的做法,但它把「這個人現在的權限」換成了「發證當下的權限」。使用者被降權或離職後,手上那張還沒到期的 token 依舊帶著舊角色通行;同樣地,剛被加上的權限也要等換發新 token 才生效。權限敏感的系統通常會補上一層:縮短 token 壽命、維護撤銷清單,或在關鍵操作時回查授權服務。作者這裡講的是通則性的做法,沒有錯,但值得知道它的代價。
依據: RFC 9700(OAuth 2.0 Security BCP)關於 token 生命週期與撤銷的討論;OWASP Broken Access Control
留給下一段 規則有了,但「檢查 roles」裡的 role 到現在仍然只是一個寫在通行證上的字——它裡面裝什麼、粒度多細,都還沒拆開。留給下一段的是:role 到底是由什麼組成的?

7. 會計軟體:role 包住 permission 3:14–4:15

作者用會計軟體把 role 拆得更細:公司負責人、付款管理員(可執行付款、看銀行帳戶)、文書人員(只能基本資料輸入)。每個 role 包住一組更細的 permission,例如付款管理員含有 create payments 與 read payments。使用者要「建立付款」時,應用程式檢查他有沒有那個 role 或那個 permission,沒有就拒絕——即使他已經通過認證。最後點明頻率差異:授權每次都做,認證一個 session 一次。

承上 回答上一段的問題——role 是由什麼組成的。作者換掉比喻,改用一個真實的系統(會計軟體)把角色剖開。

推理因為上一段的規則停在「檢查 roles」,所以作者接著必須說明 role 內部的結構,否則這條規則無法落地成程式。他先列三個角色:公司負責人、付款管理員(可執行付款、看銀行帳戶)、文書人員(只能做基本資料輸入、只看得到有限的資料);再說每一個角色都包住一組更細的 permission,並舉例付款管理員這個 role 含有 create payments 與 read payments。兩層於是分開了:role 是給人看的(你是哪一類人),permission 是給資源看的(可以做哪一件事)。接著他完整跑一次判斷:使用者要建立付款 → 檢查他有沒有 payment administrator 這個 role、或有沒有 create payments 這個 permission → 有就放行,沒有就拒絕,即使他已經通過認證。最後他把兩者的頻率並排說出來——授權每次都做,認證一個 session 一次——親手驗收了第 3 段量下的那把尺。

AI 補充為什麼要多一層,而不是把權限直接掛在人身上?因為這兩件事的變動速度不一樣:permission 隨功能長(每加一個功能就多幾個),role 隨組織長(每來一個員工就要指派)。中間隔一層 role,「新增一個功能」和「新來一個同事」就不會互相干擾——新功能只需要決定掛進哪些角色,新同事只需要指派角色。另外要補作者沒說的兩個實務問題。第一是角色設計的預設值:新角色該從零權限開始逐項加,而不是從管理員複製再刪——後者幾乎必然留下多餘的權限。第二是角色爆炸:當規則開始出現「只能看自己部門的付款」這種條件時,用角色表達就得切出「北區付款管理員」「南區付款管理員」……角色數量開始失控,這時該換的是模型而不是再多切幾個角色。

術語:principle of least privilegeABAC

principle of least privilege

最小權限原則

每個人只該擁有完成本職工作所必需的最少權限,不多給。

它決定的是角色該怎麼設計:文書人員只能做基本資料輸入、只看得到有限的資料,這就是最小權限的具體長相。實務上最常見的違反不是刻意放權,而是圖方便——複製一個現成的管理員角色再刪掉幾項、或是為了讓功能先動起來暫時放寬然後忘了收回。配套的做法是定期複核(誰有哪些權限、還需不需要)以及即時授權(需要時才升權,用完自動收回)。

相關術語: role (設計原則)、deny by default (同源思路)

出處:第 7 段「會計軟體:role 包住 permission」

ABAC

屬性型存取控制

用使用者、資源與環境的屬性組成條件來判斷授權,而不是只看角色標籤。

全名 Attribute-Based Access Control。當規則長成「只能看自己部門的付款」「金額超過一百萬需要負責人」「只在上班時間可以匯出」時,角色(見第 6 段的 RBAC)就表達不了,因為判斷需要看這一筆資料本身的屬性,而不只是這個人的標籤。實務上兩者常混用:用 RBAC 決定能不能碰這一類資源,再用 ABAC 決定能不能碰這一筆。代價是規則變複雜、難稽核,所以不該一開始就上。

相關術語: RBAC (對照組)、permission (更細的表達)

出處:第 7 段「會計軟體:role 包住 permission」

留給下一段 兩層結構與完整的判斷流程都齊了,兩個概念也各自量出了頻率。剩下的是把散在前面各段的定義收回同一個畫面——線索是:如果只能留兩句話給讀者,該留哪兩句?

8. 並排總結:一次 vs 每次 4:15–4:51

作者把兩個概念並排收尾:authentication 是使用者提出憑證(帳密、或臉部掃描這類生物特徵)換取進入系統,通常一個 session 一次;authorization 在每次存取資源時發生,判斷這個已認證的使用者有沒有權限碰這個資源,沒有就拒絕。兩者不是二選一,是一起保護 API。

承上 接下上一段的問題——只留兩句話該留哪兩句。作者用同一組句型,把兩個概念並排講一次。

推理因為上一段已經把 role 與 permission 拆到底,所以作者不再引入任何新東西,改做對齊:authentication 是使用者提出一組憑證(帳號密碼,或甚至臉部掃描這種生物特徵資料)換取進入系統,通常一個 session 一次;authorization 則在每一次使用者存取資源時發生,判斷一個已通過認證的使用者對某個特定資源有沒有權限,沒有就拒絕。兩句話的差異被壓成三個維度——輸入是什麼(憑證,或已確定的身分加上資源)、問什麼(你是誰,或你能不能)、多久做一次(一次,或每次)。最後一句話回到第 1 段的開場:這兩個概念是一起工作來保護 API 的,不是二選一。整支影片在這裡閉合。

AI 補充補一個可以立刻用上的記法:HTTP 的 401 對應認證失敗,403 對應授權失敗。也就是說 401 的意思是「我不知道你是誰,請先證明」,403 的意思是「我知道你是誰,但你不能碰這個」。401 的正式名稱 Unauthorized 是規格上的歷史誤稱,它其實講的是 authentication——知道這一點,看別人的 API 就不會被名稱誤導。另外要補一件作者輕輕帶過的事:他把生物特徵和帳號密碼並列成憑證,但兩者性質差很多——密碼外洩可以更換,臉和指紋不能。所以生物特徵在設計上通常只當多因素中的一個因素(見第 2 段),並且比對應該發生在使用者的裝置裡(裝置驗證通過後才代為簽章),而不是把臉的資料上傳到伺服器比對。

術語:401 Unauthorized403 Forbidden

biometrics

生物特徵

用身體或行為特徵(臉、指紋、聲紋)來辨識身分的憑證類型。

它屬於「你本身是的」那一類憑證(見第 2 段)。優點是使用者不必記也不會忘;致命弱點是不可撤換——密碼外洩換一組就好,臉外洩了沒有第二張。所以現代做法(如 passkey/FIDO2)不把生物特徵當成送到伺服器的憑證,而是拿它在本機解鎖裝置裡的私鑰,伺服器收到的只是一個簽章,生物特徵資料從頭到尾沒有離開裝置。

相關術語: credentials (一種)、multi-factor authentication (常作為其中一因素)

出處:第 8 段「並排總結:一次 vs 每次」

401 Unauthorized

401(其實是「未認證」)

HTTP 狀態碼,表示請求缺少有效的身分憑證,需要先認證。

名稱是規格留下的誤稱:它講的是 authentication 而不是 authorization。伺服器回 401 時應該附上 WWW-Authenticate 標頭,說明該用哪種方式認證。實務上常見的錯誤是 token 過期卻回 403,導致前端不知道該去換發新 token,只能把使用者踢回登入頁。

相關術語: 403 Forbidden (對照組)、authentication (對應失敗)

出處:第 8 段「並排總結:一次 vs 每次」

403 Forbidden

403(禁止存取)

HTTP 狀態碼,表示身分已確認,但這個使用者無權存取該資源。

403 是授權失敗的正確回應。它有一個微妙的取捨:明白告訴對方「這筆資料存在但你不能看」,本身就洩漏了資料存在這件事。所以在敏感情境下,有些系統刻意用 404 取代 403,讓沒有權限的人無法從回應推斷資源是否存在——安全性與可用性在這裡是對立的,要視情境選。

相關術語: 401 Unauthorized (對照組)、authorization (對應失敗)

出處:第 8 段「並排總結:一次 vs 每次」

留給下一段 概念收束了,但整支影片到這裡沒有出現過任何一行程式。留給下一段的是作者自己也要承認的落差:想清楚很容易,做對不容易。

9. 難的是實作,下一步是 Auth0 4:51–5:40

作者提醒:這兩者是安全 web app 設計的重要部分,但不容易做對、做好。他預告後續會介紹 Auth0 這個服務代勞認證的粗活,並示範在 .NET Core 與 NestJS 裡實作 authorization 與 authentication。這替觀眾指出從概念到實作的下一段路。

承上 接住上一段留下的落差:兩句話已經能背了,但作者立刻提醒背下來不等於做得對。他在這裡承認難度,並指出接下來該往哪走。

推理因為上一段把兩個概念壓縮成兩句可以背的話,所以作者必須馬上補上一句相反方向的提醒:這兩件事是安全 web app 設計的重要部分,但不容易做對、做好。順著這句,他給出兩條具體的下一步——介紹 Auth0 這個服務,把認證的粗活交出去;以及在 .NET Core 與 NestJS 裡實際實作一次 authorization 與 authentication。整支影片於是從「分辨兩個字」,收在「接下來去哪裡」。

AI 補充作者說 Auth0 代勞的是「認證」的粗活,這個用字其實透露了一個重要的分野,值得補完:認證的難處在於一大堆跟你的業務完全無關、卻極容易做錯的細節——密碼儲存與雜湊、暴力破解與速率限制、多因素、社交登入、帳號復原、session 與 token 生命週期。這些每個產品的需求幾乎一樣,所以外包給專門的服務是合理的。授權剛好相反:規則來自你的業務本身(誰可以建立付款、誰能看哪個部門的資料),沒有人比你更清楚,也沒有服務能替你決定。外部服務能提供的是承載與執行規則的機制,規則本身仍得你自己設計。這解釋了為什麼作者說 Auth0 做的是認證的重活,而不是把兩件事一起交出去。另外補一個時間背景:Auth0 在這支影片上傳前一個月(2021 年 5 月)剛被 Okta 併購,現在通常被歸在 Okta 的產品線下,同類型的選擇還有 Keycloak(開源、可自架)、AWS Cognito、Firebase Authentication 等。

術語:Identity ProviderOpenID Connect

Identity Provider

身分提供者(IdP)

專門負責保管使用者身分、執行認證並發出 token 的外部服務。

把 IdP 拉出來的好處是「誰是誰」只有一份,多個應用共用同一套登入,也順便換來單一登入。Auth0、Keycloak、Okta、Google 都扮演這個角色。要注意 IdP 替你做的是認證,授權規則通常仍留在你的應用裡——IdP 頂多幫你把角色寫進 token,決定哪個角色能做什麼仍是你的事(見第 7 段)。

相關術語: Auth0 (一種)、authentication (代為執行)

出處:第 9 段「難的是實作,下一步是 Auth0」

Auth0

Auth0(身分認證服務)

把登入、註冊、多因素、社交登入、token 發放整套包起來的商用身分服務。

它的定位就是作者說的「代勞認證的粗活」:你不必自己實作密碼雜湊、暴力破解防護、帳號復原這些跟業務無關卻容易出錯的部分。它也能幫你把角色與權限寫進發出的 token,但那些規則長什麼樣仍要你自己定義。影片上傳前一個月(2021 年 5 月)Auth0 被 Okta 併購,目前屬於 Okta 產品線;同類選擇還有可自架的 Keycloak、AWS Cognito、Firebase Authentication。

相關術語: Identity Provider (一種)

出處:第 9 段「難的是實作,下一步是 Auth0」

OpenID Connect

OpenID Connect(OIDC)

架在 OAuth 2.0 之上的認證協定,規範應用如何向身分提供者取得使用者的身分。

這個協定正好對應影片的主題分工:OAuth 2.0 原本解決的是授權(讓某個應用代表你去存取某個資源),OIDC 在它上面補了認證那一塊,多發一個 ID token 專門說明「使用者是誰」。所以實務上你會拿到兩張票:ID token 用來知道使用者是誰,access token 用來去存取資源(見第 3 段)。理解這個分層之後,接各家 IdP 的流程幾乎是同一套。

相關術語: Identity Provider (通訊協定)、access token (產出)

出處:第 9 段「難的是實作,下一步是 Auth0」

留給下一段 總結收束。

4. 總結

作者刻意不從定義出發。他先把「這兩個字常被混為一談」當成起點,並宣告要講的是兩者如何合作而非二選一,於是整支影片的任務變成:在同一個場景裡把分工演出來。他搬出辦公大樓——輸入識別碼、被掃臉、拿到一張編碼了身分與角色的通行證,這就是 authentication;接著一比一翻譯成 web 版本:credentials 換 token,通行證上的角色換成 token 上的角色,並順手量了一個關鍵指標——這通常一個 session 只發生一次。這把尺是全片的轉軸。有了它,他才能指出認證的邊界:它擋得住匿名者,卻擋不住一個已經拿到 token 的人去碰你不想給他的資源,authorization 因此是被缺口逼出來的,不是硬塞的。回到同一棟大樓,他讓你帶著已到手的通行證去撞頂樓那扇門——連問三句「你有通行證、你已認證、你在大樓裡」,把認證這個變數釘死,讓紅燈只剩一個原因:讀卡機讀了通行證上的角色。同一張通行證在自己辦公室門口卻亮綠燈,於是差別只可能在「這扇門要求什麼」。抽成規則就是:每一次資源存取都要檢查 token 上的 roles——第 3 段那把尺在這裡完成對照,認證一次、授權每次。最後他把 role 剖開:role 是給人看的分類,permission 是給資源看的動作,付款管理員含有 create payments 與 read payments,判斷流程跑一次就落地成程式。全片收在兩句並排的定義與一個誠實的提醒:想清楚容易,做對不容易,下一步是 Auth0 與實際框架裡的實作。

勘誤總整理

確定錯誤/已過時見仁見智(取決於版本或情境)

段落原話(transcript 逐字)說明
3. Web 版的認證:換成 token
1:14
「make sure the password matches that stored in the database」照字面聽會以為資料庫裡存著密碼、拿來直接比對。現行做法不會儲存密碼本身,而是存加鹽的單向雜湊(bcrypt、scrypt、Argon2);登入時是把使用者送來的密碼用同樣方式算一次,比對雜湊值。差別很實際:資料庫外洩時,前者等於所有人的密碼一起外流,後者攻擊者拿到的只是難以還原的雜湊。作者這裡是為了講流程而簡化,但這句正好是最常被初學者照字面實作的一句。
依據: OWASP Password Storage Cheat Sheet;NIST SP 800-63B 對密碼儲存的要求
3. Web 版的認證:換成 token
1:30
「The access token normally has an expiry time, so the user only has to authenticate perhaps once per day.」「一天認證一次」這個體感沒錯,但撐住它的通常不是 access token 的到期時間。現行 OAuth 2.0 實務建議 access token 短命,常見是 5 到 60 分鐘;使用者之所以不必一直登入,是因為背後有 refresh token 或 session cookie 在默默換發新的 access token。把兩者混為一談,容易寫出把 access token 有效期設成一天的實作,等於讓一張被竊的權杖有一整天的通行權。
依據: RFC 9700(OAuth 2.0 Security Best Current Practice)建議縮短 access token 存活期並搭配 refresh token
6. 每次存取都要再檢查一次
3:11
「by checking the roles encoded on the access」只讀 token 上的角色來判斷授權,是最省事的做法,但它把「這個人現在的權限」換成了「發證當下的權限」。使用者被降權或離職後,手上那張還沒到期的 token 依舊帶著舊角色通行;同樣地,剛被加上的權限也要等換發新 token 才生效。權限敏感的系統通常會補上一層:縮短 token 壽命、維護撤銷清單,或在關鍵操作時回查授權服務。作者這裡講的是通則性的做法,沒有錯,但值得知道它的代價。
依據: RFC 9700(OAuth 2.0 Security BCP)關於 token 生命週期與撤銷的討論;OWASP Broken Access Control

5. 推薦三個下一步

1. 往下挖深:token 裡面到底裝什麼、怎麼被驗證

影片把 token 當成一個「上面編碼了身分與角色」的黑盒子,沒說它長什麼樣、伺服器憑什麼相信它沒被竄改、過期後怎麼續。這是把這套概念寫成程式時第一個會卡住的地方。

YouTube 搜尋:JWT explained signature verification access token vs refresh token JWT claims tutorial OAuth 2.0 explained

2. 往旁邊對照:RBAC 以外的授權模型

影片只示範了 role 包 permission 這一種模型。真實系統常遇到「同一個 role 只能改自己部門的資料」這類條件,單靠 role 判不出來,需要看 ABAC 或 ReBAC 才知道邊界在哪。

YouTube 搜尋:RBAC vs ABAC explained ReBAC Google Zanzibar authorization models comparison policy based access control OPA

3. 往上應用:在真實框架裡實作一次

作者自己在結尾承認想清楚容易、做對不容易,並指出 Auth0 與 .NET Core / NestJS 兩條路。實際接一次才會遇到影片沒談的:token 要放哪、如何撤銷、授權檢查該寫在哪一層。

YouTube 搜尋:NestJS guards roles authorization tutorial ASP.NET Core authorization policies Auth0 quickstart authorization middleware best practices

📄 全部影片 · 主題區: Web 安全