스프링 부트 카카오 로그인 시 토큰 발급 안되는 문제가 발생합니다

문의 시, 사용하시는 개발환경과 디벨로퍼스 앱ID를 알려주세요.


개발환경은
스프링부트 에서 feign 라이브러리를 사용해 구현중이고
앱 ID 는 933473 입니다.

@FeignClient(name = "kakaoLoginFeignClient",
        url = "https://kauth.kakao.com",
        configuration = KakaoFeignConfiguration.class)
@Component
//Login 코드를 가지고 Token 을 요청하는 Feign
public interface KakaoLoginFeignClient {

    @PostMapping(
            "/oauth/token?grant_type=authorization_code")
    AuthRes.KakaoTokenResponse kakaoAuth(
            @RequestParam("client_id") String clientId,
            @RequestParam("redirect_uri") String redirectUri,
            @RequestParam("client_secret") String client_secret,
            @RequestParam("code") String code
    );
}

feign 요청 부분 코드입니다. 요청은 가나 accessToken 이 null 값으로 돌아옵니다.

public String testKakaoToken(String code){
        String reqURL = "https://kauth.kakao.com/oauth/token";
        String access_Token = null;
        String refresh_Token;
        try {
            URL url = new URL(reqURL);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();

            //POST 요청을 위해 기본값이 false인 setDoOutput을 true로
            conn.setRequestMethod("POST");
            conn.setDoOutput(true);

            //POST 요청에 필요로 요구하는 파라미터 스트림을 통해 전송
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
            String sb = "grant_type=authorization_code" +
                    "&client_id=" + oauthProperties.getKakaoClientId() + // TODO REST_API_KEY 입력
                    "&redirect_uri=http://localhost:9000/auth/kakao" + // TODO 인가코드 받은 redirect_uri 입력
                    "&code=" + code +
                    "&client_secret="+oauthProperties.getKakaoClientSecret();
            bw.write(sb);
            bw.flush();

            //결과 코드가 200이라면 성공
            int responseCode = conn.getResponseCode();
            System.out.println("responseCode : " + responseCode);
            //요청을 통해 얻은 JSON타입의 Response 메세지 읽어오기
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line;
            StringBuilder result = new StringBuilder();

            while ((line = br.readLine()) != null) {
                result.append(line);
            }
            System.out.println("response body : " + result);

            //Gson 라이브러리에 포함된 클래스로 JSON파싱 객체 생성
            JsonParser parser = new JsonParser();
            JsonElement element = JsonParser.parseString(result.toString());

            access_Token = element.getAsJsonObject().get("access_token").getAsString();
            refresh_Token = element.getAsJsonObject().get("refresh_token").getAsString();

            System.out.println("access_token : " + access_Token);
            System.out.println("refresh_token : " + refresh_Token);

            br.close();
            bw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return access_Token;
    }

해당 코드로 요청 시에는 accessToken 이 정상적으로 들어옵니다.

			InputStream stream = conn.getErrorStream();
			if (stream != null) {
				try (Scanner scanner = new Scanner(stream)) {
					scanner.useDelimiter("\\Z");
					response = scanner.next();
				}
				System.out.println("error response : " + response);
			}

에러 Response 확인해보시면 좋을 것같습니다.

로그를 보니 아래와 같이 만료된 인가코드를 사용해서 에러난 케이스가 보입니다.

	
{"error":"invalid_grant","error_description":"authorization code not found for code=FmJud2q32VwVJ4yi9BnCNH0Fq16hLNaWzu4Wpqe8PE3oMVSC3gQustQ4pPVwcm4rX2kZWgo9cxgAAAGJKc6Utg","error_code":"KOE320"}