본문 바로가기
Web

[Spring] 카카오 로그인 연동 구현하기(REST API) [4]

by 겨울그리고눈 2018. 12. 10.

카카오 로그인 구현 REST API

 

3) 사용자 정보 요청

 

토큰을 얻었다면 이젠 사용자의 정보를 요청하여 가져올 수 있습니다.

v1 API에서 v2 API로 업데이트가 되었기때문에 v2기준으로 작성하겠습니다.

 

관리자가 특정 사용자의 정보를 얻어내고자 할 때는 어드민 키와 사용자 ID를 통해서도 요청할 수 있습니다.

해당 기능을 사용하기 위해서는 앱 사용자 전체를 관리 할 수 있는 어드민 키(Admin Key)가 필요합니다. 어드민 키가 탈취되는 일이 없도록 앱 내에서 직접 어드민 키로 API를 호출하지 않고, 자체 앱 서버에서 API를 호출하시기 바랍니다.

[Request]

GET/POST /v2/user/me HTTP/1.1 Host: kapi.kakao.com Authorization: Bearer {access_token} Content-type: application/x-www-form-urlencoded;charset=utf-8
GET/POST /v2/user/me HTTP/1.1 Host: kapi.kakao.com Authorization: KakaoAK {admin_key} Content-type: application/x-www-form-urlencoded;charset=utf-8

어드민 키(Admin Key)는 절대로 유출되어서는 안 되는, 일종의 마스터 키(Master Key)이므로 반드시 Third 서버에서 API를 호출해야 합니다. 어드민 키는 카카오 웹사이트의 내 애플리케이션에서 확인할 수 있습니다. 만약 iOS, Android 애플리케이션의 소스코드 내에서 어드민 키를 사용할 경우, 해당 애플리케이션은 보안에 취약할 수 있습니다.

사용자 정보 요청에는 두가지 방법이 있는데 액세스토큰을 이용한 방법으로 요청해보겠습니다. 

 

[Response]

사용자 정보 요청이 성공하면 응답 바디에 JSON 객체로 아래 값을 포함합니다.

설명 타입
id 유저의 고유 ID signed int64
properties 사용자의 정보. Json 형태의 key-value.
사용자 정보 키를 지정한 경우는 해당 키에 대한 정보만 포함 합니다.
String
kakao_account.has_email 카카오계정의 이메일 소유 여부. 전화번호로 카카오계정을 생성하고, 추후에도 이메일 입력을 하지 않은 카카오계정인 경우 이메일이 존재하지 않습니다. has_email=false인 경우 is_email_valid,is_email_verified, email 값은 응답에 포함되지 않습니다. Boolean
kakao_account.is_email_valid 카카오계정의 이메일 유효 여부. 간혹 이메일 실소유자에 의해 카카오계정 이메일이 무효화 되는 경우 값이 false로 내려갑니다. Boolean
kakao_account.is_email_verified 인증받은 카카오계정 이메일인지 여부 Boolean
kakao_account.email 사용자 카카오계정의 이메일
- 카카오계정 이메일은 변경될 수 있습니다. 
- 이메일 개인정보 제공동의를 하지 않은 사용자의 이메일은 제공되지 않습니다. has_email=true인데 email값이 내려오지 않는다면, 사용자가 정보제공 동의를 하지 않은 경우입니다.
String
kakao_account.has_age_range 카카오계정의 연령대 소유 여부. 
- has_age_range=false인 경우 age_range 값이 내려가지 않습니다.
Boolean
kakao_account.age_range 사용자 카카오계정의 연령대. 15~19/20~19/30~39 ... 80~89/90~ String
kakao_account.has_birthday 카카오계정의 생일 소유 여부. 
- has_birthday=false인 경우 birthday 값이 내려가지 않습니다.
Boolean
kakao_account.birthday 사용자 카카오계정의 생일. MMDD 형식 String
kakao_account.has_gender 카카오계정의 성별 소유 여부. 
- has_gender=false인 경우 gender 값이 내려가지 않습니다.
Boolean
kakao_account.gender 사용자 카카오계정의 성별. female/male String
HTTP/1.1 200 OK {   "id":123456789,   "properties":{      "nickname":"홍길동",      "thumbnail_image":"http://xxx.kakao.co.kr/.../aaa.jpg",      "profile_image":"http://xxx.kakao.co.kr/.../bbb.jpg",      "custom_field1":"23",      "custom_field2":"여"      ...   },   "kakao_account": {      "has_email": true,      "is_email_valid": true,        "is_email_verified": true,        "email": "xxxxxxx@xxxxx.com"     "has_age_range":true,     "age_range":"20~29",     "has_birthday":true,     "birthday":"1130",     "has_gender":true,     "gender":"female"   } }

이렇게 JSON형태로 응답받을 수 있습니다. 여기서 필요한 정보만 가져오면 되겠죠?

 

 

마찬가지로 다음은 컨트롤러에서 요청하기 위해 만든 클래스입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package com.bit.ms.social.kakao;
 
import java.io.IOException;
 
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.HttpClientBuilder;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
 
public class KakaoUserInfo {
    public static JsonNode getKakaoUserInfo(JsonNode accessToken) {
 
        final String RequestUrl = "https://kapi.kakao.com/v2/user/me";
        final HttpClient client = HttpClientBuilder.create().build();
        final HttpPost post = new HttpPost(RequestUrl);
 
        // add header
        post.addHeader("Authorization""Bearer " + accessToken);
 
        JsonNode returnNode = null;
 
        try {
            final HttpResponse response = client.execute(post);
            final int responseCode = response.getStatusLine().getStatusCode();
 
            System.out.println("\nSending 'POST' request to URL : " + RequestUrl);
            System.out.println("Response Code : " + responseCode);
 
            // JSON 형태 반환값 처리
            ObjectMapper mapper = new ObjectMapper();
            returnNode = mapper.readTree(response.getEntity().getContent());
 
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // clear resources
        }
 
        return returnNode;
    }
}
 
cs

 

다음은 컨트롤러에서 JSON객체 형식으로 가져오면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        // access_token을 통해 사용자 정보 요청
        JsonNode userInfo = KakaoUserInfo.getKakaoUserInfo(accessToken);
 
        // Get id
        String id = userInfo.path("id").asText();
        String name = null;
        String email = null;
 
        // 유저정보 카카오에서 가져오기 Get properties
        JsonNode properties = userInfo.path("properties");
        JsonNode kakao_account = userInfo.path("kakao_account");
 
        name = properties.path("nickname").asText();
        email = kakao_account.path("email").asText();
 
        System.out.println("id : " + id);
        System.out.println("name : " + name);
        System.out.println("email : " + email);
cs
 

저는 일부분의 정보만 가져왔지만 필요하다면 자신에게 맞게 정보를 활용하시면 되겠습니다.

 

카카오Developers에 들어가시면 더 많은 정보가 있으니 참고하시기 바랍니다.

https://developers.kakao.com/docs/restapi

댓글