Skip to content

[FIX] OAuth 토큰 교환 redirect_uri 동적 처리 - 다중 프론트 도메인 지원 #512

@minij02

Description

@minij02

✨ 버그 설명

구글/네이버/카카오 OAuth 로그인이 develop 프론트(https://promptplace-develop.vercel.app)와 프론트 개발자 로컬(http://localhost:5173)에서 dev 백엔드(promptplace-dev.kro.kr)를 통해 진행될 때 redirect_uri_mismatch로 실패한다.

원인: src/auth/services/auth.service.ts:17getCallbackUrl()NODE_ENV 단일 분기로 callback URL을 결정. 단일 백엔드 인스턴스가 단일 callback URL만 사용하므로 여러 프론트 도메인(vercel-dev / localhost / 운영)을 동시에 지원하지 못함.

✨ 흐름 분석

  1. 프론트가 자신의 origin에 맞는 redirect_uri로 OAuth 인증 시작
  2. Provider가 그 URL로 code 돌려줌
  3. 프론트가 code를 백엔드 토큰 교환 엔드포인트로 전달
  4. 백엔드가 code로 Provider에 토큰 교환 요청 → 이때 redirect_uri가 1번과 달라서 mismatch

✨ 해결 방향

프론트가 토큰 교환 시 자기가 사용한 redirect_uri를 함께 전달하고, 백엔드는 화이트리스트 검증 후 그 값을 그대로 Provider에 보낸다.

✨ 개발 목록

  • 환경변수 OAUTH_ALLOWED_REDIRECT_URIS 추가 (콤마 구분 화이트리스트)
  • auth.controller.tsgoogleToken/naverToken/kakaoToken에서 body의 redirect_uri 받기 + 필수 검증
  • auth.service.tsexchangeGoogleToken/exchangeNaverToken/exchangeKakaoToken 시그니처 변경 (redirect_uri 인자 추가)
  • 화이트리스트 검증 헬퍼 추가, 미등록 URL은 400 거부
  • 기존 getCallbackUrl() 제거 (Passport google strategy의 callbackURL은 별개 경로라 유지)
  • Swagger 갱신 (redirect_uri 필수 필드 추가)
  • .env / .env.dev 갱신 + GitHub Secret(ENV_CONTENT, ENV_DEV_CONTENT)에 OAUTH_ALLOWED_REDIRECT_URIS 추가 안내
  • pnpm build 통과 확인

✨ API 변경 (프론트 동기화 필요)

  • POST /api/auth/google/token body에 redirect_uri: string 추가 (필수)
  • POST /api/auth/naver/token body에 redirect_uri: string 추가 (필수)
  • POST /api/auth/kakao/token body에 redirect_uri: string 추가 (필수)
  • 프론트는 OAuth 인증 시작 시 사용한 redirect_uri와 동일한 값을 전달해야 함

✨ 기타

  • 화이트리스트 미통과 시 400 반환
  • 운영(https://www.promptplace.kr/auth/callback), 개발(https://promptplace-develop.vercel.app/auth/callback), 로컬(http://localhost:5173/auth/callback) 모두 화이트리스트에 포함 예정

Metadata

Metadata

Assignees

No one assigned

    Labels

    fixfixing codes

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions