在開發Web應用程式時,不可避免的一件事就是「身份驗證功能」的實現。 然而,從頭開始自行實現密碼雜湊、會話管理、CSRF 對策、OAuth 整合等會帶來很高的安全風險,並且需要大量的開發成本。
因此,這次我們將介紹一些使用「NextAuth.js」(目前為 Auth.js)實現安全身份驗證的最佳實踐,它是 Next.js 環境中身份驗證的事實標準。
最佳實務 1:基本上優先考慮 OAuth(社群登入)
管理自己的密碼意味著您面臨資訊外洩的風險。 使用 NextAuth.js 時,首先考慮引入社交登入(OAuth 提供者),例如 Google 或 GitHub。設定提供者非常簡單,只需在設定檔中寫入客戶端 ID 和 Secret 並添加幾行程式碼即可建立強大的身份驗證系統。也省去了用戶記住密碼的麻煩,有利於提高註冊率。
最佳實務2:JWT和資料庫會話的區別使用
使用 NextAuth.js,您可以選擇兩種類型的會話保留方法:「JWT(JSON Web 令牌)」和「資料庫會話」。
- JWT 的優點: 無需資料庫查詢,從而實現更快的回應時間和更輕鬆的擴充。預設建議這樣做。
- 資料庫會話的優點: 會話可以輕鬆地立即失效(例如,管理員強制特定使用者登出)。
根據您的要求進行設計,例如需要高安全控制的業務系統的資料庫會話,以及以效能為導向的消費應用程式的 JWT。
最佳實務 3:使用中介軟體確保路由保護
透過將 NextAuth.js 與 Next.js 12 及更高版本中引入的中間件功能結合,您可以堅決阻止對特定頁面(例如「/dashboard/*」)的未經授權的存取。 在組件內使用「useSession」進行重定向的傳統方法存在瞬時螢幕閃爍 (FOUC) 的問題,但透過使用在邊緣端運行的中間件,可以在使用者看到登入畫面之前無縫重定向到登入畫面。
最佳實務 4:嚴格管理金鑰
要在生產環境中執行 NextAuth.js,需要設定環境變數「NEXTAUTH_SECRET」。 這是用於加密令牌的最重要的金鑰,如果它被洩露,將直接導致重大漏洞。請確保您的團隊在部署環境(例如Vercel)的環境變數設定畫面上安全地管理環境變量,並且永遠不要將它們提交到原始程式碼(Git)。
避免重新發明輪子,並將身分驗證的負擔留給受信任的庫。這是現代安全網路開發的黃金法則。

