안드로이드 카카오 로그인 관련 질문 - 액세스 토큰 검증

안녕하세요.
안드로이드 모바일 앱 환경에서 카카오 로그인 시 질문이 있어 글 남깁니다.

□ 사용환경

  • 프론트엔드 : Kotlin
  • 백엔드 : Spring

모바일 환경의 경우 안드로이드 SDK를 사용하여 프론트엔드 측에서 인가코드/액세스토큰/사용자정보를 받아와, 사용자 정보를 백엔드 측으로 보내 해당 사용자 정보를 백엔드 측에 저장하는 방법이 권장된다고 알고 있습니다.
제가 진행 중인 프로젝트에서도 다음과 같은 방법으로 안드로이드 환경에서 로그인 후 저희 서버 측에서 jwt 토큰을 발급할 예정입니다.
여기서 몇 가지 질문이 있습니다.

[1] 사용자 정보 본인 서비스 DB 저장 시 유효성 검증 여부

카카오 리소스 서버에서 발급한 액세스 토큰을 전달하여 백엔드에서 해당 액세스 토큰을 바탕으로 해당 사용자 존재 여부를 확인하는 것이 아닌, 프론트엔드에서 백엔드로 사용자 정보만 전달하여 저희 서비스 DB에 정보를 저장하는데 저희 서버의 로그인 엔드포인트로 가짜 데이터를 담아 요청을 보내도 사용자 정보는 그대로 저장될 것인데 유효성 검증 로직을 추가할 수 있는 방법이 있을까요?

[2] 카카오 메시지와 같은 추가 기능 이용 시 질문사항

저희 프로젝트에서 생각하고 있는 기능 중 ‘예약 성공 시 예약 성공 여부를 카카오톡 메시지로 전달’ 이라는 기능 개발을 생각 중입니다.
사업자 등록이 불가능하여 카카오 비지니스를 통한 채널 알림톡 사용에 제한이 있어 다음 기능 구현을 위해 카카오 메시지 문서를 참고하여, 사용자에게 ‘나에게 메시지 보내기’ 또는 ‘친구에게 메시지 보내기’ 기능을 통해 예약 성공 시 예약 확인 여부를 메시지로 보내려고 합니다.
https://developers.kakao.com/docs/latest/ko/message/rest-api#custom-template-msg-friend-request-body
위 문서를 참고하였을 때, 메시지를 보낼 대상의 uuid만 있으면 메시지를 보낼 수 있는 것 같습니다.

2-1) 사용자 정보를 받아올 때 id 값은 바뀔 일이 없이 고유한가요?

다른 카카오 데브톡 질문을 참고하였을 때, 최신 버전에서는 사용자 정보 응답에 담긴 id 값이 바뀔 일이 없다는 글을 보았지만, 혹시나 하는 마음에 질문드립니다.

2-2) 카카오 리소스 서버 발급 액세스 토큰 저장 여부 및 갱신 관련 질문

위의 [2]에서의 질문과 같이 메시지를 보낼 때, 결국 카카오 리소스 서버에서 발급하는 액세스토큰을 백엔드측으로 보내, 해당 액세스 토큰과 예약 서비스에 연관된 사용자의 uuid를 바탕으로 요청을 보내야하는 것 같습니다.
그런데 이때, 액세스 토큰이 만료된 경우에는 어떻게 처리하는 지 궁금합니다.
안드로이드 SDK(이해하기 | Kakao Developers 이해하기)에 의해서는 자동으로 토큰이 갱신된다고 하지만, 제가 구상한 구조는 결국 백엔드 측에서 메시지를 보내는 카카오 서버 엔드포인트를 호출하기 때문에 토큰 갱신 관련하여 문제가 생긴다고 생각합니다.
아니면, 메시지를 프론트엔드에서 보내도록 구조를 바꿔야하는 게 맞는 건가 싶습니다. 백엔드에서 프론트엔드로 예약 서비스에 연관된 사용자의 카카오 고유 id를 보내어 프론트엔드(안드로이드 모바일)에서 처리하는 것이 맞을까요? (다음과 같이 처리 시 기타 사용자의 카카오 고유 id를 프론트로 전달하는 것에 있어 보안 관련 유의사항이 있을까요?)

[3] 카카오 리소스 서버 발급 토큰 외 서비스 서버에서의 추가 토큰 발급 시 만료기한

