Skip to content

[auth] OAuth 로그인 state 발급·검증 추가 - #579

Merged
yeondon125 merged 16 commits into
developfrom
fix/oauth-state-verification
Nov 12, 2026
Merged

yeondon125 merged 16 commits into
developfrom
fix/oauth-state-verification

Conversation

@yeondon125

Copy link
Copy Markdown
Member

개요 💡

OAuth 로그인 요청의 state를 무작위 값으로 발급하고, 콜백에서 발급한 값과 일치할 때만 로그인을 진행하도록 변경하였습니다.

작업내용 ⌨️

  • 클라이언트 앱에 로그인 시작 Route Handler GET /api/auth/oauth?provider=google|kakao[&admin=true]를 추가하였습니다.
    • crypto.randomUUID()로 state를 발급하여 httpOnly·SameSite=Lax·Max-Age 10분 쿠키에 저장하고, Google/Kakao 인가 URL로 302 리다이렉트합니다.
    • 쿠키 이름은 https에서 __Host-hellogsm-oauth-state, 로컬 http에서 hellogsm-oauth-state입니다.
    • redirect_uri는 요청 origin + /callback으로, 콘솔에 등록된 경로는 그대로입니다.
  • app/callback/page.tsx에서 쿠키와 state를 비교하고, 일치하면 쿠키에 함께 저장한 흐름(google/kakao/admin)을 CallbackPage에 전달하였습니다. 일치하지 않으면 로그인 요청 없이 기존 실패 처리(메인 이동 + "로그인에 실패했습니다." 토스트)를 따릅니다.
  • LoginButton은 인가 URL을 직접 만들지 않고 로그인 시작 경로로 이동하도록 변경하였습니다. 어드민은 기존처럼 getClientOrigin으로 계산한 클라이언트 origin의 경로로 이동하므로, 쿠키 발급과 검증이 모두 클라이언트 origin에서 이루어집니다.
  • state 발급·검증과 인가 URL 생성을 oauthState.ts의 순수 함수로 분리하고 단위 테스트를 추가하였습니다.
  • E2E: 어드민 로그인 링크·302 응답 검증을 새 구조에 맞게 수정하고, 쿠키 없는 콜백 접근 테스트를 추가하였습니다.

검증

  • pnpm check-types, pnpm lint(오류 0), pnpm --filter client test(28개 통과)
  • next build 후 e2e/admin.spec.ts, e2e/client.spec.ts 8개 통과
  • 로컬 프로덕션 서버에서 google·kakao·admin 각각 발급된 state로 콜백 시 로그인 요청이 1회 전송되고, 다른 state로 콜백 시 전송되지 않는 것을 확인하였습니다.
  • 실제 Google/Kakao 로그인 완료와 모바일 인앱 브라우저는 확인하지 못하였습니다.

리뷰 요청사항 👀

  • 배포 순서: 어드민의 로그인 링크가 클라이언트의 새 경로를 가리키므로, client를 admin보다 먼저(또는 동시에) 배포해야 합니다. 경로가 없으면 /api/:path* rewrite로 백엔드에 전달되어 404가 됩니다.
  • 배포 직전에 페이지를 열어 둔 사용자는 이전 링크로 돌아와 한 번 로그인에 실패할 수 있습니다(새로고침 후 정상).
  • 쿠키는 10분 후 만료되며 콜백에서 삭제하지 않습니다. 제공자 화면에서 10분을 넘기거나, 두 탭에서 동시에 로그인을 시작하면 먼저 시작한 쪽이 실패합니다.
  • 카카오톡 등 인앱 브라우저에서 로그인 도중 외부 브라우저로 전환되는 경우 쿠키가 없어 실패할 수 있어, stage에서 모바일 확인을 부탁드립니다.
  • 일반 사용자 로그인 버튼이 마운트 후가 아니라 SSR 시점부터 렌더됩니다(href가 고정값이라 hydration 불일치는 없습니다).

@yeondon125 yeondon125 self-assigned this Nov 11, 2026
@vercel

vercel Bot commented Nov 11, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
hellogsm-client-26 Ready Ready Preview Nov 12, 2026 12:26am UTC
hellogsm-client-26-admin Ready Ready Preview Nov 12, 2026 12:26am UTC

Request Review

@pr-agent-demo

pr-agent-demo Bot commented Nov 11, 2026

Copy link
Copy Markdown

⚠️ Auto-review failed: Summary generation failed: summary generation failed: Connection error.. Inline review failed: review agent stream failed: Connection error.. Retry with /review.

@s2yeons

s2yeons commented Nov 11, 2026

Copy link
Copy Markdown
Member

일부러 main으로 가도록 pr 올리신건가요?

@s2yeons

s2yeons commented Nov 11, 2026

Copy link
Copy Markdown
Member

/review

@pr-agent-demo pr-agent-demo Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

개요
OAuth 로그인 시작 시 state를 발급해 쿠키에 저장하고, 콜백에서 쿠키 값과 일치할 때만 로그인을 진행하도록 추가한 PR입니다. 로그인 URL 생성 로직도 Route Handler와 순수 함수로 분리하고 테스트·E2E를 함께 추가했습니다.

Intent
state 파라미터만 신뢰하던 기존 OAuth 흐름에서 CSRF/콜백 위조를 완화하고, Google/Kakao/어드민 로그인에서 발급·검증 책임을 명확히 하려는 의도로 보입니다.

Risk
x-forwarded-host/x-forwarded-proto 기반 origin 추론, 쿠키 이름·__Host-·SameSite·Secure 처리, 콜백 검증 실패 시 UX, 10분 만료와 쿠키 미삭제, 인앱 브라우저 쿠키 유지 문제, client/admin 배포 순서 의존성을 집중적으로 확인해야 합니다.


6 inline comment(s)

Comment thread apps/client/src/app/callback/page.tsx Resolved
Comment thread e2e/client.spec.ts Resolved
@vercel
vercel Bot temporarily deployed to Preview – hellogsm-client-26-admin November 12, 2026 00:03 Inactive
@yeondon125
yeondon125 changed the base branch from main to develop November 12, 2026 00:07
@yeondon125

Copy link
Copy Markdown
Member Author

일부러 main으로 가도록 pr 올리신건가요?

develop 으로 수정하였습니다.

@s2yeons s2yeons left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수고하셨습니다

@yeondon125
yeondon125 merged commit a363d08 into develop Nov 12, 2026
4 checks passed
@yeondon125
yeondon125 deleted the fix/oauth-state-verification branch November 12, 2026 05:04

This branch was successfully deployed

2 active deployments
Preview – hellogsm-client-26 — f33680df Deployed Nov 12, 2026 by vercel[bot]
Preview – hellogsm-client-26-admin — f33680df Deployed Nov 12, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants