안드로이드, 스프링, 로그인 관련 질문입니다

문의 시, 디벨로퍼스 앱ID를 알려주세요.

친구 api와 피커, 메시지 api 사용을 위한 체크 리스트 ( 친구 api와 피커, 메시지 api 사용을 위한 체크 리스트 ) 먼저 확인해주세요.


안드로이드에서 sdk를 활용해서 유저의 정보를 불러오게 되면, 스프링 서버에 넘기게 될때 그 유저의 넘겨받게 되는데 그러면 이때 socialId 그러니까, providerId를 통해서 유저의 정보를 구분 하면 되는걸까요?? 카카오톡에서 제공하는 accessToken을 서버로 넘기는건 지양한다고 알고있어서 어떤 정보를 서비스 서버에 넘겨야하는지 모르겠습니다!

그리고 providerId를 서비스 서버에 넘기게 된다면, 스프링에서는 password를 임의로 생성해야하는 걸까요??


지금은 이런식으로 구성되어있는데 여기서 만약 회원가입이 안되어있는 유저라면 db에 저장하면 되는걸까요??

그리고 전체적으로 안드로이드에서 sdk를 사용하게 되면, 안드로이드에서 유저정보만 넘겨주기 때문에, 스프링단에서는 폼로그인 이랑 다른게 없지 않나요?

'socialId 그러니까, providerId를 통해서 유저의 정보를 구분 하면 되는걸까요?? '

네, 맞습니다. 카카오 로그인으로 가입한 회원은 이후 로그인 부터는 id 항목으로 식별해야합니다.

Spring에서 구현 시, 참고 사항

  • 회원번호는 Long 타입으로 1~9223372036854775807 범위 내 숫자 값입니다. 회원번호의 길이가 변해도 기능이 정상 동작하도록 구현해야 합니다.
'스프링에서는 password를 임의로 생성해야하는 걸까요??'

네, 여타 소셜로그인과 동일하게 ID/PW은 불필요하므로 password의 경우, 보통은 개발하신 기존 로직과 동일하게 동작하도록 임의 난수로 저장하여 도용을 방지합니다.

'만약 회원가입이 안되어있는 유저라면 db에 저장하면 되는걸까요??'
'안드로이드에서 유저정보만 넘겨주기 때문에, 스프링단에서는 폼로그인 이랑 다른게 없지 않나요?'

네, 맞습니다.
안드로이드에서 일반회원가입하는 것과 동일하게 처리 해주시면 됩니다.

Spring에서 구현 시, 참고 사항 *

  • 카카오 계정의 이메일은 대표메일 설정변경으로 변경될 수 있는 값입니다. 사용자가 카카오 로그인으로 신규 가입한 이후에는 반드시 사용자 정보 가져오기(/v2/user/me) API 응답의 회원번호(Service User ID, id)로 저장된 고객을 식별해야 합니다.

그렇다면 스프링 시큐리티를 적용하는게 의미 없는게 아닌가요?? 단ㄴ지 정보만 넘겨 받는다고 생각이 듭니다!

안녕하세요.

구현하신 안드로이드 앱이 네이티브로 되어 있나요? 아니면 웹뷰를 사용하는 하이브리드 형식인가요?
사용하신다는 SDK가 카카오에서 제공하는 Android SDK 가 맞으실까요?

안드로이드 sdk가 맞습니다!! 그래서 로그인과 회원가입이 서비스 서버측에 넘길때 같은 api로 요청하게 되는데 필요한 정보가 유저의 닉네임과 이메일일때 이 값을 데이터 베이스에 저장한다고 하면 결국 넘겨야 하는 데이터는 이메일과 닉네임 프로바이더id인데 서버측에서는 프로바이더 id를 기준으로 판단하면 되기때문에 굳이 스프링 시큐리티를 적용해야하는가 해서요!

Spring Security Oauth2 Clinet 사용하실 필요 없습니다.

이 모듈은 웹서비스에서 Oauth2.0 인증 플로우를 지원하기 위해 제공되는 기능으로
서비스는 웹이 아닌 안드로이드 네이티브 모듈에서 카카오 로그인 진행 하므로 전혀 사용하실 필요 없습니다.

주요한 것은 네이티브 앱에서 카카오 인가처리(토큰발급)까지 진행된 후, 서비스측의 회원 가입 및 인가처리를 어떻게 하느냐에 있을것 같은데요.

접근토큰을 전달하여도 되며, 회원번호나 사용자 정보를 전달하여도 됩니다.
단, 이러한 서비스측 API에서 본인이 제작한 유효한 디바이스에서의 요청인지 판단하실 필요가 있습니다.

만약, 앱에서 별다른 보안처리가 존재하지 않는 경우 접근토큰 만을 서비스로 전달하여 이를 대신할 수도 있습니다. 접근토큰은 카카오톡에서 사용자 인증후 발급 되기에 전달된 토큰으로 사용자 정보를 조회하시고 필요하신 회원가입 및 인가처리를 하실 수 있습니다.

만약, 앱에서 별다른 보안처리가 존재하지 않는 경우 접근토큰 만을 서비스로 전달하여 이를 대신할 수도 있습니다. 접근토큰은 카카오톡에서 사용자 인증후 발급 되기에 전달된 토큰으로 사용자 정보를 조회하시고 필요하신 회원가입 및 인가처리를 하실 수 있습니다.

