문제 발단
서비스에서 구글 로그인을 지원하고 있는데 이미 구글 계정을 사용하여 자체 회원가입을 진행한 상황.
마이페이지에서 회원정보 변경시 회원 인증을 이메일로만 인증하고 있었고, 구글 로그인 한 후 회원정보를 변경해보니 오류가 발생하였다
이 상황에서 어떻게 해결해야하면 좋을까?
해결 방법
방법1.
회원가입시 provider라는 속성을 함께 저장하는데, 자체 회원가입은 `NATIVE`로, 구글 회원가입은 `google` 로 저장되도록 설계되어 있다.
회원 인증을 이메일로만 인증하지 말고 이메일 + provider로 인증하는 것이다.
1. 자체 회원가입에 구글계정으로 회원가입 후, 구글 회원가입을 진행할 경우
문제 상황과 같이 구글 계정으로 자체 회원가입을 진행한 상황인데, 구글로 OAuth를 시도하게 되면 OAuth로 진행한 회원가입이 더 정확하므로 회원가입을 진행시켜 준다.
결과적으로 같은 이메일이 DB에 저장되게 된다.
그러면 인증을 어떻게 진행하면 될까?
-> 이메일 + provider 를 PK로 사용하면된다.
예를 들어서
구글로 로그인을 시도한다 -> 이메일 + google이 DB에 존재하는가?
자체 로그인으로 시도한다 -> 이메일 + NATIVE이 DB에 존재하는가?
2. 구글 회원가입을 진행한 후, 자체 회원가입을 진행한 경우
이번엔 위와 반대인 상황이다. 이 경우 OAuth로 이미 회원가입을 진행한 상황이므로 동일한 구글 이메일로 회원가입을 시도하는 경우 회원가입 진행하는 로직에 해당 구글 메일로 본인 확인을 진행한다.
왜 여기서는 본인 확인을 진행할까? 당연히 OAuth로 가입한 유저가 구글 계정 소유자라는게 정확하기 때문에...
본인확인에서 본인이 시도한 회원가입이 아니라는 답변을 받게 되면 회원가입을 취소시키면 된다
방법2.
DB에 해당 이메일이 있으면 회원가입 자체를 못하게 막는다.
여기까지 개인적인 의견이고 chap gpt에게 물어보니 아래와 같은 답변이 돌아왔다.
자체 회원가입(email/password 기반)과 OAuth(구글, 페이스북 등)을 통해 회원가입을 받는 서비스에서 이메일 주소가 중복되는 경우, 두 가지 시나리오를 고려해야 합니다:
1. 동일한 이메일로 두 가지 방식으로 가입을 시도하는 경우
시나리오: 사용자가 먼저 자체 회원가입을 통해 이메일을 등록한 후, 동일한 이메일로 OAuth를 통해 다시 로그인 또는 회원가입을 시도할 때.해결 방법:
자동 연결: OAuth 로그인 시 해당 이메일이 이미 자체 회원가입으로 등록되어 있다면, 두 계정을 자동으로 연결하고 OAuth 로그인으로 바로 접근할 수 있게 합니다.
수동 연결: 사용자가 OAuth 로그인 후, "이미 동일한 이메일로 계정이 존재합니다. 계정을 연결하시겠습니까?"와 같은 메시지를 띄우고, 사용자가 선택할 수 있도록 합니다.
로그인 전환: OAuth 로그인 시도 시, 이미 동일한 이메일로 자체 회원가입 계정이 존재하면 로그인 화면으로 리다이렉트하여 기존 계정으로 로그인하도록 유도합니다.
2. 동일한 이메일을 사용하는 두 개의 계정이 존재하는 경우
시나리오: 시스템에서 이미 동일한 이메일을 사용한 자체 회원가입 계정과 OAuth 계정이 각각 존재하는 경우.해결 방법:계정 통합: 사용자가 원하는 경우, 두 계정을 통합할 수 있는 옵션을 제공합니다. 계정 통합 시에는 해당 이메일로 OAuth 로그인 시 자체 회원가입 계정으로 자동 로그인되도록 설정합니다.별도 유지: 두 계정을 별도로 유지하되, 사용자가 선택할 수 있는 옵션을 제공하거나, 특정 상황에서만 사용자가 계정을 전환할 수 있도록 합니다.
이러한 시나리오에 대해 명확한 정책을 수립하고 사용자에게 적절한 메시지와 선택지를 제공하는 것이 중요합니다. 또한, 보안과 사용자 경험을 최우선으로 고려하여 처리하는 것이 좋습니다.
해결 방법은 다양하나 어떤 방법이 더 나은지는 모르겠다...
그래서 어떤 방법으로 해결했는데?
일단 NATIVE와 google로 구분해서 저장한 다음에 마이페이지에서 구글 연동을 할 수 있도록 했다.
구글 연동이라 함은 구글 로그인으로 저장된 회원정보로 통합한다는 얘기이다. (연동이 이렇게 진행되는지는 모르겠지만...)