프로젝트 이메일 인증 기능 회고 - 기본 아이디어(#1)

Recfli·2025년 3월 22일
0

이메일 인증 기능?

생각보다 프로젝트를 하다보면 이메일 인증 기능을 넣자는 이야기를 많이 하게 된다. 이메일 인증 기능을 사용하게 되면 기본적으로 JavaMailSender를 사용해서 구현하게 될 것이다.

그러면, 어떻게 구현을 해야 할까? 프로젝트를 구상하기 전 2가지 안을 생각해볼 수 있다.

  1. 회원 가입이 완료되기 전, 모든 인증 절차를 마치고 프론트 엔드에서 들고 있는 모든 데이터를 든 채로 회원가입을 하는 방법이 있다.
  2. 기본적인 회원의 닉네임, 이메일, 패스워드 정보만 받고 인증이 끝날 때까지 비활성화 상태로 둔 뒤 나중에 이메일 창에서 유효 시간이 만료되기 전 회원인증을 하는 방법이 있다.

그럼, 각각의 장단점은 무엇일까?

1안의 장점

  • 회원 인증 과정에 대해 추가적인 작업을 해주지 않아도 된다.(추후 이메일 재전송을 위한 리소스를 낭비하지 않아도 된다.)
  • 이메일에 관한 유효성 검사를 하지 않아도 된다.(사용하고 있는 이메일이라는 게 확실하므로)

1안의 단점

  • 이메일 인증 번호가 늦게 온다면 사용자가 불편해 할 것이다. 회원가입을 안하면 사용자가 손해인 서비스라면 상관없을 것이다. 예를 들면, 채용 사이트 같이 사용자가 반드시 가입하지 않으면 손해를 보는 경우가 있을 것이다. 이런 경우가 아니라면 사용자는 가입 과정에서 불편함을 느끼거나 회원가입을 안해버릴 것이다.

2안의 장점

  • 사용자가 편하다. 즉시 가입이 되므로 서비스 가입한 뒤 비활성화 서비스를 사용하거나 하게 하고, 특정 인증 기능에 대해서 인증 이메일을 확인해야 사용할 수 있게 하면 된다.

2안의 단점

  • 이메일 재전송을 위한 리소스를 써야 한다. 특히나, 메일을 보내는 게 서버에서는 부담이 있다. 그리고 이게 몇 번 일지 알 수없다.
  • 실제 비인증된 사용자가 다른 회원의 이메일을 임의로 점유해버릴 수 있다. 이건 의도된 어뷰징인데, 이메일이 문제가 아니라 해당 이메일로 가입된 닉네임 또한 사용이 불가능하다.

이런 부분을 생각했을 때, 구현만 한다면 편한 건 1번이지만 개인적으로는 2번이 생각해볼 거리도 많고 사용자를 위한 것이기도 한 방법이라 생각해서 선택했다.


구현 과정에서의 생각할 거리

이메일 인증 기능에서의 구현을 하면서 생각해볼만한 내용을 살펴보기 전에 구현에서의 정의와 예상 로직에 대해서 정리를 해보고자 한다.

구현 요구사항
1. 회원은 계정을 사용하기 위해선 도착한 이메일의 링크로 이동해 인증을 완료해야 서비스를 이용할 수 있다.
2. 별도의 메일 서버 없이 단일 서버 내에서 해당 요청을 처리해야 한다.

1번은 로직상인 이유이지만, 2번은 IMAP 프로토콜을 사용해서 메일을 읽어 처리하는 방법도 있겟지만 직접 구현하기보단 사서 쓰는 게 편하다고 한다. 그렇기에 안 쓰려고 한다. 그리고 별도로 분리해서 처리하는 게 메일 전송용 서버 리소스만 따로 예측해서 처리하기에 좋겠지만, 구현의 간편함을 위해 별도로 분리하지 않겠다.

서비스 로직

  1. 회원이 회원 가입 요청을 보낸다.
    1-1. 서버는 회원 정보를 비활성화 상태로 저장한다.
    1-2. 회원 인증을 위한 토큰을 생성하고 회원의 이메일 정보로 인증 토큰이 담긴 URL을 전송한다.
    1-3. 회원의 인증 정보가 서버 내에 저장된다.
  2. 회원이 도착한 메일에 적힌 URL로 접속 시 인증이 완료되며 계정이 활성화된다.

위는 사실 단순 구현만 한다면 굉장히 쉽게 할 수 있다. 회원 가입 정보에 존재하는 JavaMailSender를 가지고서 회원 가입이 되는 순간에 메일을 보내주면 된다.

그러면 회원 가입 API와 get 요청으로 토큰을 받아 처리하는 API 두 가지만 있어도 회원가입 인증을 할 수 있고, 실제로 작동이 된다.

이 방법은 간단하지만 문제점이 많다.

  1. JavaMailSender로 이메일을 보내는 시간
  • 가장 처음 문제를 겪었던 건 이메일을 보내는 시간이었다. JavaMailSender를 동기처리 해버리면 응답 시간이 굉장히 늦는 문제가 발생할 수 있다.(평균 4초 정도가 걸렸다.)
  1. 만약에 메일이 가지 않는다면?
  • 메일이 가지 않았을 때, 사용자가 인증을 받지 않았을 때 추가적인 처리를 해주지 않는다면 사용자에게 편리함을 주려고 선택한 방법이 가입을 막는 장벽이 될 수 있다.
  1. 메일 및 닉네임 점유 문제
  • 그럴싸한 메일을 가지고 인증을 안해버리면 생기는 문제점은 다른 사람이 필요한 닉네임을 점유할 수 있고, 본인의 이메일이 아닌 걸로 가입을 해놓는 유저에 대한 처리를 할 수가 없다.

위의 고민을 해결하기 위해서는 쓰레드에 관한 이해와 트랜잭션에 대한 이해, 재시도할 방법과 스케쥴러 등에 관한 이해가 필요하다.

두 편 정도에서는 책을 읽으며 배운 기본적인 개념에 관해서 정리를 해보고자 한다.

profile
성장하고 싶은 신입 BE개발자

0개의 댓글