Authentication
非原創文章,內容整理自
這篇文章主要說明常見的使用者登入驗證機制。
Security Elements
- Identity
- Authentication
- Authorization
Authentication
Password Authentication
-
HTTP Basic Access Authentication
- Limitations
- Interception
- Easy to forget
- Limitations
-
Session-Cookie Authentication
-
方式
- 使用者登入後,server 會建立一組 session,並把這組 session 保存在資料庫或 redis 中。session 中通常會包含 user ID、expiration time 等資料。接著,Server 會以 Cookie 的方式把 Session ID 回傳給使用者。
- 使用者後續 再操作網站時,都會透過 Cookie 把 Session ID 傳給 Server,Sever 便會透過 Cookie 中的 Session ID 來驗證、辨認目前登入的使用者的身分。
-
優點
- 要撤銷使用者登入的權限非常容易,當使用者被盜帳號時,可以透過 server 直接把 session 給清除
-
Limitations
- 在分散式系統中,所有的服務都需要存取同一個保存 session 的資料庫(Centralized Session Store),這會導致服務的 latency 增加
- Requires memory for storage
- Susceptible to session hijacking attacks: XSS
- Vulnerable to CSRF
- Difficult to scale
- Less convenient for mobile native applications
-
-
Token-Based Authentication
-
Basic Token Authentication
- Limitations
- Token can be vulnerable to theft
- Limitations
-
JWT
- 方式
- 在加密 JWT 時,常見的加密方式包含
- HMAC
- 屬於對稱加密,同一把鑰匙會用來 sign 和 verify token
- 速度較快,但安全性相較之下較差,密碼被竊取的話,其他人就有機會簽發假的、但有效的 JWT
- RSA 和 ECDSA
- 屬於非對稱加密,使用私鑰加密(簽發 JWT)、公鑰解密(驗證 JWT)。用來簽發 JWT 的私鑰比較不容易被竊取;任何服務則都可以用公鑰來驗證 JWT 的有效性。
- 缺點是會增加系統的負載
- 要用哪一種加密方式取決於對安全性的要求,如果是 monolith App 使用對稱加密也許就足夠了(因為 sign 和 verify JWT 都在同一個 server 處理);但如果是 microservice architecture 的話,如果選擇對稱加密,表示鑰匙會在不同服務間被 share,這就增加了鑰匙被竊取的風險,這時候則需考慮使用非對稱加密。
- HMAC
- 由於 JWT 沒辦法即時把使用者登出,因此比較好的做法是提供「效期較短(15mins)的 access token」,搭配「效期較長的 refresh token」,如此,當使用者 access token 過期需要更新 token 時,就有重新驗證使用者的機會。
- 在加密 JWT 時,常見的加密方式包含
- 優點
- 不需要額外紀錄使用者登入的資訊
- 驗證的時候直接驗證 JWT,不需要存取資料庫,更利於 client scaling
- Limitations
- token size limitation
- 沒辦法即時把使用者登出
- 方式
-
比較 Session based 和 JWT Authentication
兩者比較明顯的差異是把和使用者相關的驗證訊息「保存在哪」。Session based Authentication 會把這些資訊保存在資料庫,由 server 自己管理,使用者每次發 request 時,server 要查詢使用者登入的有效狀態;JWT 則是把這些資訊丟回給使用者,請使用者每次發 request 時都帶上這個資訊,server 直接根據 JWT 驗證登入的有效狀態。
Passwordless Authentication
- OTP (One Time Password)
- SSO (Single Sign-On)
- OAuth 2.0 and OCID (OpenID Connect)
- Biometric Authentication
Multi-Factor Authentication (MFA)
- Time-based OTP
- Passwordless Authentication with FIDO (WebAuthn, CTAP)