개발 환경 : Java 17, Spring Boot 3.3.4, Redis, JPA, JWT, Spring Security, 등…
현재 저희 서비스는 카카오 로그인을 통해서만 회원가입 및 로그인이 가능합니다. 백엔드에서는 카카오 인증 코드를 받아서 다음과 같은 절차로 처리하고 있습니다.
- “https://kauth.kakao.com/oauth/token” URL로 요청하여 카카오 액세스 토큰을 발급받습니다.
- “https://kapi.kakao.com/v2/user/me” URL로 요청하여 사용자 정보를 받아와 DB에 저장합니다.
- 이후 자체적인 액세스 토큰과 리프레시 토큰을 발급하여 클라이언트에 반환합니다.
이제 카카오 로그아웃을 구현을 하는 와중에 궁금한 점이 있어서 질문드립니다.
-
카카오 로그아웃 API를 사용할 때, 액세스 토큰을 헤더에 포함해서 보내야 하는 것으로 알고 있습니다. 현재 저희 시스템에서는 카카오에서 발급된 토큰(액세스/리프레시)은 사용자 정보를 가져올 때만 사용하고 있으며, 저장하지 않고 있습니다. 따라서, 카카오 로그아웃 API 요청 시 사용할 액세스 토큰을 어떻게 관리해야 하는지 고민입니다.
- 카카오 로그아웃을 구현할 때 카카오 로그인 처럼 인증코드를 받아와서 토큰을 발급받아야 하나요?
- 발급 받는 것이 아니라면 카카오에서 발급된 토큰(액세스/리프레시)을 백엔드에 저장해야 할까요?
- 아니면 프론트엔드에서만 관리하도록 두는 것이 좋을까요?
-
현재 자체적으로 발급한 액세스 토큰과 리프레시 토큰의 재발행 API는 구현되어 있습니다. 그런데 카카오에서 발급한 토큰에 대해서도 별도로 재발행 API를 호출해야 하는지 궁금합니다. 왜냐하면 카카오 토큰은 카카오 로그인,회원가입, 연결끊기에만 사용이 될텐데 재발행까지 구현하는 것이 오버엔지니어링이 되는 것이 아닌지 걱정이 됩니다.
안녕하세요.
로그아웃 기능은 사용자의 접근토큰을 만료 시킬 때 사용합니다.
접근토큰만을 만료시키기며 사용자의 카카오 계정 로그인 상태를 제어하지 않습니다.
따라서, 로그아웃 기능 사용 목적을 다시 확인 부탁드리며
사용자의 접근 토큰 만료가 목적이신경우
- 토큰을 갖고 있다면
해당 토큰을 사용하여 만료 시키시면 되며 (액세스 토큰 방식)
- 토큰이 없지만 발급받은 접근토큰을 모두 만료 시키고 싶으신 경우
어드민 키를 사용하여 만료 시키시면 됩니다. (어드민 키 방식)
로그아웃 기능 사용 목적은 일반적인 로그아웃처럼 서비스에서 로그아웃을 하는 기능입니다.
그러면 카카오에서 제공해주는 로그아웃은 카카오 접근 토큰을 만료시키는 것이라고 하셨는데
제가 사용하고자 하는 목적에서는 카카오에서 제공하는 로그아웃은 구현을 하지 않아도 된다고 이해하면 될까요?
그리고 토큰 재발행 또한 사용자의 접근토큰을 재발행 하는 것인거죠? 사용자의 카카오 계정 로그인 상태를 제어하는 것이 아니라
네, 서비스측 로그아웃과 카카오 계정 로그아웃, 사용자의 접근토큰 만료는 다르게 접근하셔야 합니다.
서비스측 로그아웃 시,
사용자의 개인정보 보호를 위한 노력으로 그동안 발급받은 접근토큰을 로그아웃 API를 통해 만료 시킬 수 있습니다.
하지만 이는 필수 구현 사항은 아닙니다.
접근 토큰 재발행은 사용자의 접근토큰만을 의마하며 카카오 계정 세션에 대한 상태 변경을 의미하지 않습니다.
서비스가 카카오 계정도 함께 로그아웃하기를 윈한다면 카카오계정과 함께 로그아웃 기능을 사용할 수 있지만, 어디까지나 서비스가 이를 직접 제어할 수는 없고 사용자의 동의가 있어야만 합니다.
그렇다면
회원탈퇴를 할 때는 연결끊기 api를 해야한다고 알고 있어요.
이때 카카오의 접근 토큰으로 구현을 해야한다고 한다면
카카오의 접근 토큰을 저장을 해야 할텐데, 이때는 토큰 재발행 api가 필요하지 않나요?
기존에 저장되어있던 토큰이 유효하지 않다면 재발행이 되어야한다고 생각이 듭니다.
연결끊기도 사용자 접근토큰 없이, 어드민 앱 키를 이용한 회원번호 만으로 진행할 수 있습니다.
특히, 연결끊기의 경우 사용자 접근토큰을 재발급 받을 수 없는 상황도 있을 수 있기에 대부부 서비스에서는 어드민 앱 키를 사용하여 연결 끊습니다.