SPA + OAuth 2.0 / Open ID Connect (OIDC) + API (Microsrvices)を実装する際に注意したいこと

f:id:tworks55:20200506134052p:plain f:id:tworks55:20200506134120j:plain:w250

SPAアプリでOAuth 2.0/Open ID Connect (OIDC)の実装を検討しているのですが、調べているうちに様々な注意点が出てきたのでまとめておきます。

まずはOauth 2.0における注意点。

認可のフローは以下4つのフローがありますが、

  1. Authorization Code Grant
  2. Implicit Grant
  3. Resource Owner Password Credentials Grant
  4. Client Credentials Grant

セキュリティを考慮すると使えるフローとしては実質1と4しか無いと考えて良さそうです。

(2はIETFで非推奨が決定済、3はSPAアプリケーションに直接パスワードを入力することになるので不可)

SPAでは2を実装し、BackendのMicroservice間の通信は4を実装するイメージ。

こちらのYoutubeが参考になります。

OpenID Connect & OAuth 2.0 – Security Best Practices - Dominick Baier

f:id:tworks55:20200505005452p:plain:w250




そして、実装時には以下についても詳細な検討が必要です。

考慮が必要な実装 出自 実装領域 参考サイト 目的
state OAuth 2.0 protocol RFC6749 アプリ OpenID Connectのstateとnonceの違いがわからなかった - Qiita CSRF対策
nonce OpenID Connect specification アプリ OpenID Connectのstateとnonceの違いがわからなかった - Qiita ID Token偽造対策
PKCE (Proof Key for Code Exchange by OAuth Public Clients) OAuth 2.0 protocol RFC7636 アプリ PKCE: 認可コード横取り攻撃対策のために OAuth サーバーとクライアントが実装すべきこと - Qiita 認可コード横取り攻撃対策
DPoP (Demonstration of Proof-of-Possession at the Application Layer) draft-ietf-oauth-dpop-01 アプリ 図解 DPoP (OAuth アクセストークンのセキュリティ向上策の一つ) - Qiita Tokenをアプリケーションレベルで "Sender-Constrained Token" にする
mutual TLS OAuth 2.0 RFC8705 インフラ 図解 DPoP (OAuth アクセストークンのセキュリティ向上策の一つ) - Qiita Client/Server間の通信をTLSで限定する

また、Tokenをどこに保存するかを検討する必要があります。

Cookie Local storage Session storage
特徴 BackendのAPIはSPAと同じドメインとする必要がある Javascriptからのアクセス不可(http-only属性による) 期限なくtokenが保存されブラウザセッションが閉じてもデータは残る Javascriptから常にアクセス可能 tokenはセッション内でのみ有効でtabもしくはWindowをとじると削除される Javascriptから常にアクセス可能
リスク CSRF (Croos Site Request Forgery) XSS (Cross-site scripting) XSS (Cross-site scripting)

Cookieに紐付ける場合は情報を暗号化した上で以下のオプションも考慮が必要です。

  1. httpOnly
  2. SameSite=strict
  3. secure=true
  4. クッキー全体のサイズ制限(4KB)


Tokenをどこに保存するかはこちらも参考になります。

SPAの場合はBrowser in-memoryとシナリオもあるようなのでこれはもう少し深堀が必要です。

Auth0 - Token Storage




その他、以下のサイトやオンラインコースも参考になります。

pluralsight - microservices-security-fundamentals

5.4 Handling of the Access Tokenより

f:id:tworks55:20200506085929p:plain:w300