[Spring/SpringBoog] 구글 로그인 "error_description": "malformed auth code." 문제 해결

Dev_ch·2023년 9월 15일
0

아..네 예비군을 다녀왔습니다.. 예비군 하는동안 구글 로그인 API가 작동이 되지 않는다는 제보를 받게되어서 잘만 되던 녀석이 갑자기 왜 안될까..? 라는 생각을 했습니다. 그러다보니 복귀 후 첫 작업이 구글 로그인 API 고치기였네요..ㅎ 아무튼 이번 삽질기도 같이 즐겨보도록 합시다.

⚠️ 문제 상황

Swagger의 경우 글로벌 예외처리로 되어있다보니 오류 상황을 제대로 확인하기 어려웠다. 먼저 Local 에서 소셜로그인이 잘 되는지 확인이 필요했다. 보통 EC2가 안되고 로컬이 되는 경우가 있어서 상황을 확인해보았는데 Local 에서도 위와 같이 발생했다.

그리고 로그를 확인해본 결과..

(조금만 더 자세하게 설명해주시면 안될까요...?)

어쨌든 해당 로그에서 중요하게 볼 것은 역시 "error_description": "malformed auth code." 이 부분이였다. Exception이 발생한 코드는

위 메서드였다. 분명 잘됐었는데..? 라는 생각을 했는데 일단 API가 작동을 안하니 해결 방법을 찾아야했다. 근데 생각보다 "error_description": "malformed auth code." 해당 문구와 관련된 자료가 생각보다 적거나 python 등이 많아 약간 난감했었다.

해당 문구는 인증 코드가 잘못되었다는 것을 알려주고 있는데 그래서 발급받은 인가코드가 제대로 넘어오는지, 발급된 코드가 yml에서 변형되지는 않았는지 전부 확인해보았지만 전혀 문제가 발견되지 않았다. 이쯤되니 약간 멍 해졌다..

🫨 찾았다..!

영웅들이 모여있는 사이트 (https://stackoverflow.com)에서 해답을 찾고자 열심히 뒤져보던도중 나와 비슷한 상황인 글을 하나 찾아서 답변들을 번역기를 돌려가며(...) 해결방법을 찾아보자하였다.

그리고 내가 생각하기에 찾은 문제는 이거였다. 구글에서 인가코드를 요청하여 발급할 경우

- 발급된 코드
4%2F0Adeu5BXSr6ULvZ92_2UNEUpsqKplv7lMu66sSLCRZVEfNwN14hbvQtS7uS1cVtyw5fqsGw

발급된 해당 코드 앞의 "%2F" 부분이 "/"로 인코딩 되지 않고 발급되어 구글에 해당 인가코드로 accessToken을 요청하게 되면 해당 인가코드가 잘못된 인가코드로 인식한다는 것이 내 결론이였다.

🚀 해결

    // Google AccessToken 응답
    private String toRequestAccessToken(String code) {
        // 발급받은 code -> POST 요청
        String decode = URLDecoder.decode(code, StandardCharsets.UTF_8);

        ResponseEntity<GoogleTokenResponse> response = restTemplate.postForEntity(
                googleProperties.getRequestTokenUri(),
                googleProperties.getRequestParameter(decode),
                GoogleTokenResponse.class
        );

발급받은 인가 코드를 UTF-8로 인코딩 처리 후 인코딩 된 인가코드를 파라미터로 넣어서 accessToken을 요청하였다. 위 코드로 수정한 후 API를 테스트 해보니 정상적으로 구글 로그인이 진행되었다.

근데 아직도 의문점은 하나 있다. 왜 전에는 됐을까? 라는 것 이다. 일단 단순 추측으로는 구글 측에서 최근에 REST로 요청하는 부분을 수정한게 아닐까..? 싶다. 분명 원래는 인코딩이 되어있지 않아도 요청이 잘 돌아갔었기 때문에 여러 추측만 있다.

갑자기 되던게 안돼서 당황했지만...! 죽지는 않았다. 다시 귀신같이 방법을 찾고 살아나버린 API.. 가끔 느끼는건데 백엔드는 유지보수가 확실히 어려울 것 같다 라는 생각을 한다. 나중에 휴가가서 노트북 들고다니는 상상을 조금 해봤는데 고칠 수만 있다면야.. 뭔들...

아무튼 이번 포스팅은 여기서 끝이다! 근데 생각해보니 REST API로 소셜로그인 구현하는 과정을 NEW 버전으로 구글만 안만들었는데 구글 로그인 익셉션 포스팅을 먼저 해버렸다.. 나중에 시간되면 구글 로그인 버전도 만들어야겠다 🥲

profile
내가 몰입하는 과정을 담은 곳

0개의 댓글