카카오 연결 끊기 API 요청시 400 에러 지속

안녕하세요. Java, SpringBoot 환경에서 개발하고 있고 앱ID는 1103689 입니다.
카카오 연결끊기 API 요청 시 400 에러가 지속되고 있는 상태라서 코드 검토 부탁드리려 문의글 남깁니다.
제 코드는 아래와 같습니다!

@Value(“${KAKAO_API_ADMIN_KEY}”)
private String adminKey;

@Transactional
public void unlinkKakaoAccount(Long memberId, UnlinkRequest unlinkRequest) {
    final String AUTHORIZATION_HEADER = "Authorization";
    final String KAKAO_AUTH_PREFIX = "KakaoAK ";
    final String kakaoUnlinkUrl = "https://kapi.kakao.com/v1/user/unlink";

    Member member = getMember(memberId);

    Long kakaoUserId = member.getKakaoId();
    try {
        ResponseEntity<String> response = webClient.post()
            .uri(kakaoUnlinkUrl)
            .header(AUTHORIZATION_HEADER, KAKAO_AUTH_PREFIX + adminKey)
            .contentType(MediaType.APPLICATION_FORM_URLENCODED)
            .bodyValue(constructUnlinkParams(kakaoUserId))
            .retrieve()
            .toEntity(String.class)
            .block();

        if (response != null && response.getStatusCode() == HttpStatus.OK) {
            handleMemberLeaving(member, unlinkRequest.getReason());
        } else if (response != null && response.getStatusCode() != HttpStatus.OK) {
            throw new RestApiException(MemberErrorCode.ERROR_MEMBER_LEAVING_FAILED);
        }
    } catch (WebClientException e) {
        throw new RestApiException(MemberErrorCode.ERROR_MEMBER_LEAVING_FAILED);
    }
}

private static MultiValueMap<String, Object> constructUnlinkParams(Long kakaoUserId) {
    MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
    params.add("target_id_type", "user_id");
    params.add("target_id", kakaoUserId.toString());
    return params;
}

안녕하세요.

에러 시, ErrorBody로 전달한 에러 메시지 Json 기재 부탁드려요.

좀 더 테스트해보느라 답변이 늦어졌습니다…!

