핀테크를 접목한 주식 어플을 개발하던 중 카카오 로그인은 잘되는 것을 확인했으나, 구글 소셜 로그인이 계속 PlatformException 에러가 뜨면서 로그인이 안되는 것을 확인했다…!
이전에 Google OAuth를 웹 페이지에서 성공적으로 구현해보았지만, 어플에서는 에러를 마주했다. 이것은 아직 내가 OAuth를 정확히 알지 못한다는 뜻이다. 그때를 생각해보면 결과에만 너무 급급했던 것 같다. 그래서 이번 기회에 OAuth를 다시 공부해보았다!!
OAuth(Open Authorization)는 인터넷 사용자들이 애플리케이션에 비밀번호를 제공하지 않고도 타사 애플리케이션이나 웹사이트에 접근할 수 있도록 해주는 인증 프로토콜이다. OAuth는 "권한 위임"의 개념을 사용하여, 사용자가 서비스 제공자에게 자신의 데이터를 안전하게 접근할 수 있는 권한을 위임하는 방식으로 동작한다. 이때 사용자는 직접 애플리케이션에 비밀번호를 입력하지 않기 때문에 보안이 강화된다.
간단하게 예시를 들어보겠다. 만약 내가 너무 좋아하는 음악 플레이리스트가 있어 이것을 친구에게 공유하고 싶다. 하지만 나는 내 음악 스트리밍 서비스 아이디를 친구에게 알려주고 싶진 않다! 이때, 음악 스트리밍 서비스에서 친구에게 당신의 플레이리스트에 접근할 수 있는 권한만 부여할 수 있는 기능이 있다는 것을 알았다. 이로써 친구는 내 플레이리스트를 보고 수정할 수 있지만, 친구는 결국 내 계정 정보는 알지 못한다. 이처럼 OAuth는 사용자가 비밀번호를 제공하지 않고도 특정 데이터에 대한 접근 권한만을 안전하게 공유할 수 있는 방법을 제공한다!
- 사용자 요청: 사용자는 애플리케이션에 로그인하거나 특정 기능을 사용하려고 시도한다.
- 인증 요청: 애플리케이션은 OAuth 제공자(예: Google, Facebook)에 인증을 요청한다.
- 사용자 승인: 사용자는 OAuth 제공자가 제공하는 인증 페이지에서 로그인하고, 애플리케이션에 특정 권한을 부여한다.
- 액세스 토큰 발급: OAuth 제공자는 애플리케이션에 액세스 토큰(사용자가 특정 애플리케이션에 대한 권한을 인증받았음을 증명하는 임시 키)을 발급한다.
- API 호출: 애플리케이션은 발급받은 액세스 토큰을 사용하여 OAuth 제공자의 API에 접근하고, 사용자 데이터를 가져온다.

<OAuth 동작>
OAuth의 장점
- 보안 강화: 비밀번호를 공유하지 않아 사용자 정보를 안전하게 보호한다.
- 편리함: 여러 서비스에 쉽게 로그인할 수 있어 사용자 경험이 향상된다.
- 권한 관리: 특정 데이터에 대한 접근 권한만 부여할 수 있어 안전하다.
OAuth의 단점
- 복잡성: 구현 및 설정이 복잡할 수 있으며, 잘못 설정하면 보안 취약점이 생길 수 있다.
- 의존성: 외부 서비스에 의존하게 되어, 해당 서비스가 중단되면 기능에 영향을 받을 수 있다.
- 사용자 혼란: 사용자가 권한 요청을 이해하지 못하면 불안감을 느낄 수 있다.
이해하기 쉽게 설명하자면, Google OAuth 로그인 기능이 처음에는 잘 작동하지 않은 이유는 Google Cloud Console에 등록된 인증 정보와 실제 개발 환경에서 사용된 인증 정보가 일치하지 않았기 때문이다. 구체적으로 말하면, debug.keystore 파일의 SHA-1 인증서 지문이 문제가 되었던 것이다!
Google Cloud Console에서 OAuth 클라이언트 ID를 설정할 때, 개발자는 특정 SHA-1 인증서 지문을 등록한다. 이 SHA-1 지문은 애플리케이션이 Google API에 접근할 때 자신의 신원을 증명하는 데 사용된다.
Android 애플리케이션을 개발하고 테스트할 때, debug.keystore라는 파일이 자동으로 사용된다. 이 파일은 앱을 서명하는 데 필요한 인증서를 가지고 있다. 그런데, debug.keystore는 개발자마다 다르고, 각 개발 환경에서 자동으로 생성된다. 즉, debug.keystore에 포함된 SHA-1 지문은 개발자마다 다르다는 것이다!
처음에 Google Cloud Console에 등록한 SHA-1 지문은 초기의 개발 환경에서 생성된 debug.keystore를 기반으로 했을 것이다! 그런데 다른 컴퓨터(클론을 받은 다른 개발자나 팀원)에서 프로젝트를 실행하면, 그 환경의 debug.keystore 파일에 있는 SHA-1 지문이 Google Cloud Console에 등록된 지문과 다르기 때문에 Google 인증이 실패하게 되는 것이다.
이 때문에 클론을 받아 개발하던 나는 PlatformException 오류를 마주한 것이다! Google이 등록된 지문과 일치하지 않는 SHA-1 지문을 가진 요청을 거부했기 때문이다!
이렇게 다시 기초부터 천천히 학습해 앱에서도 Google OAuth를 성공적으로 구현해냈다!
그럼 클라이언트는 모두 다른 기기일 텐데, 그럼 구글 로그인이 어떻게 가능한가? 나와 같은 에러가 뜨는 것이 아닐까?
배포된 앱은 release.keystore로 서명되는데, 이 서명은 모든 사용자에게 동일하게 적용된다고 한다.
괜한 걱정을 했나 보다…~
잘 읽었습니다 😊