마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

소셜 플러그인과 인증 보안

0 추천

안녕하세요
모바일 디바이스에서 소셜 플러그인 사용에 대한 궁금한 것이 있어 문의드립니다.
보통 카카오 게임들(또는 페이스북이나 기타 소셜 플러그인을 사용한 앱)은 카카오 계정으로 로그인하면 휴대폰을 바꿔가면서 사용해도 계정 데이터가 동기화 됩니다.
그 카카오 계정으로 사용자를 식별하기 때문일 겁니다. 사용자 입장에서는 굉장히 편하죠.

그런데 그 사용자 데이터는 카카오와 무관한 별도의 게임사 서버에 저장되어 있을테고,
게임 클라이언트나 서버에 입장에서는 해당 카카오 계정의 일반적인 정보만을 접근할 수 있고 비밀번호는 알 수가 없을 텐데요
게임 클라이언트가 서버에 계정 정보를 보내면서 자기의 데이터를 요청했을 때, 서버가 어떻게 그 사람이 정말 해당 카카오 계정의 사용자라는 걸 확인할 수 있냐 하는 것입니다.
오늘 오후에 몇 시간 생각을 해 봤는데..

제 결론은 "결!" (지니어스에서...) 없다는 겁니다.
제 판단이 맞는 걸까요?

일반적으로 자사의 아이디와 함께 비밀번호까지 입력받는 경우에는 그 비밀번호가 사용자의 고유의 것이고 다른 사람이 알 수 없는 것이라는 가정을 통해서 사용자를 식별할 수 있지만
앱에 소셜 플러그인을 사용하는 것은 해당 소셜 서비스에 로그인한 것이지, 그 소셜 플러그인 사용하는 앱에 입장에서는 그 사용자만의 고유의 비밀정보를 전혀 모르기 때문이죠.

만약, 어떤 사용자가 역공학등으로 로직을 알게 되었을 때, 다른 사용자의 아이디는 비밀정보가 아니기 때문에 그것을 이용하여 그 사용자의 데이터를 조작할 수 있게 됩니다.

대체할 수 있는 방법들을 생각해 보니 너무 취약하거나 불편한 것들 뿐이네요.. 
첫째, 임의로 고정된 비밀번호 할당하는 것은 모든 사용자가 같은 비밀번호를 공유하는 개념이라 너무 취약한 것 같고 (네트워크 상에서 안전하게 전송될 수 있다는 것과는 별개로...)
둘째, 사용자별로 난수를 생성해 비밀번호로 할당하고 클라이언트에 저장하는 것은 앱을 재설치 한다거나 할 때 저장된 정보가 없어지니까 너무 불편할 것 같고요 (다시 그 난수(비밀번호)를 서버에서 받아오기 위해 인증이 필요하다는 순환논리문제)

괜찮은 방법이 없을까요?

stylix (160 포인트) 님이 2015년 9월 1일 질문

1개의 답변

0 추천
oauth2 개념을 먼저 이해하시는게 좋겠네요
 
현재 존재하는 대부분의 인증시스템인 OAuth2 방식으로 돌아갑니다. 비밀번호는 로그인을 제공하는 플랫폼 업체에 로그인할때만 필요하고 3rd part 업체들은 플랫폼 제공업체에 정보를 요청하면 임시 아이디/비밀번호 개념의 Token이 생성됩니다
 
이 Token만 있으면 모든게 가능하기 때문에 Token는 항상 유효기간이 존재합니다. (짧으면 7일, 60일 )
 
Token의 경우 유출이 되더라도 당장의 계정권한은 탈취 당하지만 원래의 아이디/비밀번호는 노출되지 않기 때문에 좀 나은 편입니다 그리고 어느정도 시간이 지나면 사용할 수 없구요
 
 
 
페이스북 일반 사람들의 계정으로 스팸글이 올라오는게 이러한 이유입니다. 페이스북 또한 OAuth2 방식을 사용중이며 일부 사람들이 재미삼아 하는 심리테스트 등을 통해 Token이 유출되게 되는겁니다
 
Token 을 알고 있으면 페이스북의 facebook graph api 에 접근할 수 있기때문에 스팸글이 올라오는 것입니다
 
 
"앱에 소셜 플러그인을 사용하는 것은 해당 소셜 서비스에 로그인한 것이지, 그 소셜 플러그인 사용하는 앱에 입장에서는 그 사용자만의 고유의 비밀정보를 전혀 모르기 때문이죠."
 
이부분에 대해 부가 설명을 드리자면 일단 Token이 발급되면 소셜 서비스에서 제공하는 API를 사용할 수 있고 이 API를 통해서 사용자 정보를 얻어 올 수 있습니다. 그리고 각각의 사용자별로 고유 ID 가 있기때문에 구분도 가능합니다 이 고유 ID는 해당 회원이 탈퇴하거나 재가입하지 않는이상 바뀌지 않는 고유값입니다.
 
마지막으로 다시 한번 OAuth와 OAuth 2.0 대해 먼저 알아보시는걸 추천드립니다 :)
하늘아륑 (16,800 포인트) 님이 2015년 9월 1일 답변
그런데 제가 궁금해하는 부분과는 약간 초점이 다른 것 같아 부가적인 설명을 드리자면...
게임사 서버의 관점에서 클라이언트의 요청이 올바른 소셜 계정의 사용자인지를 확인하는 것인데요. 사용자 당사자가 어느정도 역공학 능력이 있다는 가정입니다.
말씀하신 소셜 ID라는 것을 이용해서 식별한다고 했을 때, 이 소셜 ID가 다른 사람(개발자 포함)은 알 수 없는 정보인가요?
예를 들어 앱A와, 앱B에서 얻어지는 동일한 계정의 사용자의 소셜ID가 서로 다른가요?
그렇다면 그 방법을 이용할 수 있을 것 같은데요..
네어버 API 페이지를 봐도 소셜ID 부분을 잘 못 찾아서 문의드립니다.
토큰이 단방향 암호화되었거나 개인키를 모르는 상태라면 리버스엔지니어링이 거의 불가능하죠..
보통 동일 사용자라도 앱이 달라지면 다른 토큰이 발급되는 걸로 알고 있습니다.
이 토큰은 해킹되지 않는다면 서비스 운영하는 업체 외에는 다른 사람은 모르는 정보이죠..

그리고, 제대로 처리하려면 서버에서 클라이언트에서 넘겨받은 토큰을 소셜 서비스 서버에 쿼리해서 유효한 것인지 확인하는 작업을 거쳐야 합니다.

저도 트위트 로그인 처리할 때 클라이언트에서 넘겨준 토큰을 서버 단에서 트위트 서버에 접속해서 유효한 값인지 확인하고 처리하고 있습니다.
ID는 Token 으로 요청해야만 받을 수 있는 값입니다.
그리고 ID는 공개되었다고 하더라도 Token이 없이는 데이터를 가져올 수 없습니다
나머지는 이슬님이 답변해주셔서 패스하겠습니다 :)
...