소셜 로그인만 쓰는 사용자가 탈퇴하고 싶을 땐 어떻게 해야 할까?

소셜 로그인만 쓰는 사용자가 탈퇴하고 싶을 땐 어떻게 해야 할까?

요즘 많은 서비스가 구글이나 카카오 같은 소셜 로그인을 붙이고 있죠. 사용자 입장에선 클릭 몇 번으로 가입하고 로그인할 수 있으니 편하고, 만드는 입장에서도 복잡한 인증 로직을 직접 다 구현하지 않아도 되니 여러모로 좋습니다. 저도 몇몇 프로젝트에 적용해보면서 확실히 사용자 경험이 좋아지는 걸 느꼈고요.

그런데 문득 이런 생각이 들었습니다.

만약 사용자가 구글 계정 설정 같은 곳에 들어가서 우리 서비스 앱 연결을 해제해버리면, 그 사용자는 우리 서비스에서 어떻게 탈퇴할 수 있지?

로그인은 당연히 안 될 텐데, 그럼 계정은 그대로 남아있는 걸까요? 혹시 사용자가 원해도 탈퇴할 방법이 없어지는 건 아닐까요? 조금 더 생각해보니, 이게 생각보다 간단한 문제가 아니었습니다.


소셜 로그인의 기본 원리: OAuth와 OIDC 살짝 짚어보기

우리가 흔히 쓰는 소셜 로그인은 대부분 OAuth 2.0OpenID Connect (OIDC) 라는 기술을 기반으로 동작합니다. 깊게 들어갈 필요는 없지만, 핵심만 간단히 짚어보죠.

  • OAuth 2.0: 사용자의 비밀번호를 직접 받지 않고도, 다른 서비스(구글, 카카오 등)의 리소스에 접근할 수 있는 권한을 안전하게 위임받는 방식입니다. "로그인 대신 해줄게" 보다는 "네 정보(이름, 이메일 등) 접근해도 좋다고 허락해줘"에 가깝습니다.
  • OIDC: OAuth 2.0 위에 만들어진, 사용자 인증(Authentication) 을 위한 표준입니다. 로그인 과정을 통해 사용자가 누구인지 식별할 수 있는 정보(ID 토큰)를 제공합니다.

우리가 소셜 로그인을 구현할 때는 대략 이런 과정을 거칩니다.

  1. 사용자가 "구글로 로그인" 버튼 클릭
  2. 구글 로그인 페이지로 이동 후 사용자 인증
  3. 구글이 우리 서비스에게 "이 사용자 인증됐어"라는 정보(주로 ID 토큰)와 권한 증표(Access Token)를 전달
  4. 우리는 ID 토큰 안의 사용자 고유 식별자(sub 같은 값)와 이메일 등을 보고, 우리 서비스 DB에 해당 사용자의 계정이 있는지 확인합니다.
  5. 계정이 없으면 새로 만들어주고, 있으면 로그인 처리.

여기서 중요한 점은, 소셜 로그인을 써도 실제 사용자 계정 데이터는 우리 서비스 DB에 저장하고 관리한다는 것입니다. 구글이나 카카오는 인증 과정만 도와줄 뿐, 계정 자체를 대신 관리해주진 않습니다.


사용자가 소셜 연결을 끊었을 때 생기는 문제

자, 그럼 다시 처음의 질문으로 돌아가 봅시다. 사용자가 구글 계정 설정 페이지 같은 곳에서 우리 서비스와의 연결을 끊으면 어떻게 될까요?

  • 사용자는 더 이상 우리 서비스에 해당 소셜 계정으로 로그인할 수 없습니다. (Access Token, Refresh Token 등을 발급받지 못하게 되니까요.)
  • 하지만 우리 서비스 DB에는 여전히 그 사용자의 계정 정보(이름, 이메일, 활동 기록 등)가 남아 있습니다.
  • 로그인을 할 수 없으니, 사용자는 우리 서비스에 들어와서 직접 탈퇴 신청을 할 방법이 없습니다.

결국 사용자는 접근할 수 없는데 데이터는 남아있는, 소위 "유령 계정"이 생겨버리는 거죠. 이건 단순히 찝찝한 문제를 넘어, 개인정보보호법 같은 규제와도 관련될 수 있습니다. 사용자는 자신의 정보를 삭제할 권리가 있는데, 그럴 방법이 막혀버리는 셈이니까요.

왜 이런 일이 생길까요? 대부분의 소셜 로그인 제공자(구글, 카카오 등)는 사용자가 앱 연결을 해제했다는 사실을 우리 서비스에게 따로 알려주지 않습니다. (물론 일부는 관련 기능을 제공하기도 하지만, 표준은 아닙니다.) 서비스 입장에서는 사용자가 연결을 끊었는지 알기 어렵고, 따라서 자동으로 계정을 정리하기도 마땅치 않습니다.


그럼 어떻게 해결해야 할까?

결론부터 말하면, 로그인하지 않은 상태에서도 사용자가 자신의 계정을 삭제할 수 있는 방법을 서비스에서 직접 제공해야 합니다. 유령 계정을 방치하지 않고, 사용자의 정보 삭제 권리를 보장하기 위해서죠. 몇 가지 현실적인 방법을 생각해 볼 수 있습니다.

1. 이메일 인증으로 본인 확인 후 탈퇴시키기

