Mbtigram / 08 /

Delete the person, keep the row

탈퇴해도 행은 남김

회원 탈퇴를 DELETE 한 줄로 만들면 남은 사람들의 화면이 깨짐. 개인정보만 지우고 기록은 남기는 방법, 7일 재가입 제한, 그리고 정지 중에는 탈퇴할 길이 없던 구멍.

DELETE로는 안 됨

탈퇴는 사용자 표에서 그 사람의 행을 지우면 끝날 것 같음. 하지만 그 사람이 쓴 글, 단 댓글, 다른 사람과 나눈 대화가 전부 사용자 번호로 그 행을 가리킴. 행이 사라지면 글 목록, 댓글, 대화방 곳곳에서 없는 사람을 찾다가 화면이 깨짐.

그 대화는 떠난 사람만의 것도 아님. 남은 사람에게는 자기가 나눈 대화의 절반임.

개인정보만 지우고 행은 남김

그래서 탈퇴할 때 행은 지우지 않고, 이메일과 휴대폰 번호 같은 개인정보만 지운 뒤 상태를 "탈퇴"로 바꿈. 화면에는 그 자리에 "탈퇴한 사용자"가 보임.

남기는 것왜
글 · 댓글 · 대화남은 사람의 맥락. 이름은 "탈퇴한 사용자"로 바뀜
코인 · 결제 기록전자상거래법상 5년 보관
신고 기록같은 문제가 다시 생겼을 때의 근거

재가입은 7일 뒤부터

탈퇴하고 바로 다시 가입할 수 있으면 탈퇴가 기록 지우기 버튼처럼 쓰임. 신고가 쌓이면 탈퇴하고 새로 시작하면 되니까. 그래서 7일 동안은 같은 사람이 다시 가입하지 못하게 했음.

그러려면 탈퇴한 사람을 알아봐야 하는데, 그걸 위해 휴대폰 번호를 남겨 두면 탈퇴한 사람의 개인정보를 계속 들고 있는 셈이 됨. 그래서 번호와 이메일을 비밀 키로 섞은 지문(HMAC)만 남김. 지문으로는 원래 번호를 알 수 없지만, 같은 번호가 다시 오면 같은 지문이 나와서 알아볼 수 있음.

휴대폰과 이메일 중 하나만 맞아도 같은 사람으로 봄. 다만 이메일은 a+1@gmail.com 같은 별칭으로 얼마든지 바꿀 수 있어서 실제 문턱은 휴대폰 인증임.

제재 상태 승계

신고가 쌓여 정지된 사람이 탈퇴하고 7일 뒤 다시 가입하면 새 계정은 깨끗한 상태임. 그래서 탈퇴할 때의 제재 상태를 지문 옆에 같이 적어 두고, 다시 가입하면 그 상태를 그대로 물려받게 했음.

이때 계정 자체는 만들어 주고, 만든 다음 "이용이 제한된 계정"으로 돌려보냄. 계정을 안 만들면 그 번호가 다시 비어 보여서 다음 날 또 시도할 수 있기 때문임.

정지된 계정의 탈퇴 경로

만들고 나서 보니 구멍이 있었음. 탈퇴 버튼은 로그인한 사람만 누를 수 있었는데, 정지된 계정은 로그인 자체가 막혀 있음. 정지 중에 탈퇴하는 경로가 아예 없었던 거라, 위의 제재 승계는 한 번도 동작할 수 없는 코드였음.

그래서 탈퇴는 로그인 세션 없이 이메일과 비밀번호만으로도 받게 바꿨음. 로그인 화면에서 제재 안내가 뜨면 탈퇴 버튼이 같이 나옴. 정지된 사람도 자기 개인정보를 지울 권리는 있음.

같은 이유로 앱 밖에서 계정을 지우는 페이지도 따로 뒀음. 구글 플레이는 앱을 이미 지운 사람도 계정을 지울 수 있는 길을 요구함. 그 페이지에는 무엇이 지워지고 무엇이 얼마나 남는지를 위의 표 그대로 적었음.