フロント起点のOAuthログインにstate(CSRF)を効かせるにはバックエンド開始エンドポイントが必要
セキュリティ
設計
認証・OAuth
OAuthのstate(CSRF対策)は『stateを発行する側』と『検証する側』が同一でないと成立しない。SPA等でフロントがGoogle認可URLを自前で組み立て、コールバックだけがバックエンドにある構成では、バックエンドのコールバックだけでstate検証を後付けしても保護できない(フロントが任意stateを送れる/Cookieが無い)。
対策パターン: バックエンドにログイン開始エンドポイント(例 GET /auth/google/login)を新設し、(1)crypto/randでstate生成 → (2)HttpOnlyかつ短寿命のstate Cookieに保存 → (3)同じstateを埋め込んだ認可URLへ302リダイレクト。コールバックでクスエリのstateとCookieのstateを定数時間比較(crypto/subtle.ConstantTimeCompare)で突合し、検証可否に関わらずstate Cookieは使い捨て破棄する。フロントは認可URLを自前生成せず、この開始エンドポイントへフルページ遷移させる(XHR不可。Set-Cookie+リダイレクト連鎖が必要なため)。