Webapp에서 REST API를 통한 인가코드 받기 문의

안녕하세요.

Kakao REST API를 통하여 KakaoTalk에 로그인을 WebApp을 통하여 시도하려고 합니다. OAuth 2.0 관련 문서들 읽어보고 해도 Kakao의 인가코드 받는 방식에서 https://kauth.kakao.com/oauth/authorize 에 의해 넘어오는 Kako의 동의 페이지와 redirect 되는 저희 App의 Url 관계가 이해가 잘 가지 않아서 문의 드립니다.

제가 테스트 해보는 앱은 서블릿을 사용하여 jsp 페이지에서 버튼을 클릭하면 서블릿의 doGet 함수를 통해 jsp 페이지 form 테그에서 파라미터들을 getParameter로 받아오고 doGet 메소드에서 작업이 이루어져 결과 값을 setAttribute 함수에 저장 한후 rrequest.getRequestDispatcher(“xxx.jsp”).forward(request, response)를 호출하여 특정 jsp 페이지로 넘깁니다.

요약: A.jsp → 서블릿 클래스의 doGet 메소드 → 결과 값을 getRequestDispathcer를 통해 → B.jsp 로 이동.

제가 로그인을 활용 할 부분이 A.jsp에서 로그인 버튼을 누르고 서블릿 클래스의 doGet 메소드에서 인가코드 받기, 엑세스 토큰 받기 등의 로그인을 완료한 후 핋요한 정보를 setAttribute로 B.jsp에 넘겨 표현 하는 것 입니다.

이를 위해 두 가지 방법을 해봤는데 둘 다 인가 코드 받기 부분에 카카오의 https://kauth.kakao.com/oauth 서버를 거치는 부분 때문에 연결이 되지 않습니다.

  1. 첫 방법은 HttpsURLConnection을 이용하는 방법을 시도했습니다.

A.jsp는 form 태그의 submit 버튼을 통해 그냥 doGet 메소드를 호출하고 doGet 메소드 안에 다음 코드를 작성하여 인가코드를 얻어 보려 했습니다.

String requestUrl =“https://kauth.kakao.com/oauth/authorize?client_id=xxxxxxxxxxxxxxxxxx&redirect_uri=http://xxx.xxx.xxx.xxx&response_type=code”;

    HttpMethodType httpMethod = HttpMethodType.GET;

    HttpsURLConnection conn;
    OutputStreamWriter writer = null;
    BufferedReader reader = null;
    InputStreamReader isr = null;

    try {
        final URL url = new URL(requestUrl);
        conn = (HttpsURLConnection) url.openConnection();
        conn.setRequestMethod(httpMethod.toString());

        if (conn.getResponseCode()== 200)
            isr = new InputStreamReader(conn.getInputStream());
        
        reader = new BufferedReader(isr);

        final StringBuffer buffer = new StringBuffer();
        String line;
        while ((line = reader.readLine()) != null) {
            buffer.append(line);
        }
        System.out.println(buffer.toString());
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (writer != null) try { writer.close(); } catch (Exception ignore) { }
        if (reader != null) try { reader.close(); } catch (Exception ignore) { }
        if (isr != null) try { isr.close(); } catch (Exception ignore) { }
    }

이를 통해 https://kauth.kakao.com/oauth/authorize 서버에 접근하면 response 되는 값이 인가코드가 있는 url이 아니라 카카오의 동의 페이지 html 이 넘어와서 인가코드를 받아서 액세스 토큰 받는 데 사용 할 수가 없더군요.

그래서,

  1. 두 번째 방법으로 A.jsp에서 get 방식으로 https://kauth.kakao.com/oauth/authorize 에 다음 코드 처럼 접근해 보기로 했습니다.

      <form action="https://kauth.kakao.com/oauth/authorize" method="get">
     <input type="hidden" name="client_id" value="xxxxxxxxx />
     <input type="hidden" name="redirect_uri" value="http://xxx.xxx.xxx,xxx"/>
     <input type="hidden" name="response_type" value="code" />
     <input type="submit" value="로그인" />
     </form>
    

이를 실행하면 카카오 서버의 동의 페이지가 나오고 동의 버튼을 누르면 인가코드가 주소 창에 뜹니다. 하지만 이 때는 저희 App의 서블릿 클래스 doGet 메소드를 실행하는 게 아니라 인가코드 정보를 저희 App 서버로 가져 올 수가 없습니다.

서블릿을 통해서 인가 코드를 받아오는 방법을 좀 알려 주실 수 없을까요? 예제 코드가 있으면 좋을 것 같기도 합니다.

긴글 읽어주셔서 감사합니다.

안녕하세요.

(1) 웹페이지에서 카카오 로그인 버튼을 두고 a href 로 https://kauth.kakao.com/oauth/authorize 주소를 기재합니다.
(2) 리다이렉트 URI는 인가코드를 파라메터로 받아 액세스 토큰 조회 API호출 기능을 하는 서블릿 http주소를 사용하시면됩니다.

서블릿 jsp 예제는 없고
spring boot 기반 java 예제가 있으니 참고 부탁드려요.

[rest api 예제] java (spring boot) - 카카오 로그인, 카카오 친구목록 조회, 나에게 메시지 발송