카카오 공식 문서에 카카오 oAuth에 대한 설명이 친절하게 적혀있다.
이 OAuth를 Spring boot로 구현해보려고 한다. 물론 카카오 REST API 공식 문서에 친절하게 적혀있긴 하지만, 나중에 복습할 수 있도록 정리해두려고 한다.
카카오 개발자 페이지에서 애플리케이션 추가하기
를 눌러 내 프로젝트를 만든다.
애플리케이션 명과 사업자명을 입력하면 위와 같이 프로젝트가 생성된다.
우리가 사용할 키는 REST API 키
이다.
거기에, 카카오 로그인
을 활성화하기 위하여 좌측 탭의 카카오 로그인
에서 카카오 로그인을 활성화한다.
활성화 설정 상태를 누르면 ON
상태가 된다.
그리고 아래 쪽의 Redirect URI
를 등록해준다. Redirect URI
는 사용자가 카카오 로그인을 수행했을 때 발급되는 코드를 반환하는 페이지
라고 생각하면 된다.
로컬 환경과 내 도메인 두 가지 환경에서 사용할 것이므로 두 개의 주소를 등록해준다.
카카오 로그인
탭 아래의 동의 항목
탭에서 카카오 로그인 시 가져올 정보들을 설정한다.
사용자가 내 애플리케이션에서 카카오로 로그인하기
를 누르면 다음과 같은 url로 접속해서 사용자가 로그인하도록 하면 된다.
kauth.kakao.com/oauth/authorize?client_id={REST_API_KEY}&redirect_uri={REDIRECT_URI}&response_type=code
여기서 REST_API_KEY
는 애플리케이션을 만들자마자 나왔던 API 키를 입력하면 되고, REDIRECT_URI
에는 설정해두었던 URI가 들어가게 된다.
내가 발급 받은 REST API KEY
와 REDIRECT URI
를 넣어보니 내가 설정한 애플리케이션 명과 배포자명이 나타나며 제대로 적용되는 것을 확인할 수 있었다.
그리고 전체 동의하기를 누르면 redirect uri
로 제대로 이동된다.
이동 후에는 Query String
으로 code
를 받아올 수 있는 것을 확인할 수 있을 것이다.
나는 /users/logIn/oauth/kakao
라는 path variable로 redirect uri를 설정했다.
따라서 UserController 파일에 다음과 같은 코드를 작성해주었다.
@ResponseBody
@GetMapping("/kakao")
public BaseResponse<String> kakaoCallback(@RequestParam String code){
String response = "성공적으로 카카오 로그인 API 코드를 불러왔습니다.";
System.out.println(code);
return new BaseResponse<String>(response);
}
쿼리스트링으로 들어오는 code를 콘솔에 출력하도록 하는 함수이다.
GET 요청을 보내보면
콘솔에서 잘 받아오는 것을 확인할 수 있다.
위와 같은 방식으로 인가 코드를 받아올 수 있는 것을 확인했으니, 이제 이 코드를 사용해서 Access Token
을 요청해서 가져올 것이다.
POST
로 Access Token을 요청해서 받아오는데, 결과를 JSON
형식으로 받아오므로 JSON Parser
를 사용할 것이다.
build.gradle
파일에서
compile group: 'org.json', name: 'json', version: '20160810'
위 코드를 입력하여 dependencies에 추가한다.
그 후 본격적인 REST API 작업을 위해 공식 레퍼런스를 보면
공식 레퍼런스에서 GET 요청을 통해 인가 코드를 가져오는 것을 확인할 수 있으므로
GET
요청 코드를 작성한다.
그 후 토큰을 받아와서 로그인 처리를 해야한다.
토큰을 받아오는 작업은 POST
요청으로 가져오는 것을 확인할 수 있다.
이를 처리해주도록 한다.
RestTemplate
을 통해 POST
요청을 보낸다. 그 후 access token을 받아오는 작업을 처리한다.
코드는 복잡해보이지만 생각보다 간단하다.
공식 레퍼런스를 보면 Header
는 Content-type : application/x-www-form-urlencoded;charset=utf-8
이므로 이를 추가해준다.
거기에 Parameter
들 중에서 꼭 필요한 것들을 MultiValueMap
에 넣어 넘겨주는 형태로 코드가 작성된 것이다.
그리고 아까 설치한 JSON Parser
를 통해 응답을 받아오는 원리이다.
그래서 위 코드를 실행해보면 위와 같이 된다. 성공적으로 jwt가 발급되고 로그인에 성공된 것을 알 수 있다.