[Spring] 회원탈퇴 시 Kakao OAuth2 연결끊기: REST API로 연결끊기 (OpenFeign)

2024. 10. 30. 02:06·Spring

이 포스팅은 회원탈퇴 로직을 구현할 때 kakao REST API 로 `연결 끊기`를 Spring 프로젝트에서 적용하는 방법에 대한 글입니다.

kakao rest api 공식 문서 바로가기

 

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 대시보드

앱 어드민 키는 kakao developers 에서 `내 애플리케이션`-왼쪽 햄버거 버튼에서 `앱키`로 접근하면 확인하실 수 있습니다.

맨 마지막 'Admin 키'가 앱 어드민 키

1-2. application-secret.yaml 에 환경변수로 저장

application 실행 시 읽을 수 있도록 환경변수로 저장

 

프로필 설정 파일을 이용해서 서버 실행 시 이 값을 읽을 수 있도록 합니다.

환경변수의 경우 `.env` 같은 확장자로 작성하되, 앱 어드민 키를 이용할 땐 헤더 부분에 `Authorization: Bearer {$appAdminKey}`가 아닌 `Authorization: KakaoAK {$appAdminKey}`가 들어가야 합니다.

 

환경변수에 공백이 포함될 땐 `"`나 `'`로 감싸야하기 때문에 아래와 같이 입력합니다.

KAKAO_APP_ADMIN_KEY="KakaoAK {$앱 어드민 키}"

 

1-3. 서비스 계층에서 앱 어드민 키 불러오기

@Value 애너테이션으로 설정 값 읽기

서비스 계층에서 회원탈퇴를 받을 때 `앱 어드민 키`를 이용해 카카오 인증 서버에 요청을 보냅니다.

따라서 `@Value` 애너테이션을 이용해 설정 파일에 작성한 값을 불러옵니다.

 

2. OpenFeign 클라이언트로 카카오 인증 서버에 요청 보내기

OpenFeign 라이브러리를 이미 사용 중이시면 `2-1. 의존성 추가` 부분은 건너뛰시면 됩니다.

2-1. OpenFeign 의존성 추가

OpenFeign 의존성 추가

`build.gradle`에 OpenFeign 의존성을 추가합니다.

2-2. 응답을 받는 DTO 작성

응답 DTO

연결 끊기 요청을 보내면 성공 응답으로 사용자의 id를 `JSON` 형태로 응답받습니다.

따라서 응답을 받는 DTO를 작성합니다.

2-3. 클라이언트 작성

중요한 부분입니다.

POST 요청 시 `application/json`이 아닌 `application/x-www-form-urlencoded`로 보내야 합니다.
그렇지 않으면 `401 에러` 응답을 받게 됩니다.

카카오 로그인 연결끊기 401 Error (https://devtalk.kakao.com/t/401-error/132161)

 

아래 예시 코드로 설명하겠습니다.

OpenFeign 클라이언트

  • 카카오 인증 서버에 연결 끊기 요청을 보낼 때 `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` 부분이 포함되어 있습니다.
  • `application/x-www-form-urlencoded` 형태로 보내려면 `@RequestParam`을 사용해야 합니다.
    • 공식 문서에 따르면 `target_id_type` 부분은 "user_id"로 고정이라 값을 설정하지 않아도 들어갈 수 있도록 `defaultValue`로 값을 채웠습니다.
    • `target_id` 부분은 회원탈퇴하려는, 즉, 앱과 카카오 연동을 끊으려는 사용자의 숫자로 된 `kakao id`를 전달합니다.

 

3. 연결 끊기 요청 보내기

서비스 계층에서 연결끊기 요청 보내기

이제 남은 일은 서비스 계층에서 요청을 보내고 응답을 받으면 됩니다.

응답받은 값은 연결 끊기에 성공한 사용자의 kakao id 입니다.

 

읽어주셔서 감사합니다.

'Spring' 카테고리의 다른 글

Spring Event Deep Dive  (2) 2025.01.16
[Spring] MockMvc 사용 시 Page 인터페이스의 직렬화 문제  (0) 2024.12.31
[Spring] 직렬화/역직렬화 시 'is' prefix 가 안붙는 이유  (2) 2024.10.30
[Spring Batch] ItemWriter 가 List<T> 를 전달받으려면? (Spring Batch 5)  (0) 2024.07.01
[Spring] Response DTO 직렬화 문제  (1) 2024.06.13
'Spring' 카테고리의 다른 글
  • Spring Event Deep Dive
  • [Spring] MockMvc 사용 시 Page 인터페이스의 직렬화 문제
  • [Spring] 직렬화/역직렬화 시 'is' prefix 가 안붙는 이유
  • [Spring Batch] ItemWriter 가 List<T> 를 전달받으려면? (Spring Batch 5)
옐리yelly
옐리yelly
  • 옐리yelly
    개발 갤러리
    옐리yelly
  • 전체
    오늘
    어제
    • 모든 글 보기 (84)
      • Project (22)
      • Java (4)
      • Spring (8)
      • Kubernetes (6)
      • Docker (2)
      • JPA (2)
      • Querydsl (2)
      • MySQL (9)
      • ElasticSearch (7)
      • DevOps (4)
      • Message Broker (3)
      • Git & GitHub (2)
      • Svelte (1)
      • Python (8)
        • Python Distilled (4)
        • Anaconda (1)
        • Django (0)
        • pandas (3)
      • Algorithm (1)
      • Computer Science (0)
      • 내 생각 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    querydsl
    예약 시스템
    Python
    비사이드
    elasticsearch
    JPA
    OOP
    argocd
    nks
    Project
    MySQL
    blue-green 배포
    커넥션 풀
    Spring
    성능 테스트
    docker
    k8s
    ncloud
    svelte
    RabbitMQ
    Message Broker
    프로젝트
    포텐데이
    pymysql
    gitops
    리팩토링
    mybatis
    devops
    pandas
    데드락
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
옐리yelly
[Spring] 회원탈퇴 시 Kakao OAuth2 연결끊기: REST API로 연결끊기 (OpenFeign)
상단으로

티스토리툴바