카카오 로그인 API 구현

ik_13038·2022년 9월 12일
0

라이징캠프 5주차

목록 보기
2/2

소셜 로그인 Flow

지난 번에 학습한 내용과 같다. 이를 참고해서 제작해보자.


카카오 로그인을 위한 설정

카카오 공식문서
위 사이트에서 카카오 개발자 회원가입 이후 내 애플리케이션을 들어가 추가해준다.


그럼 위와 같이 내가 만들려는 서비스 관련 앱 키를 확인할 수 있다. 우리는 SpringBoot를 활용하므로 이 중 REST API 키를 활용할 것이다.


왼쪽 메뉴바 중 카카오 로그인 항목이 있다. 이를 클릭해준 다음 활성화를 ON으로 바꿔주자.

그 아래에는 Redirect URI가 있는데, Redirect URI 등록해주면 된다.


일단은 Local 환경에서 테스트하기 위해 위처럼 작성했는데 각자 만든 홈페이지를 설정한 포트번호와 함께 입력해주면 된다.

이 URI는 사용자가 카카오 로그인을 수행했을 때 발급되는 code를 반환할 페이지이다.

이후 왼쪽 메뉴 중 제품설정 내 동의항목을 클릭하여 불러올 정보들을 선택해주면 된다. 기본적으로 클론코딩하는 당근마켓에서 닉네임, 프로필 사진을 필요로 하므로 두 개의 정보를 필수 정보를 갖고 오게 한 뒤 차후 휴대전화 번호 분실 시 사용할 카카오 계정을 설정하였다.

이렇게 되면 1차 설정은 끝이다.


링크를 통한 code 추출

코드를 입력하세요

kauth.kakao.com/oauth/authorize?client_id={REST_API_KEY}&redirect_uri={REDIRECT_URI}&response_type=code

위 링크를 이용해 카카오 로그인을 할 수 있다.
REST_API_KEY는 내 애플리케이션 화면에서 확인했던 값, redirect_uri는 설정했던 uri 값으로 입력하면 된다.

위와 같이 링크로 정상적으로 이동하면 화면을 볼 수 있다. Accept All을 체크하고 넘어가보자.


그럼 위처럼 코드를 Query String으로 갖는 홈페이지로 redirect된다.
위 링크를 이용해서 code를 확인할 수 있다..
아래 코드로 이 code를 따로 추출해보자.

@RestController
@AllArgsConstructor
@RequestMapping("/oauth")
public class OAuthController {

    /**
     * 카카오 callback
     * [GET] /oauth/kakao/callback
     */
    @ResponseBody
    @GetMapping("/kakao")
    public void kakaoCallback(@RequestParam String code) {
        System.out.println(code);
    }
}

터미널 창에서 따로 code만 불러왔다. 이처럼 이 code를 활용하여 회원가입 또는 로그인 API를 구현할 수 있을 것이다.


Access Token 받기

이제 인가코드(code)를 받았으니, 이 코드로 카카오서버에 인가토큰(access token)을 요청할 수 있다. POST로 요청하고, 결과를 JSON형식으로 받기 때문에 JSON파싱에 유용한 Gson라이브러리를 사용해보겠다.

Gson 추가
Gradle:

dependencies { implementation 'com.google.code.gson:gson:2.8.7' }

Maven:

<dependency> 
	<groupId>com.google.code.gson</groupId> 
    <artifactId>gson</artifactId> 
    <version>2.8.7</version> 
</dependency>

필자는 Gradle을 이용해서 아래처럼 추가 이후 새로고침을 하였다.

이제 code를 이용하여 access token을 발급받는 Service파일을 작성해보자

OAuthService.java

import com.google.gson.JsonParser;
import com.google.gson.JsonElement;
import org.springframework.stereotype.Service;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;

@Service
public class OAuthService{

    public String getKakaoAccessToken (String code) {
        String access_Token = "";
        String refresh_Token = "";
        String reqURL = "https://kauth.kakao.com/oauth/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()));
            StringBuilder sb = new StringBuilder();
            sb.append("grant_type=authorization_code");
            sb.append("&client_id=e4a81d5a6acbda948310e08e2eafc123"); // TODO REST_API_KEY 입력
            sb.append("&redirect_uri=http://localhost:9000/oauth/kakao"); // TODO 인가코드 받은 redirect_uri 입력
            sb.append("&code=" + code);
            bw.write(sb.toString());
            bw.flush();

            //결과 코드가 200이라면 성공
            int responseCode = conn.getResponseCode();
            System.out.println("responseCode : " + responseCode);

            //요청을 통해 얻은 JSON타입의 Response 메세지 읽어오기
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line = "";
            String result = "";

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

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

            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;
    }
}

위 코드를 해석하면 아래와 같은 순으로 진행된다고 한다.
1. connection 생성
2. POST로 보낼 Body 작성
3. 받아온 결과 JSON 파싱 (Gson)

위 코드를 수정해서 확인해보자.


이후 이를 controller에서 호출하여 확인해보자.


터미널 창에 관련 정보를 확인할 수 있다.
이제 이러한 정보들을 확인하여 로그인이나 회원가입 method를 제작하면 된다.

출처:

https://suyeoniii.tistory.com/81
https://velog.io/@shwncho/Spring-Boot-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EB%A1%9C%EA%B7%B8%EC%9D%B8-APIoAuth-2.0-2

profile
글 연습, 정보 수집

0개의 댓글