프론트엔드에서 백엔드로 데이터를 받는 요청을 보낼 때 저희 서버 측에서 발급한 jwt 토큰을 사용합니다.
위에서 서술한 방식처럼 카카오 리소스 서버에서 발급한 토큰과 서비스 서버에서 발급한 토큰을 둘 다 프론트에서 가지고 있어야할 경우, 저희 서비스 서버에서 발급한 토큰의 만료기한을 카카오 리소스 서버에서 제공한 액세스 토큰의 만료기한과 같도록 설정하는 것이 일반적인가요?


질문의 내용이 너무 길어 죄송합니다.
관련 내용에 있어 이해가 부족하여 양해 부탁드리겠습니다.

안녕하세요.

[1] 사용자 정보 본인 서비스 DB 저장 시 유효성 검증 여부

유사문의 참고 부탁드려요. 카카오 Oauth 로그인 관련 질문 - tim.l 님의 게시물 #2

2-1) 사용자 정보를 받아올 때 id 값은 바뀔 일이 없이 고유한가요?

uuid 가 아니라 v2/user/me 의 id 라면 디벨로퍼스앱과 카카오 계정에 종속적인 고유값입니다.
uuid 라면, 디벨로퍼스앱과 카카오톡 연동된 계정 종속적인 고유값입니다.

2-2) 카카오 리소스 서버 발급 액세스 토큰 저장 여부 및 갱신 관련 질문

우선, 답변에 앞서 디벨로퍼스에서 제공하는 메시지 API는 서비스에서 고객에게 일방 발송하는데 적합하지 않습니다. 메시지 API는 서비스내 카카오로그인으로 가입한 카카오톡 친구간에 1:1로 발송하는 메시지 입니다.

참고. 친구 api와 피커, 메시지 api 사용을 위한 체크 리스트

액세스 토큰이 만료된 경우에는 리프레시 토큰으로 갱신하여 재발급 받거나 다시 카카오 로그인 해야합니다.

REST-API가 아니라 안드로이드 SDK 사용을 전제로한다면, 액세스토큰과 리프레시 토큰을 적절한 보안장치를 두고 백엔드로 전송하여 사용하시면됩니다.


액세스 토큰 격리는 보안상 유리하니 권장 하고 있습니다. 다만, 필요 시 적절한 보안 설정으로 전달하는 것 자체가 문제가 되지 않습니다.

아니면, 메시지를 프론트엔드에서 보내도록 구조를 바꿔야하는 게 맞는 건가 싶습니다.

앞서 참고로 안내드린 링크와 같이 이상황이 아니더라도 프론트에서 백엔드로 중요정보를 전달할 상황은 항상 있으므로 적절한 보안 조치 하시되 운영하시는 서비스 상황에 맞게 취사 선택 하시면 됩니다.

사용자의 카카오 고유 id를 프론트로 전달하는 것에 있어 보안 관련 유의사항이 있을까요?

발신자 수신자 모두 카카오 로그인으로 운영하시는 서비스에 가입하며 친구목록 조회와 메시지 발송에 동의 해야 UUID 조회가능하며,

메시지 발송 시, 액세스 토큰과 UUID의 조합으로 발송하게됩니다.
앞서 참고로 안내드린 링크와 같이 요청의 정합성을 체크하시면 됩니다.

[3] 카카오 리소스 서버 발급 토큰 외 서비스 서버에서의 추가 토큰 발급 시 만료기한

카카오의 액세스토큰과 운영하시는 서비스의 JWT토큰은 용도가 다르다고 생각합니다.

운영하시는 서비스의 JWT토큰은 카카오와 무관하게 자체 제공하는 기능 사용을 위한 접근 제어용이고 카카오의 액세스토큰는 카카오 API호출을 위한 접근 제어용이므로

카카오 API 호출 시, 액세스토큰 만료 여부에 따라 토큰 갱신하거나 갱신 불가능한 경우 카카오 로그인 하도록 제어 해주시면 됩니다.


앞서 참고로 안내드린 링크와 같이 이러한 상황은 카카오 로그인이 없어도 동일하게 발생하니

자체 회원가입 + 각종 소셜로그인(+각종 API) 사용을 전제로 생각해보시면 의사결정하시는데 도움이 될 것 같습니다.

감사합니다.