Repository navigation
[auth] OAuth 로그인 state 발급·검증 추가 - #579
Conversation
…rd-notice-popup [notice] 생기부 간인 안내 팝업 제거 및 결핵검사 안내 팝업 추가
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
|
|
일부러 main으로 가도록 pr 올리신건가요? |
|
/review |
There was a problem hiding this comment.
개요
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)
develop 으로 수정하였습니다. |
개요 💡
OAuth 로그인 요청의
state를 무작위 값으로 발급하고, 콜백에서 발급한 값과 일치할 때만 로그인을 진행하도록 변경하였습니다.작업내용 ⌨️
GET /api/auth/oauth?provider=google|kakao[&admin=true]를 추가하였습니다.crypto.randomUUID()로state를 발급하여 httpOnly·SameSite=Lax·Max-Age 10분 쿠키에 저장하고, Google/Kakao 인가 URL로 302 리다이렉트합니다.__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의 순수 함수로 분리하고 단위 테스트를 추가하였습니다.검증
pnpm check-types,pnpm lint(오류 0),pnpm --filter client test(28개 통과)next build후e2e/admin.spec.ts,e2e/client.spec.ts8개 통과state로 콜백 시 로그인 요청이 1회 전송되고, 다른state로 콜백 시 전송되지 않는 것을 확인하였습니다.리뷰 요청사항 👀
/api/:path*rewrite로 백엔드에 전달되어 404가 됩니다.