學習程式語言的過程中,我一直對於資訊安全有著極大的興趣,不論是關於帳密保存,或是Client端與Server端如何互動等等,我都想花時間仔細研究。畢竟如果在這過程中發生任何問題,不只是個人資料會外洩,錢財也可能會有巨大的損失,辛辛苦苦累積起來的名聲也會消失。
在網路上慢慢地蒐集這些資訊,讓我覺得學會資訊安全的關鍵,不只在於學會這些技術,重要的是融會貫通,系統系的理解整個資安的發展,以及現在的技術與實作。
而iT鐵人賽正是一個非常適合的挑戰,讓我把目前學會的關於資安的觀念都整合起來,變成系統化的內容分享給大家,也是驗證自己的整合成果。
在我蒐集與消化內容後,有另一個苦惱浮現在我的腦袋:我要怎麼才能讓內容更生動,讓一般人也能夠理解。
幸運的是,在滑PPT時,無意間看到這篇文章
https://www.ptt.cc/bbs/Militarylife/M.1472097807.A.689.html
裡面的內容是這樣說的:
執夜哨時,安官都要拿口令給哨長。
口令大部分的組成都是:人+事+地
例如:趙飛燕 吃香蕉 我房間
看到這篇後我靈光一閃,感覺資安的權限與授權就像站哨的衛兵,檢核著每個人是否可以通過,遇到長官、同僚、哨官等等不同權限的人又需要不同的方式處理,非常適合作為本次系列文的開場。
口令就像是密碼,經過檢核後就可以通過,長官、同僚、哨官等等人的身份在軍營中通常是由人自己去辨識,但是程式沒有辦法去看,所以會把個人身分夾帶在口令中,程式會根據密碼解析出來的身份,去知道這個人是誰,可以去做什麼事情。
而這就是授權跟認證的過程。從以前到現在的觀念都是如此,但是隨著發展,網路速度提升、硬體設備提高、AI出現,各種的新的登入設備、攻擊方式越來越多,為了因應這些變化,程式也衍生出許多不同的方法來處理。
所以這個系統除了教大家什麼是認證、授權之外,同時也會教大家認證與授權的演化,認證的部分,會從最簡單的帳密登入,一路到最新的OAuth / OIDC / SAML認證,授權的部分也會跟大家介紹RBAC / ABAC的概念,最終做一個簡單的 具備完整認證 + 授權的範例專案。
在寫這篇文章的同時,我也想來試試看Git 的Branch功能,所有的程式碼都放在這個Repo,但不同天數的程式碼會放在不同的Branch中,如下面的圖片所示,大家只要點main,或者是點旁邊的Branches就可以根據自己需要天數調整。
https://github.com/AnsathSean/spring-security-30days.git
我的教學分成五個階段,第一個階段是讓大家了解授權跟權限,以及最基本的Authentication實作。第二個階段開使深入教大家除了最基本的權限之外,開始有Session跟Token的概念。當大家有這些概念之後,第三階段會開始教大家實作Token常用的JWT的做法。當大家熟悉用JWT加密之後,第四階段就會開始帶大家了解到現今主流的授權方法,最後第五階段我們會整合這些方法,讓大家看看目前一個網站是如何進行授權跟權限的方法。
整個階段跟內容如下:
Day 1 系列介紹與學習目標
說明這 30 天系列會帶讀者從 最簡單的帳密登入,一路學到 OAuth / OIDC / SAML / RBAC / ABAC。同時介紹為什麼選 Spring Security 作為教學框架,並設定最終目標:做出一個具備完整認證 + 授權的範例專案。
Day 2 Authentication vs Authorization
解釋兩者的差異,舉例生活案例(刷卡 vs 進會議室),再連接到 Web 系統:使用者登入(Authentication)與 API 權限控制(Authorization)。
Day 3 Basic Authentication (概念篇)
說明最古老的驗證方式,帳號密碼透過 Base64 傳輸。講它的簡單、歷史地位,並指出安全性不足之處。
Day 4 Basic Authentication with Spring Boot 實作
用 Spring Boot Security 設定 Basic Auth,實作一個簡單的 REST API,用 Postman 測試。最後強調為什麼現代專案不推薦使用。
Day 5 Cookie Based Authentication (Session 機制)
介紹 Session 與 Cookie 的互動,伺服器如何保存登入狀態。說明 CSRF、Session 劫持等風險,並鋪墊後續「Token Authentication」的必要性。
Day 6 Cookie Based Authentication with Spring Boot 實作
使用 Spring Security 預設 Session 機制,建立登入頁面與受保護的 API,並展示如何在瀏覽器 Cookie 中保存 Session ID。
Day 7 Token Authentication (概念篇)
解釋為什麼需要 Token(Stateless、分散式架構方便)。比較 Session vs Token,舉例微服務架構下的好處。
Day 8 無狀態請求與自帶資訊的認證方式
展示 沒有 Session 的 API 要怎麼運作:
Day 9 JWT 基礎 (結構篇)
介紹 JWT 的組成:Header / Payload / Signature。用範例解析一個 JWT,並教大家怎麼用 base64 解碼。
Day 10 Java 手動實作 JWT
不用框架,直接用 Java Base64 + HMAC-SHA256 實作最簡單的 JWT。讓讀者真正理解簽名是如何生成的。
Day 11 使用 jjwt 或 java-jwt 套件生成與驗證 JWT
介紹常用 Java JWT 套件,演示如何快速生成 / 驗證 Token,並比較兩種常見套件的差異。
Day 12 JWT 整合 Spring Security
在 Spring Security 中,建立登入 API → 生成 JWT → 請求攜帶 JWT → Filter 驗證。完成一個完整的 JWT 登入流程。
Day 13 JWT 過期與 Refresh Token 機制
解釋 Access Token 應該要短期有效,並展示如何設計 Refresh Token 讓使用者能持續登入。
Day 14 JWT 黑名單與強制登出
處理「如何讓 Token 提前失效」的問題。教如何設計黑名單(存在 Redis),以及強制登出邏輯。
Day 15 JWT 安全性考量
整理 JWT 常見的安全陷阱:敏感資訊不能放 Payload、Token 洩漏風險、Clock Skew 問題。最後提供一些實務建議。
Day 16 OAuth 2.0 基礎概念
介紹 OAuth 的四個角色,為什麼第三方應用需要「代替使用者存取資源」。
Day 17 Spring Boot 實作 OAuth2 Client(以 GitHub 為例)
讓應用程式可以「用 GitHub 登入」,展示 OAuth2 Client 在 Spring Security 的設定。
Day 18 OAuth 2.0 Authorization Code Flow
用圖解完整拆解流程,說明 Authorization Code、Access Token、Redirect URL 的細節。
Day 19 OpenID Connect (OIDC) 概念
解釋 OAuth 只解決授權問題,OIDC 補上身份驗證。講 ID Token 的結構與用途。
Day 20 OIDC with Spring Boot(Google 登入)
使用 Spring Boot 整合 Google OIDC,示範「用 Google 帳號登入網站」。
Day 21 SAML 基礎
說明 SAML 的歷史、XML 格式,特別適合企業單一登入(SSO)。
Day 22 SAML vs OIDC 比較
比較協定的差異(JSON vs XML、Web 應用 vs 企業內部系統)。幫助讀者知道選擇哪一種。
Day 23 Spring Security 整合 SAML
示範如何配置 Spring Security + SAML,模擬企業 SSO 登入流程。
Day 24:Spring Security Authorization 概念
授權 vs 認證,GrantedAuthority
、Role
、Scope
的概念。
Day 25:RBAC 快速介紹
Day 26:ABAC 與資源授權
把「資源控制」和「屬性控制」結合:
Day 27:專案案例 Part 1 — 整合 JWT + OIDC
Day 28:專案案例 Part 2 — 加入授權邏輯 (RBAC + ABAC)
Day 29:專案案例 Part 3 — 進階授權策略與最佳實務
Day 30:總結與未來展望
回顧整個系列,分享自己的收穫以及下一步。
本次的實作技術主要是用Java 的Spring boot Security的框架,會用這個的原因,一來是因為我會,二來是因為Security其實就已經把很多功能都已經做出來,我們只要去使用這些功能就好,這樣會大幅減少授權跟權限開發的過程。
我的IDE是使用Eclipse,如果想要了解Eclipse是如何安裝跟開發,可以參考我之前寫的系列文,當中就有一天就是在說明Eclipse的安裝與教學:
https://ithelp.ithome.com.tw/articles/10351172
那麼,第一天的挑戰賽就到這裡結束,開始我們的30天系列挑戰吧!
大家明天見~