본문 바로가기

Leafresh: 환경 챌린지 플랫폼

Kakao Redirect URI mismatch (KOE303) 트러블슈팅 로그

이슈 요약

  • 문제 현상: 배포 환경(docker-local)에서 카카오 로그인 시 KOE303 오류 발생

  • 정상 동작: 로컬(local) 환경에서는 정상 로그인됨

  • 오류 메시지:

      {
        "error": "invalid_grant",
        "error_description": "Redirect URI mismatch.",
        "error_code": "KOE303"
      }

발생 일시

  • 2025.06.10 오후

상세 증상

  • 로컬(local)에서는 .env.local에 설정된 kakao_redirect_uri=https://leafresh.app/member/kakao/callback 값과 Kakao Developers 콘솔 등록 값이 일치하여 로그인 성공.

  • docker-local(dev) 환경에서는 .env.docker-local에 다음 값이 존재:

      kakao_redirect_uri=https://localhost:3000/member/kakao/callback
  • 이 값이 @Value("${kakao.redirect-uri}")를 통해 KakaoTokenClient에 주입됨

    → 최종적으로 Kakao API로 잘못된 redirectUri 전송됨

    KOE303 오류 발생

원인 분석

  • OAuthControllerOAuthLoginServiceOAuthKakaoServiceKakaoTokenClient

    이 흐름에서 정상적인 redirectUri가 전달되었지만, KakaoTokenClient 내부에서 환경 변수로 주입된 redirectUri의도치 않게 오버라이드

수정 사항

1. KakaoTokenClient.java

  • @Value로 주입된 redirectUri 필드 삭제:
- @Value("${kakao.redirect-uri}")
- private String redirectUri;
  • 로그 메시지에서도 redirectUri 제거:
- log.info("카카오 TokenClient 설정 로드 완료 - clientId={}, redirectUri={}, clientSecret={}",
-         clientId, redirectUri, clientSecret);
+ log.info("카카오 TokenClient 설정 로드 완료 - clientId={}, clientSecret set={}",
+         clientId, clientSecret != null && !clientSecret.isBlank());
  • getAccessToken()에서는 전달된 파라미터만 사용 (변경 없음):
public String getAccessToken(String authorizationCode, String redirectUri) {
    var formData = BodyInserters
        .fromFormData("grant_type", "authorization_code")
        .with("client_id", clientId)
        .with("redirect_uri", redirectUri) // 파라미터 사용
        .with("code", authorizationCode);
    ...
}

2. OAuthController.java

  • callback 경로를 /member/{provider}/callback/{provider}/callback 으로 통일 (프론트와 URI 충돌 방지):
- @GetMapping("/member/{provider}/callback")
+ @GetMapping("/{provider}/callback")

3. .env.docker-local

  • kakao_redirect_uri 값은 더 이상 사용되지 않으므로 주석 처리 또는 제거
- kakao_redirect_uri=https://localhost:3000/member/kakao/callback
+ # kakao_redirect_uri=https://localhost:3000/member/kakao/callback

테스트 결과

환경 결과
local (.env.local) 정상 로그인
dev (.env.docker-local) 오류 사라짐, 로그인 성공
로그 확인 access token 요청 시 전달되는 redirectUri가 https://leafresh.app/member/kakao/callback으로 일치

재발 방지 방안

  • redirectUri는 고정 주입하지 않고, 프론트 origin + 경로를 동적으로 조합하도록 유지
  • KakaoTokenClient는 반드시 파라미터 기반 redirectUri 사용
  • .env에서 사용하지 않는 값은 제거하거나 명시적으로 주석 처리