Authentication 與 Authorization:你是誰,和你能做什麼
文字解析 · 1 支影片 · 產生於 2026-10-01 00:54
章節(9)
1. Outline
- 起點 · 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 與實際實作。
推理鏈:每段留給下一段的線索
每一列是一段,箭頭後的字是這段留給下一段的線索。點段落標題跳到該段。
- 兩個最常被混淆的字 → 作者宣告了要講「合作」而不是「取捨」,但到這裡他一個定義都還沒給。留下的問題是:這兩件事放在同一個場景裡,究竟是怎麼分工的?
- 辦公大樓比喻:進得了門 → 故事版的認證演完了,但故事不能拿來寫程式。留給下一段的是一個一對一的翻譯問題:識別碼和臉在 web 應用裡對應到什麼?那張帶著角色資訊的通行證,又是什麼東西?
- Web 版的認證:換成 token → 認證的流程完整了,而且被量了一次頻率:一個 session 一次。但作者接著沒有繼續講怎麼把認證做得更好,反而要問它擋不住什麼——留下的線索是:一個已經拿到 token 的人,還能做什麼你不希望他做的事?
- 認證擋不住的那件事 → 作者到這裡只給了 authorization 一個負面定義——它是用來補認證缺口的東西。它自己是什麼、靠什麼判斷,都還沒說。線索留在第 2 段那張通行證上:上面早就寫了角色,它接下來要派什麼用場?
- 拿著通行證仍被擋在門外 → 紅燈與綠燈說明了授權靠什麼判斷,但還沒說這個判斷該多常做。大樓裡是每一扇門都裝了讀卡機——留給下一段的是一個節奏問題:web 應用裡的「每一扇門」,究竟是什麼?
- 每次存取都要再檢查一次 → 規則有了,但「檢查 roles」裡的 role 到現在仍然只是一個寫在通行證上的字——它裡面裝什麼、粒度多細,都還沒拆開。留給下一段的是:role 到底是由什麼組成的?
- 會計軟體:role 包住 permission → 兩層結構與完整的判斷流程都齊了,兩個概念也各自量出了頻率。剩下的是把散在前面各段的定義收回同一個畫面——線索是:如果只能留兩句話給讀者,該留哪兩句?
- 並排總結:一次 vs 每次 → 概念收束了,但整支影片到這裡沒有出現過任何一行程式。留給下一段的是作者自己也要承認的落差:想清楚很容易,做對不容易。
- 難的是實作,下一步是 Auth0
3. 逐段說明
Authorization vs Authentication - Whats the Difference? | Developer Concepts Explained
1. 兩個最常被混淆的字 0:00–0:22
作者開門見山問:authorization 和 authentication 到底是什麼、差在哪、你的應用需要哪一個。他指出這兩個概念經常被混為一談,而這支影片要說明它們如何「合作」保護 API——注意他從一開始就把兩者定位成互補而非二選一。
推理因為 authorization 和 authentication 在日常用語裡幾乎被當成同義詞,所以作者不先給定義,而是先把問題攤成三句:它們各是什麼、差在哪、你的應用需要哪一個。接著他補上第四句,也是真正決定整支影片走向的一句——他要講的是這兩件事「如何一起」保護 API。這句話等於先否定了第三個問題裡「二選一」的暗示:答案不是挑一個,而是兩個都要,只是各管一段。
AI 補充值得補的是這兩個字為什麼特別容易混:它們都以 auth 開頭、程式庫裡都縮寫成 auth(`authMiddleware`、`auth.js` 到底是哪一個?),而且常常被塞進同一個 middleware 一起執行。連 HTTP 協定自己都搞錯過——狀態碼 401 的正式名稱是 Unauthorized,但它真正的意思是「你還沒認證」,而「認證過了但沒權限」是 403 Forbidden。也就是說,這個混淆不只是初學者的問題,它已經固化在我們每天用的工具與規格裡,所以值得花一支影片把它分乾淨。
2. 辦公大樓比喻:進得了門 0:22–1:04
作者用一個真實場景取代定義:你到高科技公司上班,在門禁鍵盤輸入識別碼,保全系統掃你的臉。系統做兩件事——確認這個識別碼屬於某位員工,並比對臉部資料確認你就是本人。通過後發給你一張通行證,證件上編碼了你的身分資訊與你在公司裡的角色。這整段就是真實世界的 authentication。
推理因為上一段刻意不給定義,所以作者接著用一個幾乎每個人都做過的動作來代替定義:在門禁鍵盤輸入識別碼、被掃臉、拿到通行證。他把保全系統的動作明確拆成兩步——先確認這個識別碼屬於一位在這裡工作的員工,再拿臉部掃描比對檔案,確認你就是你聲稱的那個人——然後才把名字補上:你剛剛經歷的就是真實世界的 authentication。順序是刻意的:先有體感,再有名字,這樣名字就不會退回成一個和另一個字長得很像的空殼。
AI 補充作者拆出的兩步其實有各自的名字,值得分開看:輸入識別碼是 identification(你宣稱你是誰),掃臉是 verification(證明你的宣稱為真)。少了第二步,任何人知道你的識別碼就能變成你——這也是為什麼真實的門禁很少只有鍵盤。另外,這段有一句容易滑過去、但其實是整支影片最重要的伏筆:「通行證上編碼了你的資訊與你在公司裡的角色」。這代表認證的產物不只是一個「通過/不通過」的布林值,而是一張帶著資料的憑據。如果通行證上只寫「此人已認證」,那麼大樓裡每一扇門都無從判斷該不該開——後面所有的推論都建立在「這張證上寫了角色」這件事上。
術語:credentialsmulti-factor authentication
3. Web 版的認證:換成 token 1:04–1:40
作者把比喻一比一搬到 web 應用:使用者交出帳號密碼這組 credentials,系統確認這個使用者存在、密碼與資料庫相符,然後發出一個 token。token 上編碼了使用者是誰、以及他在應用裡的角色——正好對應通行證上的資訊。關鍵在頻率:這通常一個 session 只發生一次,access token 有到期時間,使用者也許一天只認證一次。
推理因為上一段把認證的產物定調為「一張帶資料的憑據」,所以作者接著要證明這個結構在真實系統裡確實成立:使用者交出 credentials → 系統確認這個使用者存在、再確認密碼與資料庫相符 → 發出一個 token,token 上編碼了他是誰以及他在應用裡的角色。翻譯完成之後,他多說了一件故事裡沒有的事——頻率:這通常一個 session 只發生一次,access token 有到期時間,使用者也許一天只需要認證一次。這句聽起來像順帶補充,其實是他等一下要拿來對比的那把尺。
- CAccess token:短期通行證,編碼了身分與角色,取代每次重送密碼→ 畫地圖
- CClaim:token 裡編碼的一項宣稱,例如 sub 是誰、exp 何時過期、roles 是角色→ 畫地圖
- Aaccess token 是短期可撤銷的替身,密碼是外洩就永久失守的長期機密→ 批判類比
- RSession 與 access token 的頻率關係→ 存+回想
AI 補充有兩件作者跳過的事值得補。第一,token 上「編碼的那些資訊」在規格裡有名字,叫 claims(宣稱),例如 sub 是使用者是誰、exp 是到期時間、roles 是角色;後面所有的權限判斷讀的就是這些欄位。第二,為什麼要發 token,而不是每次請求都重送一次帳號密碼?因為密碼是長期祕密,一旦在某次請求中外洩,攻擊者拿到的是永久通行權;token 則是短期、可設定到期、可以撤銷、還能限定用途的替代品。換句話說,發 token 這一步的重點不只是方便,而是把「長期祕密」換成「短期憑據」,讓外洩的損害有時間上限。另外,作者一句帶過的「比對密碼」在實務上並不是字面上那樣做——見本段勘誤。
「make sure the password matches that stored in the database」
「The access token normally has an expiry time, so the user only has to authenticate perhaps once per day.」
4. 認證擋不住的那件事 1:40–2:01
作者指出 authentication 的能力邊界:它擋掉匿名使用者,讓你知道是誰在存取系統,某種程度上也能依「使用者是誰」控制他看到什麼。但它擋不住一個已經通過認證的人去碰你不想給他的資源。這個缺口就是 authorization 存在的理由。
推理因為上一段的 token 讓系統知道了「你是誰」,所以作者接著做一件推理上必要的事:把「知道你是誰」能換來的保護先列出來——擋掉匿名使用者,所以你知道是誰在存取系統;某種程度上也能依據使用者是誰來控制他看到哪些資源——然後在同一句話裡踩煞車。他的轉折句下得很準:你真正還需要的,是一個辦法阻止「已經通過認證的」使用者去存取你不希望他碰的資源。威脅的身分在這一句裡從外人變成了內部人,門檻也就從「你是誰」變成「你能做什麼」。authorization 是被這個缺口逼出來的,不是作者硬塞進來的。
- CIDOR:改網址上的 id 就看到別人的資源,認證通過但授權缺失的典型漏洞→ 畫地圖
- A把權限寫死成 if user.id === 42,就像程式裡到處散落的硬編碼特例→ 批判類比
- E把網址 /invoices/1001 改成 /invoices/1002,直接看到別人的帳單→ 存+演練
- P手動測一次自己的 API 有沒有 IDOR 漏洞→ 練習
- RAnonymous access:認證擋下的是匿名使用者→ 存+回想
AI 補充作者說「某種程度上你可以根據使用者是誰控制他看到什麼」,這一步其實已經在做授權了,只是把授權規則直接寫死在身分上(`if user.id == 42`)。這種寫法在使用者只有幾個時能動,人一多就會散落在程式各處、無人敢改——這正是「把身分」和「能做什麼」拆開的動機。另外值得補一個具體的失敗樣貌:只有認證沒有授權的系統,最典型的漏洞是 IDOR——網址是 `/invoices/1001`,你把它改成 `/invoices/1002` 就看到別人的帳單。攻擊者完全合法地登入、token 完全有效、每一次請求都通過認證,但他拿到了不屬於他的東西。這就是作者說的「認證擋不住的那件事」的實際長相。
術語:anonymous access
5. 拿著通行證仍被擋在門外 2:01–2:49
作者把同一個大樓故事往前推:你想上頂樓看研發實驗室,刷卡卻亮紅燈。你明明有通行證、明明已經在大樓裡——保全系統做的是讀取通行證上編碼的角色,判定你沒有被授權進入那個區域。回到自己的辦公室刷卡就亮綠燈。同一張通行證、不同的門,結果不同,差別只在權限。
推理因為上一段把 authorization 定義成「擋住已經通過認證的人」,所以作者需要一個畫面能同時滿足兩個條件:這個人確實已通過認證,而且確實被擋下來。頂樓的研發實驗室正好——他刻意連問三句「你明明有通行證、你已經通過認證、你人就在大樓裡」,把認證這個變數釘死,讓紅燈的原因只剩下一個:保全系統讀了通行證上編碼的角色,判定你沒有被授權進入那個區域。接著他讓你搭電梯下樓,刷自己辦公室的門,亮綠燈。同一個人、同一張通行證、不同的門,結果相反——差別就只可能出在那扇門要求什麼。
AI 補充這個紅燈綠燈的對照真正的價值,是它把授權判斷的兩個輸入分開了:一邊是主體帶來的(你的角色,寫在證上),一邊是客體要求的(這個區域需要什麼角色才能進)。判斷發生在兩者相遇的那一刻,所以它必然是逐扇門各判各的——這對應到系統設計上一句很重要的話:授權是每個資源自己的事,不能只在入口做一次。還有一個細節值得指出來:讀卡機是因為「沒看到允許的依據」而亮紅燈,不是因為「看到了禁止的規則」。這叫預設拒絕,也是所有存取控制系統應有的預設值——漏寫一條規則的後果應該是打不開門,而不是門大開。作者沒說破這件事,但他描述的行為完全符合。
6. 每次存取都要再檢查一次 2:49–3:14
作者從故事抽出通則:能進大樓不代表能去任何地方。搬到 web 應用,每一次使用者要存取一個資源,應用程式都應該檢查他是否被授權,做法就是檢查編碼在 access token 上的 roles。這裡出現和第 3 段的頻率對照——認證一次,授權每次。
推理因為上一段已經用紅燈綠燈把畫面演完了,所以作者接著只需要把它換成一句可執行的規則:被允許進入大樓不代表被授權去任何地方;相對應地,每一次使用者要存取一個資源,應用程式都應該檢查他是否被授權,通常的做法就是檢查編碼在 access token 上的 roles。這一句同時把前面幾段的零件全部接上——第 3 段發出的 token、第 2 段寫在通行證上的角色、第 5 段那台逐扇門各判各的讀卡機。第 3 段量出的那把尺也在這裡完成對照:認證一個 session 一次,授權每一次存取都做。
- CRBAC:以 role 為單位做授權判斷,檢查 access token 上的 roles→ 畫地圖
- E只在前端隱藏按鈕、或只在 gateway 檢查一次,都不是真正的授權檢查點→ 存+演練
- P檢查自己 API 是不是把授權判斷放在最接近資料的那一層→ 練習
- RToken revocation:只檢查 token 裡的 roles 有個代價→ 存+回想
AI 補充「每次都檢查」聽起來理所當然,但它是實務上最常漏掉的一步,而且失敗的方式很固定。最常見的是把授權寫在前端——沒有權限就不顯示那顆按鈕;畫面看起來對了,但 API 仍然照收請求,任何人用 curl 就繞過去了。第二種是只在 API gateway 或登入時檢查一次,之後內部服務彼此信任,於是一個入口被繞過就全面失守。真正的檢查點必須落在資源被讀寫的那一層,也就是最接近資料的地方。另外,作者說的「檢查 token 上的 roles」是最簡單也最快的做法,但它有一個內建的代價——見本段勘誤。
術語:RBACtoken revocation
「by checking the roles encoded on the access」
7. 會計軟體:role 包住 permission 3:14–4:15
作者用會計軟體把 role 拆得更細:公司負責人、付款管理員(可執行付款、看銀行帳戶)、文書人員(只能基本資料輸入)。每個 role 包住一組更細的 permission,例如付款管理員含有 create payments 與 read payments。使用者要「建立付款」時,應用程式檢查他有沒有那個 role 或那個 permission,沒有就拒絕——即使他已經通過認證。最後點明頻率差異:授權每次都做,認證一個 session 一次。
推理因為上一段的規則停在「檢查 roles」,所以作者接著必須說明 role 內部的結構,否則這條規則無法落地成程式。他先列三個角色:公司負責人、付款管理員(可執行付款、看銀行帳戶)、文書人員(只能做基本資料輸入、只看得到有限的資料);再說每一個角色都包住一組更細的 permission,並舉例付款管理員這個 role 含有 create payments 與 read payments。兩層於是分開了:role 是給人看的(你是哪一類人),permission 是給資源看的(可以做哪一件事)。接著他完整跑一次判斷:使用者要建立付款 → 檢查他有沒有 payment administrator 這個 role、或有沒有 create payments 這個 permission → 有就放行,沒有就拒絕,即使他已經通過認證。最後他把兩者的頻率並排說出來——授權每次都做,認證一個 session 一次——親手驗收了第 3 段量下的那把尺。
- CPermission:給資源看的「可以做哪一件事」,比 role 更細一層→ 畫地圖
- CPrinciple of least privilege:新角色從零權限開始逐項加,不是從管理員複製再刪→ 畫地圖
- E付款管理員 role 包含 create payments 與 read payments 兩個 permission→ 存+演練
- R角色數量失控時該換的模型→ 存+回想
AI 補充為什麼要多一層,而不是把權限直接掛在人身上?因為這兩件事的變動速度不一樣:permission 隨功能長(每加一個功能就多幾個),role 隨組織長(每來一個員工就要指派)。中間隔一層 role,「新增一個功能」和「新來一個同事」就不會互相干擾——新功能只需要決定掛進哪些角色,新同事只需要指派角色。另外要補作者沒說的兩個實務問題。第一是角色設計的預設值:新角色該從零權限開始逐項加,而不是從管理員複製再刪——後者幾乎必然留下多餘的權限。第二是角色爆炸:當規則開始出現「只能看自己部門的付款」這種條件時,用角色表達就得切出「北區付款管理員」「南區付款管理員」……角色數量開始失控,這時該換的是模型而不是再多切幾個角色。
術語:principle of least privilegeABAC
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
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
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
- 接著看 →Content Security Policy explained | how to protect against Cross Site Scripting (XSS) · 這站發出的 access token,正是 XSS 要偷的東西
- 接著看 ←15 Fullstack Concepts Every Frontend Should Know · 講完 HTTP 與 API 之後,再看誰能呼叫哪一個
- 接著看 ←How Frontend Engineers can master the Full-stack · 全端基礎談到登入,這站把權限那一半拆開
- 相關 —Cross-Site Request Forgery (CSRF) Explained · 那站講 session 怎麼認人,這站示範那份 session 怎麼被別的網站借用