이 포스팅은 회원탈퇴 로직을 구현할 때 kakao REST API 로 `연결 끊기`를 Spring 프로젝트에서 적용하는 방법에 대한 글입니다.
Kakao Developers
카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.
developers.kakao.com
공식 문서에 따르면 REST API로 `연결 끊기`를 하려면 카카오 인증 서버(https://kapi.kakao.com/v1/user/unlink)에 요청을 보내야 합니다.
요청과 응답 예시는 공식 문서에서 가져왔습니다.
사용자 로그인 시 액세스 토큰을 세션이나 RDB, Memory DB 등에 저장할 수 있지만, 서비스의 종료 등의 상황과 분산 환경에서 세션을 사용하지 않으면서 추가적인 DB를 거치지 않는 방식으로 `연결끊기` 요청을 보내기 위해 `앱 어드민 키`를 이용한 방법을 이용했습니다.
공식 문서에 나와있듯이 앱 어드민 키는 모든 권한을 갖는 정말 중요한 키 값이므로 절대 유출되지 않도록 해야 합니다.
만약, 사용자의 액세스 토큰을 이용하신다면 1번 과정에서 사용자의 액세스 토큰을 준비하시면 됩니다.
1. 앱 어드민 키 준비
1-1. kakao developers 에서 앱 어드민 키 확인
앱 어드민 키는 kakao developers 에서 `내 애플리케이션`-왼쪽 햄버거 버튼에서 `앱키`로 접근하면 확인하실 수 있습니다.
1-2. application-secret.yaml 에 환경변수로 저장
프로필 설정 파일을 이용해서 서버 실행 시 이 값을 읽을 수 있도록 합니다.
환경변수의 경우 `.env` 같은 확장자로 작성하되, 앱 어드민 키를 이용할 땐 헤더 부분에 `Authorization: Bearer {$appAdminKey}`가 아닌 `Authorization: KakaoAK {$appAdminKey}`가 들어가야 합니다.
환경변수에 공백이 포함될 땐 `"`나 `'`로 감싸야하기 때문에 아래와 같이 입력합니다.
KAKAO_APP_ADMIN_KEY="KakaoAK {$앱 어드민 키}"
1-3. 서비스 계층에서 앱 어드민 키 불러오기
서비스 계층에서 회원탈퇴를 받을 때 `앱 어드민 키`를 이용해 카카오 인증 서버에 요청을 보냅니다.
따라서 `@Value` 애너테이션을 이용해 설정 파일에 작성한 값을 불러옵니다.
2. OpenFeign 클라이언트로 카카오 인증 서버에 요청 보내기
OpenFeign 라이브러리를 이미 사용 중이시면 `2-1. 의존성 추가` 부분은 건너뛰시면 됩니다.
2-1. OpenFeign 의존성 추가
`build.gradle`에 OpenFeign 의존성을 추가합니다.
2-2. 응답을 받는 DTO 작성
연결 끊기 요청을 보내면 성공 응답으로 사용자의 id를 `JSON` 형태로 응답받습니다.
따라서 응답을 받는 DTO를 작성합니다.
2-3. 클라이언트 작성
중요한 부분입니다.
POST 요청 시 `application/json`이 아닌 `application/x-www-form-urlencoded`로 보내야 합니다.
그렇지 않으면 `401 에러` 응답을 받게 됩니다.
아래 예시 코드로 설명하겠습니다.
- 카카오 인증 서버에 연결 끊기 요청을 보낼 때 `POST`로 보내되, content-type을 `application/json`이 아닌 `application/x-www-form-urlencoded` 으로 보내야 합니다.
따라서 `consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE`로 작성합니다.
`produce`가 아닌 점에 주의가 필요합니다. - 응답을 받을 땐 JSON 으로 받습니다.
따라서 `produces = MediaType.APPLICATION_JSON_VALUE`로 작성합니다.
여기서도 `consume`이 아닌 점에 주의가 필요합니다. - Header 부분은 `Authorizaton` 부분이 들어가야 합니다.
- 앱 어드민 키를 이용하기 때문에 `Authorization: Bearer {$appAdminKey}`가 아닌 `Authorization: KakaoAK {$appAdminKey}`가 들어가야 합니다.
예시 코드에선 `appAdminKey` 값을 불러올 때 `KakaoAK` 부분이 포함되어 있습니다.
- 앱 어드민 키를 이용하기 때문에 `Authorization: Bearer {$appAdminKey}`가 아닌 `Authorization: KakaoAK {$appAdminKey}`가 들어가야 합니다.
- `application/x-www-form-urlencoded` 형태로 보내려면 `@RequestParam`을 사용해야 합니다.
- 공식 문서에 따르면 `target_id_type` 부분은 "user_id"로 고정이라 값을 설정하지 않아도 들어갈 수 있도록 `defaultValue`로 값을 채웠습니다.
- `target_id` 부분은 회원탈퇴하려는, 즉, 앱과 카카오 연동을 끊으려는 사용자의 숫자로 된 `kakao id`를 전달합니다.
3. 연결 끊기 요청 보내기
이제 남은 일은 서비스 계층에서 요청을 보내고 응답을 받으면 됩니다.
응답받은 값은 연결 끊기에 성공한 사용자의 kakao id 입니다.
읽어주셔서 감사합니다.
'Spring' 카테고리의 다른 글
Spring Event Deep Dive (0) | 2025.01.16 |
---|---|
[Spring] MockMvc 사용 시 Page 인터페이스의 직렬화 문제 (0) | 2024.12.31 |
[Spring] 직렬화/역직렬화 시 'is' prefix 가 안붙는 이유 (1) | 2024.10.30 |
[Spring Batch] ItemWriter 가 List<T> 를 전달받으려면? (Spring Batch 5) (0) | 2024.07.01 |
[Spring] Response DTO 직렬화 문제 (1) | 2024.06.13 |