가장 흔하고 합리적인 방법입니다. 사용자가 소셜 로그인은 못하지만, 가입 시 등록했던 이메일 주소는 알고 있을 가능성이 높으니까요.

  1. 로그인 페이지나 고객센터 등에 "로그인 없이 계정 삭제하기" 같은 메뉴를 만듭니다.
  2. 사용자가 이 메뉴를 통해 자신의 이메일 주소를 입력합니다.
  3. 서버에서는 해당 이메일로 가입된 계정이 있는지 확인합니다.
  4. 확인되면, 해당 이메일로 계정 삭제를 위한 일회성 인증 링크를 보냅니다.
  5. 사용자가 메일을 열어 링크를 클릭하면, 본인 확인이 되었다고 간주하고 계정 삭제 절차를 진행합니다. (바로 삭제하거나, 마지막 확인 페이지를 보여줄 수 있겠죠.)

여기서 핵심은 이메일 링크의 보안입니다. 아무나 탈퇴시키면 안 되니까요.

  • 링크에 포함될 토큰은 유효 시간을 짧게(예: 15분) 설정하고, 한 번 사용하면 만료되도록 구현해야 합니다.
  • JWT(JSON Web Token) 같은 기술을 활용하면 이런 토큰을 비교적 쉽게 만들 수 있습니다.
// 백엔드에서 JWT 토큰 생성하는 예시 (Node.js, jsonwebtoken 라이브러리 사용)
const jwt = require('jsonwebtoken')

// 사용자가 입력한 이메일로 DB에서 계정 정보 조회 후...
const userEmail = findUserByEmail(userInputEmail)

if (userEmail) {
  const payload = {
    email: userEmail,
    purpose: 'account_deletion', // 토큰의 용도를 명확히
  }
  const secretKey = process.env.JWT_SECRET // 비밀키는 안전하게 관리
  const options = {
    expiresIn: '15m', // 15분 유효기간
  }

  const deletionToken = jwt.sign(payload, secretKey, options)

  // 이 deletionToken을 포함한 링크를 이메일로 발송
  sendDeletionEmail(userEmail, deletionToken)
}

이 방법은 사용자가 직접 자신의 의사를 확인하고 진행할 수 있다는 장점이 있지만, 사용자가 가입 시 사용했던 이메일에 접근할 수 있어야 하고, 이메일 발송 시스템이 필요하다는 점은 고려해야 합니다.

2. 고객센터 문의로 처리하기

별도의 탈퇴 기능을 만들기 부담스럽다면, 고객센터를 통해 수동으로 처리하는 방법도 있습니다.

  • 사용자가 고객센터(이메일, 문의 게시판 등)로 탈퇴를 요청합니다.
  • 운영자는 요청 내용을 바탕으로 가입 정보(이메일 등)를 확인하고, 간단한 본인 확인 절차(예: 가입 시기, 마지막 활동 등 질문)를 거친 후 계정을 삭제해줍니다.

개발 공수는 적게 들지만, 사용자 입장에선 좀 번거롭고 시간이 걸릴 수 있습니다. 그리고 운영 인력이 계속 투입되어야 한다는 점, 수동 처리 과정에서 실수가 생길 수 있다는 점도 감안해야 합니다.

3. 오랫동안 안 쓰는 계정 주기적으로 정리하기 (보조 수단)

위 방법들을 보완하는 차원에서, 아주 오랫동안 접속 기록이 없는 비활성 계정을 주기적으로 정리하는 정책을 도입할 수도 있습니다.

예를 들어, "마지막 로그인이 1년 이상 지났고, 소셜 로그인만 사용하는 계정"을 대상으로, 삭제 전에 미리 안내 메일을 보내고 일정 기간 후 정리하는 방식입니다.

하지만 이 방법은 몇 가지 주의가 필요합니다.

  • 사용자가 오랜만에 다시 쓰려고 할 때 계정이 없어져 당황할 수 있습니다. (충분한 사전 안내 필수)
  • '마지막 로그인' 시점만으로는 사용자가 정말 앱 연결을 끊었는지 정확히 알기 어렵습니다.

따라서 이건 근본적인 해결책이라기보다는, 유령 계정이 너무 많이 쌓이는 것을 방지하는 보조적인 수단으로 생각하는 것이 좋습니다.


마무리하며: 실무에서 고려할 점들

소셜 로그인은 분명 편리한 기능이지만, 개발자 입장에서는 사용자가 소셜 계정 제공자 쪽에서 연결을 끊는 경우까지 고려해서 서비스 흐름을 설계해야 합니다. 가장 중요한 것은 사용자가 어떤 상황에서도 자신의 계정 정보를 스스로 통제(삭제 포함)할 수 있는 경로를 열어두는 것입니다. 위에서 살펴본 이메일 인증 기반의 탈퇴 기능이 좋은 예시가 될 수 있겠죠.

이 문제를 단순히 기술적인 부분으로만 볼 것이 아니라, 사용자 경험과 개인정보 보호라는 더 넓은 관점에서 접근하는 것이 중요합니다. 서비스를 만들 때 다음 사항들을 함께 고민해보면 좋습니다.

  • 개인정보 처리 방침: 소셜 연결이 끊어진 계정의 데이터를 언제까지 보관하고 어떻게 처리할지 명확히 정하고 사용자에게 고지해야 합니다.
  • 사용자 안내: 회원가입 과정이나 도움말 등에 소셜 연결 해제 시 계정 삭제 방법에 대해 안내해주는 것이 좋습니다.
  • 다른 로그인 수단 제공: 가능하다면 소셜 로그인 외에 이메일/비밀번호 같은 기본적인 로그인 방식을 함께 제공하는 것도 사용자가 계정에 접근할 수 있는 또 다른 경로를 열어주는 방법이 될 수 있습니다.

결국 사용자가 우리 서비스를 믿고 사용할 수 있도록, 이런 예외적인 상황까지 세심하게 고려하는 것이 좋은 서비스를 만드는 길이라고 생각합니다.