위 API 요청시
2024-10-16T12:31:02.161+09:00 DEBUG 758315 — [nio-8080-exec-1] o.s.w.r.f.client.ExchangeFunctions : [7925ec1b] HTTP POST https://kapi.kakao.com/v1/user/unlink
2024-10-16T12:31:02.185+09:00 DEBUG 758315 — [or-http-epoll-1] o.s.http.codec.FormHttpMessageWriter : [7925ec1b] Writing form fields [target_id_type, target_id] (content masked)
2024-10-16T12:31:02.200+09:00 DEBUG 758315 — [or-http-epoll-1] o.s.w.r.f.client.ExchangeFunctions : [7925ec1b] [0c3380d1-1, L:/172.31.37.55:47416 - R:kapi.kakao.com/203.133.166.33:443] Response 400 BAD_REQUEST
2024-10-16T12:31:02.201+09:00 DEBUG 758315 — [or-http-epoll-1] o.s.core.codec.ByteArrayDecoder : [7925ec1b] [0c3380d1-1, L:/172.31.37.55:47416 - R:kapi.kakao.com/203.133.166.33:443] Read 48 bytes
2024-10-16T12:31:02.204+09:00 DEBUG 758315 — [nio-8080-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Using @ExceptionHandler com.foru.freebe.errors.handler.GlobalExceptionHandler#handleCustomException(RestApiException)
2024-10-16T12:31:02.205+09:00 DEBUG 758315 — [nio-8080-exec-1] o.s.w.s.m.m.a.HttpEntityMethodProcessor : Using ‘application/json’, given [/] and supported [application/json, application/*+json, application/cbor]
2024-10-16T12:31:02.205+09:00 DEBUG 758315 — [nio-8080-exec-1] o.s.w.s.m.m.a.HttpEntityMethodProcessor : Writing [com.foru.freebe.errors.response.ErrorResponse@61277d5f]
2024-10-16T12:31:02.206+09:00 DEBUG 758315 — [nio-8080-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [com.foru.freebe.errors.exception.RestApiException]
2024-10-16T12:31:02.206+09:00 DEBUG 758315 — [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed 500 INTERNAL_SERVER_ERROR

아래와 같이 에러메시지를 전달하고 있습니다!

혹시 throw new RestApiException(MemberErrorCode.ERROR_MEMBER_LEAVING_FAILED); 이 부분의 에러메시지를 말씀하신거라면
{
“code”: “ERROR_MEMBER_LEAVING_FAILED”,
“message”: “Failed to complete the membership leaving. Please try again later.”
}

이렇게 반환되고 있구요!

저희가 운영서버에서 회원가입 테스트를 하느라 정상 회원가입시에 발급되는 kakao_id를 임의로 맨 뒷자리를 변경해서 다시 새로 가입하는 과정을 거쳤습니다. 그래서 현재 DB에는 같은 이름이더라도 두개 이상의 회원이 있는 상태이구요…! 그래서 이제 모든 회원을 탈퇴시키려고 하다 보니 누적되어 있는 같은 이름의 회원이 많아서 제 시각에서는 탈퇴하는 데 이슈가 있는 것 같습니다.

혹시 저희 앱 ID로 연동되어 있는 카카오 계정들을 개발자님께서 수동을 모두 탈퇴 시켜주실 수 있는 방법도 있을까요…?
로컬에서는 정상적으로 탈퇴가 되는데 운영서버에서 안되는 이유가 누적된 kakao_id들이 충돌해서일 것 같아서 요청드립니다.

(1) 에러 trace 로그가 아니라 카카오에서 Error Body 영역으로 Json 에러 메시지를 전달합니다. 기재하신 에러 메시지는 카카오에서 전달하는 메시지가 아닙니다.

1103689 디벨로퍼스앱의 카카오측 로그에는 /v1/user/unlink가 없는 것을 볼때 앱키가 잘못 설정 되었을 것 같습니다.
호출 시간 초단위로 알려주시면 해당시간 호출 내역 로그확인 해보겠습니다.

(2) 카카오 로그인으로 이용자 동의 받아 설정된 카카오 로그인 연결정보는 임의 처리 해드리지 않습니다.

(3) kakao_id 즉, 카카오 로그인으로 생성되는 앱유저ID는 디벨로퍼스앱과 카카오계정에 종속적이므로 충돌하지 않습니다.

확인 부탁드려요.

14:57:47 에 호출 했습니다! 확인 부탁드려요

2024-10-16T14:57:47.920+09:00 DEBUG 758315 — [nio-8080-exec-6] o.s.w.r.f.client.ExchangeFunctions : [12a4008b] HTTP POST https://kapi.kakao.com/v1/user/unlink
2024-10-16T14:57:47.937+09:00 DEBUG 758315 — [or-http-epoll-3] o.s.http.codec.FormHttpMessageWriter : [12a4008b] Writing form fields [target_id_type, target_id] (content masked)
2024-10-16T14:57:47.945+09:00 DEBUG 758315 — [or-http-epoll-3] o.s.w.r.f.client.ExchangeFunctions : [12a4008b] [405fa75c-1, L:/172.31.37.55:41790 - R:kapi.kakao.com/203.133.166.33:443] Response 400 BAD_REQUEST
2024-10-16T14:57:47.946+09:00 DEBUG 758315 — [or-http-epoll-3] o.s.core.codec.ByteArrayDecoder : [12a4008b] [405fa75c-1, L:/172.31.37.55:41790 - R:kapi.kakao.com/203.133.166.33:443] Read 48 bytes
2024-10-16T14:57:47.950+09:00 DEBUG 758315 — [nio-8080-exec-6] .m.m.a.ExceptionHandlerExceptionResolver : Using @ExceptionHandler com.foru.freebe.errors.handler.GlobalExceptionHandler#handleCustomException(RestApiException)
2024-10-16T14:57:47.950+09:00 DEBUG 758315 — [nio-8080-exec-6] o.s.w.s.m.m.a.HttpEntityMethodProcessor : Using ‘application/json’, given [/] and supported [application/json, application/*+json, application/cbor]
2024-10-16T14:57:47.950+09:00 DEBUG 758315 — [nio-8080-exec-6] o.s.w.s.m.m.a.HttpEntityMethodProcessor : Writing [com.foru.freebe.errors.response.ErrorResponse@525971cf]
2024-10-16T14:57:47.951+09:00 DEBUG 758315 — [nio-8080-exec-6] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [com.foru.freebe.errors.exception.RestApiException]
2024-10-16T14:57:47.951+09:00 DEBUG 758315 — [nio-8080-exec-6] o.s.web.servlet.DispatcherServlet : Completed 500 INTERNAL_SERVER_ERROR

{“msg”:“NotRegisteredUserException”,“code”:-101}

freebe-TEST(1103799) 디벨로퍼스앱의 앱키로 요청 하며, [1103689] freebe 디벨로퍼스앱에 로그인한 앱유저ID를 사용하였습니다.

말씀하신 출돌의 원인이 이것 같네요.

확인 부탁드려요.

기존에 있던 freebe-test 디벨로퍼스앱의 앱키를 freebe 디벨로퍼스앱의 앱키로 전환하는 과정에서 오류가 있었던 것 같습니다…! 작업 마친 후에 답변을 드리려 했는데 그게 조금 늦게 될 것 같아서 탈퇴 확인 전에 미리 답글을 남깁니다!

오류를 친절하게 피드백해주셔서 정말 감사합니다. 덕분에 진전이 많이 있었습니다.
좋은 저녁 보내세요 개발자님:blush:

혹시 freebe 디벨로퍼스의 어드민 키로 환경변수를 잘 전환했는데 같은 에러가 떠서 혹시 확인 가능하시다면 18:40:05 시간에 발생한 로그 확인 부탁드리겠습니다…!

2024-10-16T18:40:05.757+09:00 DEBUG 790878 — [nio-8080-exec-2] o.s.w.r.f.client.ExchangeFunctions : [438e7b9e] HTTP POST https://kapi.kakao.com/v1/user/unlink
2024-10-16T18:40:05.796+09:00 DEBUG 790878 — [or-http-epoll-1] o.s.http.codec.FormHttpMessageWriter : [438e7b9e] Writing form fields [target_id_type, target_id] (content masked)
2024-10-16T18:40:05.806+09:00 DEBUG 790878 — [or-http-epoll-1] o.s.w.r.f.client.ExchangeFunctions : [438e7b9e] [b4432236-1, L:/172.31.37.55:46024 - R:kapi.kakao.com/211.249.200.134:443] Response 400 BAD_REQUEST
2024-10-16T18:40:05.816+09:00 DEBUG 790878 — [or-http-epoll-1] o.s.core.codec.ByteArrayDecoder : [438e7b9e] [b4432236-1, L:/172.31.37.55:46024 - R:kapi.kakao.com/211.249.200.134:443] Read 48 bytes
2024-10-16T18:40:05.820+09:00 DEBUG 790878 — [nio-8080-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Using @ExceptionHandler com.foru.freebe.errors.handler.GlobalExceptionHandler#handleCustomException(RestApiException)
2024-10-16T18:40:05.821+09:00 DEBUG 790878 — [nio-8080-exec-2] o.s.w.s.m.m.a.HttpEntityMethodProcessor : Using ‘application/json’, given [/] and supported [application/json, application/*+json, application/cbor]
2024-10-16T18:40:05.821+09:00 DEBUG 790878 — [nio-8080-exec-2] o.s.w.s.m.m.a.HttpEntityMethodProcessor : Writing [com.foru.freebe.errors.response.ErrorResponse@bb577c3]
2024-10-16T18:40:05.822+09:00 DEBUG 790878 — [nio-8080-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [com.foru.freebe.errors.exception.RestApiException]
2024-10-16T18:40:05.823+09:00 DEBUG 790878 — [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Completed 500 INTERNAL_SERVER_ERROR

동일한 에러입니다. 아래 메시지는 에러 응답으로 호출자에게 전달되는 메시지입니다.
stack trace가 아닌 응답을 확인해주시면 원인파악할 수 있습니다.

{“msg”:“NotRegisteredUserException”,“code”:-101}

18:37:31.102 unlink 호출 성공해서 연결이 끊어졌는데, 다시 unlink를 호출해서 발생했습니다.

unlink는 운영하시는 서비스에서 탈퇴 시, 함께 호출 해야하므로 회원 특정을 위해 카카오로그인이 선행되어야합니다.

카카오로그인(연결) → 탈퇴 → unlink 호출

이용자 동선 검토 부탁드려요.

Webclient 에서 에러 Body 얻는 법은 아래 내용 참고 하시면 좋을 것 같습니다.

https://stackoverflow.com/questions/44593066/spring-webflux-webclient-get-body-on-error

1개의 좋아요

안녕하세요! 아직 회원 탈퇴가 정확하게 이뤄진건지 확인이 되지 않아서 문의드립니다…!

인가코드를 정상적으로 발급 받아서 freebe-test 디벨로퍼스앱으로 HTTP POST https://kauth.kakao.com/oauth/token API 전송했고, 로그에 400에러가 남았는데 혹시 어떤 이유인지 확인 가능할까요??
시간은 오늘 12:09:51입니다!

안녕하세요.

"회원 탈퇴"의 개념 먼저 정리해야할 것 같은데요.
카카오 로그인으로 가입된 회원은 개발하신 시스템에 저장되고, 카카오는 동의내역, 연결정보만 저장됩니다.
말씀하신 "회원 탈퇴"는 "연결 끊기, Unlink"를 말씀하신거죠?

그리고

freebe-TEST(1103799) 디벨로퍼스앱은 [1103689] freebe 디벨로퍼스앱에서 생성한 테스트앱으로 팀멤버 관리자만 로그인 가능합니다. 즉, 이용자가 로그인한 것이 아니므로
연결끊기는 각 계정이 로그인 하지 않고 ADMIN KEY로 Unlink API 호출 해서 연결끊기 할 수 있습니다.


액세스 토큰 발급 요청 시, 위에서 안내드린 것과 같이 에러 Body 로 전달드리는 에러 메시지로 상세 내용 파악 부탁드립니다.

감사합니다.

네. 제가 말씀드린게 '연결 끊기’였는데 명확하게 단어구분을 하지 못했네요. 죄송합니다…!
서비스 ‘회원 탈퇴’ 로직에서 문제가 있어 에러가 발생한 것을 확인했고 결과적으로 해결이 되었습니다!
초기에 회원가입 과정을 여러번 테스트 하기 위해서 발급받은 kakao_id를 DB에서 수정하여 회원가입을 계속 시켜 같은 회원의 여러 kakao_id 인 회원 레코드가 많이 쌓이다 보니 헷갈리게 된 것 같습니다.

질문을 명확하지 못했지만 답변을 잘해주셔서 해결할 수 있었던 것 같습니다! 문제상황을 더 고민하는 계기로 삼아 나은 개발자가 되도록 하겠습니다. 답변 너무 감사했습니다 개발자님!
좋은 저녁 보내세요…!:blush:

1개의 좋아요