이경우는 카카오에서 발급한 accessToken을 서비스 서버에 넘기는 건가요?? 근데 지양한다고 알고있어서 만약 안드로이드에서 SDK를 쓰게 되면 그냥 ProviderId를 서비스 서버에 넘기는 방식으로 구현하려고 하는데 이렇게 하는게 일반적인건가 궁금합니다!

일반적으로 안드로이드랑 스프링으로 앱개발을 하는데 있어서 로그인 처리를 어떻게 해야 보안이 높은가 궁금합니다!

안녕하세요. 모바일 앱에서 백엔드로 소셜로그인 하는 방식은 대략 아래 정도 케이스가 있습니다.

(1) 카카오 Android SDK에 카카오와 교신을 일임하고 백엔드에는 데이터만 넘기는 방식

(2) 카카오 Android SDK이용하여 카카오 로그인 후, 액세스 토큰을 백엔드에 전달하여 실제 데이터 교신은 백엔드에서 처리 하는 방식

(3) REST-API 방식을 사용하여 인앱브라우저로 인가코드 요청 부터 모두 백엔드에 일임하거나, 인가코드 요청까지만 앱내 인앱브라우저에서 하고 리다이렉트URI를 백엔드로 설정하여 이후 백엔드에 일임하는 방식

네이티브앱의 경우, 세가지 모두 백엔드와 SSL 보안통신한다면 보안상 큰차이는 없습니다. 구축하시려는 서비스 상황에 맞게 적용하시면 됩니다.

다만, 카카오와 교신을 Android SDK에 일임한다면 개발이 간소하고 백엔드에서는 일반회원가입을 위한 API가 있다면 약간의 개발만으로도 공통 모듈화 가능하므로 잘 판단하셔서 취사 선택 하시면 됩니다.


보안을 강화하시려면 위 내용보다 “전송 중 데이터 암호화”, “데이터 저장 시 암호화”, " 민감정보 데이터 로깅 금지", " SDK를 최신 버전으로 유지", " 최소 권한 액세스"가 잘 이루어지는지 체크 해보시면 좋을 것 같습니다.

보안 권장사항 | Kakao Developers 보안 권장사항

1개의 좋아요

더 질문 사항이 있어서 댓글 남깁니다!

만약 카카오톡에서 만든 ACCESSTOKEN을 스프링에 넘기게 되는 플로우를 가져가면 스프링에서는 API를 만들어서 시큐리티에서 하는게 아니라 컨트롤러 단에서 처리를 해야하는거 같은데 그러면 인증, 인가를 컨트롤러 단에서 처리를 해야해서 문제가 되지 않나요???

컨트롤러 단에서 처리를 해야하는거 같은데 그러면 인증, 인가를 컨트롤러 단에서 처리를 해야해서 문제가 되지 않나요???

정확히는 액세스 토큰 전달 API호출로 컨트롤러 호출해서 스프링 시큐리티에 요청하는 것이죠. 이방법이 특별이 문제있다고 생각되지는 않지만,
위에서 설명드린 3가지 방법중 액세스토큰을 클라이언트에서 전달하는 방식을 선택 하셨다면,
“컨트롤러를 통해” 인증, 인가를 처리할 수 밖에 없고
운영하시는 상황에 맞는 추가 보안 처리를 하시면 문제 없을 것같습니다.


부연설명드리면,

(1) 카카오 Android SDK에 카카오와 교신을 일임하고 백엔드에는 데이터만 넘기는 방식

→ 카카오 로그인이 없다고 생각하시면, 일반회원가입을 통해 이용자에게 입력받은 값을 서버에 전달하는 것과 다를바 없습니다. (백엔드에서 카카오 액세스 토큰을 활용해야하는게 아니라면 저는 이 방식을 추천합니다.)

(2) 카카오 Android SDK이용하여 카카오 로그인 후, 액세스 토큰을 백엔드에 전달하여 실제 데이터 교신은 백엔드에서 처리 하는 방식

→ Android SDK이용하면, 인가코드 요청 부터 액세스 토큰발급까지 한번에 처리됩니다.
액세스 토큰 발급을 Android단에서 하는 것이 부담스럽다면(?), 인앱브라우저 띄우셔서 백엔드에 인가코드요청 부터 액세스 토큰 발급까지 일임해도 무방합니다. 이방법이 아래 (3)번입니다.

(3) REST-API 방식을 사용하여 인앱브라우저로 인가코드 요청 부터 모두 백엔드에 일임하거나, 인가코드 요청까지만 앱내 인앱브라우저에서 하고 리다이렉트URI를 백엔드로 설정하여 이후 백엔드에 일임하는 방식


클라이언트 단에서 백엔드로 데이터를 전송할때 기본적으로 https보안 프로토콜을 사용했다면 데이터를 중간에 탈취 당할일이 거의 없겠지만, 민감정보의 경우 요청의 정합성을 검증하는 형태로 전달합니다. 아래 내용도 참고 해보시면 좋을 것 같습니다.

Proof Key for Code Exchange by OAuth Public Clients