서비스 서버와 Flutter간 API 통신 방법

Service Client 개발을 위해 flutter로 Anroid, iOS 네이티브 앱 개발을 하고 있습니다. Service Server는 FastAPI를 사용해서 개발하고 있습니다. 카카오톡 로그인 기능과 관련하여 Service Server와 Service Client간에 어떻게 정보를 주고 받아야 하는지, API를 어떻게 설계해야 할지 궁금한 점이 있어서 질문드립니다.

redirect가 아닌 '기본 방식’을 사용할 것이며, 권장 방법인 '카카오톡으로 로그인’으로 구현하려고 합니다.

이렇게 구현하게 되면 flutter 앱이 ‘KakaoTalk’, 'Kakao Auth Server’와 인증 절차를 거친 후 OAuthToken을 받을 수 있으며, 해당 토큰을 사용해서 카카오로부터 사용자의 카카오톡 index, 이름, 프로필 사진 등의 정보를 얻어오는 것까지 이해했습니다.

과거에 웹 프로젝트들을 진행하면서 Service Server에서 제가 직접 회원가입 및 로그인을 구현했을 때는, Service Server에서 토큰을 Service Client에 발급해줬습니다. 그리고 Service Client가 사용자와 관련되는 등 민감한 정보를 Service Server로부터 받기 위해서는 해당 토큰을 보내서 인증 과정을 거쳤습니다.

그런데 flutter를 사용한 네이티브 앱 개발 프로젝트를 진행하면서, 카카오 로그인 기능을 구현하려고 하면서 아래와 같은 질문들이 생겼습니다.

  1. 카카오 로그인을 사용하게 된다면 Service Client(flutter 네이티브앱)가 인증 과정에서 Service Server로 어떤 정보를 어떻게 보내야 할까요?
  2. Service Client가 Kakao Auth Server로부터 받은 토큰을 Service Server로 보내게 된다면, Service Server가 카카오로부터 추가 인증 절차를 거쳐야 할 것 같은데, 이 부분을 어떻게 구현해야 할지 궁금합니다. 그리고 Service Server가 Service Client로 카카오에게서 받은 토큰을 보내는 것 자체가 보안적으로 좋지 못하다는 글을 봤는데, 만약 맞다면 왜 그런지도 궁금합니다.
  3. Service Client가 Service Server로 토큰을 보내지 않는다고 하면, 해당 사용자가 올바른 사용자인지 Service Server에서는 무엇으로 판단할 수 있을까요? Service Server로 사용자의 kakao index만 보내는 걸 생각해봤는데, 이러면 보안적 측면에서 API 주소와 메서드만 알게 된다면 누구나 악용할 수 있을 거 같아서 걱정이 되네요.
  4. 프론트인 Service Client가 웹일 때와, 네이티브 앱일 때 API를 설계하는 부분에서 차이점이 있을까요? 있다면 어떤 차이점이 있을까요. 네이티브 앱에서 카카오 로그인 기능을 구현하면서 기존에 진행했던 웹 프로젝트와는 조금 다른 점들이 보이는 것 같은데 명확하지가 않습니다.

공식 문서도 정독하고, 구글링도 해보고, 유튜브도 봤는데 처음 도전해보는 분야다 보니 궁금한 점이 많습니다. 부디 확인 부탁드리겠습니다.

안녕하세요.

flutter 에서 제공하는 기본 방식은 클라이언트에서 인가 코드 및 토큰 발급 처리가 이루어 집니다.
따라서, 서비스 서버로 인가코드를 전달할 수 없고, 같은 이유로 서비스 서버로 부터 접근 토큰을 전달 받으실 필요 없습니다.

1.서비스 서버에서 필요한 정보만 전달 부탁드립니다.
카카오 로그인 후, 서비스측의 회원 가입 및 인가처리를 위해 사용자의 개인정보나 접근토큰, 회원번호 등을 서비스 서버로 전달할 수 있습니다.

전달되는 정보는 서비스측 구현에 맞게 선택하시면 되며, 보통 접근 토큰 또는 회원번호를 전달하여 서비스측의 회원 가입 및 인가처리를 진행 합니다.

2. 대부분 접근토큰을 클라이언트에서 서비스 서버로 전달 할 필요가 없으며, 전달 할 필요가 있는 경우라도 추가 인증이 필요하지 않습니다.
접근토큰은 이미 사용자의 정보에 접근 가능하도록 인증된 토큰 입니다. 별다른 추가 인증이 필요하지 않습니다. 서비스 서버에서 접근토큰이 필요할 경우만 토큰을 전달 하며, 그렇지 않은경우 굳이 전달하실 필요 없습니다.

3.서비스 서버는 해당 요청이 유효한 클라이언트로 부터 전달된 요청인지 자체적으로 검증 하셔야 합니다.
이를 위해 접근토큰을 전달 하셔도 되며, 키 해시값이나 애플리케이션에 내장한 특정 값을 API 요청 시 전달하여 식별 하셔도 됩니다. 다만, 접근토큰을 활용하고자 하신다면 이 보다는 id_token 사용을 권장 드립니다.

4.서비스마다 다르겠지만, 서비스측 인가 처리를 제외하고 웹과 앱의 API 설계는 큰 차이가 없도록 하는게 좋을것 같습니다.
웹의 경우 redirect_uri 에서 JWT등을 이용하여 서비스측 인가처리를 진행하시면 되며, 앱의 경우 접근토큰 발급이 클라이언트에서 이루어 지기에 로그인 완료 후, 서비스측 인가처리는 웹과 다르게 별도 API로 구현 하셔야 합니다.

2개의 좋아요

친절하고 자세한 설명 감사합니다! 덕분에 flutter 앱에 맞는 카카오 로그인 서비스를 잘 구현할 수 있게 됐습니다.