[Nest.js] social login
소셜 로그인
회사에서 소셜 로그인을 적용한 것에 대해서 쓰려고 한다. 우선 사람들이 가장 많이 사용하고 있는 카카오 소셜 로그인을 진행 하기로 했다. 내가 정리한 우리 DB의 user 테이블에 저장하는 데이터와 카카오에서 받을 수 있는 데이터를 비교한 것을 바탕으로 DB에 저장을 하기로 했다.
일단 비즈앱 및 비즈니스 채널를 설정해 두어서 초기 세팅을 할 것들은 없었다.
하지만 여러 사이트의 소셜 로그인이 어떻게 동작을 하는지 살펴 봤을 때, 논의 해야 할 것들이 있었다.
기존의 유저가 소셜 로그인을 할 때, 새로운 유저로 판단 해야 하는가?
어떤 서비스는 기존의 유저가 소셜 로그인으로 로그인 할 때, 회원 가입을 하라는 서비스가 있는 반면, 또 다른 서비스는 기존의 유저로 판별해 로그인이 되어지는 서비스도 있었다.
우선 user table에서 phone, 가입 경로를 나타내는 providerType, status를 같이 unique로 걸어놨었다. 그래서 이 3개가 동시에 겹치지 않는 한 유저가 생성 되도 상관은 없을 것이다.
처음 소셜 로그인을 기획 했을 때, 이러한 문제에 대해서는 깊게 논의하진 않았어서 프론트엔드 개발자 분과 이야기를 했었다.
새로운 유저로 회원가입을 시켰을 때 문제점
우선, 기존의 홈페이지에서 회원가입한 유저가 소셜 로그인을 했을 때 다시 회원 가입 한 상황을 살펴보자.
만약 이 유저가 online으로 회원가입을 했었고, 이 후 카카오 로그인을 통해 유저가 생겼다고 가정하자. 전자를 ‘o’로 후자를 ‘k’로 부르겠다.
‘o’ 유저로 로그인을 하여 다른 유저의 물건을 사기로 하여, 채팅을 시작했다. 채팅을 하다가 보니, 카카오 로그인이 생겼다는 것을 알고, 카카오 로그인을 해봤다. 그래서 다시 ‘k’ 유저로 로그인이 되어진다면, 이 유저는 다시 채팅방에 들어갔었을 때 혼동이 있을 수 도 있다. 왜냐하면 ‘k’ 유저는 채팅을 한 기록이 없기 때문에 이전 ‘o’로 채팅한 내역이 사라진 것이다. 당연히 이 유저는 내가 카카오 로그인을 했는데, 당연히 내 계정인데 있어야 하는거 아니야? 라고 생각할 수 있다.
우리 서비스 특성상 물건을 주문을 하면 바로 배송이 되는 것이 아닌, 채팅을 통해서 거래가 이루어지기 때문에 이 부분이 가장 큰 문제가 될 수 있겠다 라는 생각이 들었다.
이 문제를 프론트 엔드 분과 같이 이야기를 하고, 다행히 그럴 수도 있겠다 라는 판단을 해서 통합이 될 수 있도록 하기로 결정을 했다.
소셜 로그인 api
우선 프론트 단에서 카카오 로그인 모듈을 열고 받는 인가 코드를 서버 단으로 보내주게 된다. 그러면 나는 이 인가 코드를 가지고, 카카오 로그인 api에 필요한 access token과 refresh token을 갖는다.
그럼 나는 access token을 가지고 유저의 정보를 받는 api로 axios 요청을 보낸다. 여기서 유저의 핸드폰 번호의 정보를 받는다.
이 핸드폰 번호를 가지고 user table에 이 핸드폰 번호로 가입한 유저가 있는지 판별한다. 만약 없다면 아래의 response를 보내준다.
response = { isUser: false, kakao_access_token };
만약 유저라면, 기존의 유저에 kakaoRefreshToken을 저장 시켜 주게 된다.
회원 가입을 해야 하는 경우
response로 보내준 access token을 바탕으로 다시 카카오 정보를 받는 api에 요청을 한다.
provider type에 kakao로 저장을 해주고, 카카오 유저의 pk값과 refresh token을 저장을 시켜주게 된다.
유저의 닉네임은 긍정적인 형용사 + 가구 이름의 조합으로 랜덤으로 조합이 되게끔 했다.
느낀점
내가 기획한 것이고 하지만 너무나 많은 점이 부실했었던 것 같다. 또한 기획을 했었을 때와 적용을 했을 때와의 텀이 너무나 길어서 까먹은 부분들도 있었다.
하지만 구현을 하면서 내가 미쳐 생각하지 못한 부분들도 많이 발견 할 수 있었고, 프론트엔드 개발자 분과 같이 상의를 하면서 완벽하진 않지만 최소한 우리가 생각했었을 때의 사용자의 불편함 혹은 어떤 것이 서비스가 나아질 까 라는 것들을 의논하면서 정말 재미있었다.
댓글남기기