跳至主要内容

Authentication

這篇文章主要說明常見的使用者登入驗證機制。

Security Elements

  • Identity
  • Authentication
  • Authorization

Authentication

Password Authentication

  • HTTP Basic Access Authentication

    • Limitations
      • Interception
      • Easy to forget
  • Session-Cookie Authentication

    image-20240804000909468

    • 方式

      • 使用者登入後,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
    • JWT

      image-20240804001428462

      • 方式
        • 在加密 JWT 時,常見的加密方式包含
          • HMAC
            • 屬於對稱加密,同一把鑰匙會用來 sign 和 verify token
            • 速度較快,但安全性相較之下較差,密碼被竊取的話,其他人就有機會簽發假的、但有效的 JWT
          • RSA 和 ECDSA
            • 屬於非對稱加密,使用私鑰加密(簽發 JWT)、公鑰解密(驗證 JWT)。用來簽發 JWT 的私鑰比較不容易被竊取;任何服務則都可以用公鑰來驗證 JWT 的有效性。
            • 缺點是會增加系統的負載
          • 要用哪一種加密方式取決於對安全性的要求,如果是 monolith App 使用對稱加密也許就足夠了(因為 sign 和 verify JWT 都在同一個 server 處理);但如果是 microservice architecture 的話,如果選擇對稱加密,表示鑰匙會在不同服務間被 share,這就增加了鑰匙被竊取的風險,這時候則需考慮使用非對稱加密。
        • 由於 JWT 沒辦法即時把使用者登出,因此比較好的做法是提供「效期較短(15mins)的 access token」,搭配「效期較長的 refresh token」,如此,當使用者 access token 過期需要更新 token 時,就有重新驗證使用者的機會。
      • 優點
        • 不需要額外紀錄使用者登入的資訊
        • 驗證的時候直接驗證 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)