구글 로그인 OAuth 토큰을 발급받기 위해 요청을 보냈을 때, 400 Bad Request와 함께 Malformed auth code 오류가 발생했다.
org.springframework.web.client.HttpClientErrorException$BadRequest: 400 Bad Request on POST request for "https://oauth2.googleapis.com/token": "{ "error": "invalid_grant", "error_description": "Malformed auth code."}"
"Malformed auth code."
→ 인가 코드가 올바르지 않거나 변형된 경우 발생하는 오류
작년에 구글 로그인 구현했을 때는 문제없이 동작했는데 기존 코드를 그대로 썼음에도 Google의 API 관련 정책 변경 되었는지 갑자기 해당 에러가 발생하였다.
구글 OAuth 인가 코드(=code)가 URL에 포함될 때, URL 인코딩이 제대로 처리되지 않으면 이 오류가 발생할 수 있다.
- OAuth 인증 과정에서 구글에서 반환한
code
값은 URL 인코딩된 형태로 전달- 이 값은 percent-encoding 방식으로 특수 문자를 처리하는데, 예를 들어
/
는%2F
로 인코딩
위와 같이 code
에서 %2F
와 같은 URL 인코딩 값이 제대로 처리되지 않으면, 구글 서버에서 이를 변형된 코드로 간주하여 Malformed auth code 오류가 발생할 수 있다.
이 문제를 해결하기 위해 인코딩된 값 (%2F 등)을 원래대로 복원하려면, 디코딩을 해줘야 한다.
따라서, URLDecoder.decode(code, StandardCharsets.UTF_8)
로 인가코드(=code)가 URL 인코딩된 값을 디코딩하는 과정을 추가해주었다.
String decodedCode = URLDecoder.decode(code, StandardCharsets.UTF_8); //구글 로그인 인가코드 인코딩 관련 오류 방지 (%2F -> /)
이렇게 하니 Oauth 토큰이 정상적으로 처리될 수 있었다‼️
- OAuth 토큰 요청 시
Malformed auth code
오류가 발생하는 이유는 인가 코드가 URL 인코딩 처리되지 않았기 때문URLDecoder.decode()
메서드를 사용하여 인가 코드를 디코딩해서 처리