플러터 Android/iOS 네이티브 앱 방식을 사용해서 카카오 로그인을 구현하려고 합니다. 클라이언트 서버에서 카카오 토큰 발급 및 사용자 정보를 조회하여 해당 정보를 백엔드 서버로 전달하고자 합니다. 이때 전달받은 정보에 대해 백엔드 서버에서 검증이 필요한지, 만약 필요하다면 어떤식으로 진행하면 될지 고민입니다.
회원번호는 변하지 않는 고유한 값이라 만약 이 값이 악성유저에 의해 갈취당했을 때 서버측에서 진짜 사용자의 요청인지 혹은 악성 유저에 의한 요청인지 알 수 없지 않나?라는 의문이 생겼습니다. 그럼에도 불구하고 임시코드인 카카오토큰이 아닌, 회원번호를 전달하는 것을 추천해주신 이유가 있을까요?
또, 백엔드 서버에서 회원번호를 통한 추가 검증이 필수적인지 혹은 선택사항인지도 궁금합니다.
서비스측 인가처리를 위한 요청에 회원번호만을 전달하여 처리하는 경우, 서비스는 이 요청이 클라이언트의 유효한 요청인지 확인하실 필요가 있습니다.
이를 위해 access_token이나 id_token을 전달하실 수 있습니다.
전달받은 토큰의 유효성 검증(토큰 정보 보기 or id_token 유효성 검증)을 통해 해당 유저가 발급 받은 토큰인점을 확인하신 뒤, 서비스측 회원 가입 및 인가처리를 하실 수 있습니다.
첨부해 주신 글은 문의 주신것 처럼 서비스측 인가처리(ex, 세션 or JWT 등)를 위해 회원번호만을 전달해도 되는지에 대한 문의 입니다만, 서비스측 인가 처리 이후를 가정한 API요청이 안전한 경우를 예를 들어 대략적인 답변을 드렸습니다. 이 답변이 오해를 드릴수 있기에 해당 답변은 추가 답변 하도록 하겠습니다.
여기서는 Flutter SDK를 사용하는 경우 카카오 API호출은 Flutter SDK에 일임하고 서버와 액세스 토큰은 공유하지 않는 것을 추천한다고 하시는데요. 현재 진행하는 프로젝트에서도 웹뷰는 사용하지 않고 플러터 SDK를 사용하고 있습니다. 어떤 차이점이 있어서 위 글에서는 액세스 토큰을 공유하지 않는 것을 추천하고, 여기서는 공유하여 검증하는 것을 추천하는건지 궁금합니다.
액세스 토큰은 API 호출로 개인정보 조회 가능한 이름 그대로 접근 토큰입니다. 가급적 격리된 한영역에서 사용하는 것이 좋습니다.
네이티브앱은 개인 기기에서 작동하므로 개인 기기의 권한을 획득하지 않는한 정보를 침해할 수 없으므로
다른 곳으로 전달하지 않고 네이티브앱내에서 카카오와 교신을 일임하면 상대적으로 안전하니 추천드리는 것입니다.
네이티브앱내 SDK를 이용하여 토큰 발급 시, 내부적으로 PKCE 스팩으로 처리되어 더 안전한 부분도 있습니다.
다만, 액세스 토큰을 서버로 전달하는 것을 SSL 보안통신을 이용하고 서비스에서 필요한 수준의 보안 장치를 두면 못하는 것도 아니나
간결한 개발을 위해 일임하도록 추천드립니다.