안녕하세요, 이번 기술 발표에서는 회원가입에서의 이메일 인증기능 구현에 대해 발표하겠습니다.

발표 순서는 이메일 인증기능을 도입한 이유, 인증 로직, 적용 과정에서 어려웠던 점, 해결 과정, 개선 방안 순서로 진행하겠습니다

저희 프로젝트의 기존 회원가입은 이메일 양식을 맞추고 중복검사를 통과하면 가입이 이루어지도록 구현되어 있었습니다. 이 경우, 다른 사람이 나의 이메일 계정을 도용하여 회원가입을 할 수도 있다는 문제점이 존재했습니다. 이메일 인증 기능을 도입하게 되면, 사용자는 실제 자신이 사용중인 이메일 계정만을 이용해 가입이 이루어지게 되므로, 이와 같은 문제점을 예방할 수 있게 됩니다.

프로젝트에서는 다음과 같은 방식으로 이메일 인증을 구현하였습니다. 사용자가 회원가입 창에 이메일 주소를 입력 후 서버에게 인증코드를 요청하게 되면, 서버는 인증코드를 발급 후, 이를 사용자 이메일 주소, 인증 여부와 함께 DB에 저장하고, 사용자의 이메일 주소로 인증 코드를 전송합니다. 이때 인증코드 전송을 위해 노드메일러와 ejs 모듈을 사용하였습니다. 노드메일러는 SMTP 프로토콜을 사용해 서로 다른 이메일 호스트간의 이메일 전송을 도우며, ejs 모듈은 HTML 로 이루어진 이메일 전송 폼에서 인증코드를 변수로 사용하도록 도와줍니다. 위 두 모듈에 의해 이메일 전송이 완료되면 사용자는 자신의 이메일 함에서 해당 인증 코드를 확인하고 서버에게 인증 요청을 보냅니다. 서버는 발급해 준 인증코드와 사용자가 보내온 인증코드가 같다면, 해당 이메일은 사용자가 실제로 사용중인 이메일임을 판단하게 됩니다.

구현 과정 중에는 다음의 예외 처리에서 어려움이 있었습니다. 첫번째, 비회원이 인증 코드를 여러 번 발급받는 경우 어떤 인증 코드로 인증을 하여야 할지, 두번째, 인증 코드를 메일로 받기만 하고 아무것도 하지 않는 경우 어떻게 처리를 해야 할지, 세번째, 인증에 사용했던 코드로 다시 인증 요청을 할 경우 어떻게 처리해야 할지 마지막으로 인증까지 완료했지만 남아있는 회원가입 절차를 마무리하지 않은 경우 어떤 처리가 필요한지에 대한 고민이 있었습니다. 위 각각의 경우에 대한 해결 과정을 말씀드리겠습니다.

문제를 조금 더 쉽게 해결하고자 사용자의 상태를 세가지로 나눠 표로 정리해 보았고, 각 회원 간 상태의 차이점을 파악했습니다. 이메일 미인증 사용자와 인증 사용자는 이메일 인증 여부로 구분을 할 수 있었고, 회원의 경우 나머지 두 유형의 사용자와 달리 회원 유형이 다르다는 점을 확인하였습니다.

먼저, 사용자가 인증코드를 받은 이후에도 다시 발급받는 경우입니다. 사용자 테이블의 이메일 컬럼은 unique key로 설정하였기 때문에, 하나의 이메일 주소 당 하나의 인증코드만 등록할 수 있었습니다. 이에 재발급 시에는 가장 최근에 받은 인증코드만으로 인증되도록 하였습니다. 인증코드를 여러 개 등록하는 것을 허용한다 해도 사용자 혼선이 생길 수 있을 것이라 판단했습니다.

두번째, 인증 코드만 받고, 아무것도 하지 않는 경우입니다. 해당 상황에서 서버 측에서 아무런 조치도 취하지 않을 경우 DB 테이블에 가입되지 않은 사용자들의 데이터가 불필요하게 쌓이게 된다는 문제점이 있었습니다. 사용자가 인증 코드로 인증을 받을 시, 인증 여부가 바뀐다는 점을 이용하였습니다. 유효시간 5분이 지난 후에도 인증되지 않은 계정은 setTimeOut을 이용하여 삭제되도록 구현하였습니다.

다음으로, 사용자가 인증 절차까지 완료했지만, 같은 인증번호로 재인증하는 경우입니다. 해당 상황에서는 같은 인증번호로 재인증을 허용하는 것으로 처리를 해 주었습니다. 같은번호로 재인증을 허용시 다른 사용자가 이메일과 인증코드를 가져가서 인증해 버릴 수 있다고 생각했는데, 20분 안으로 회원가입을 하지 않으면, 등록된 사용자와 인증번호를 삭제하고, 회원가입을 할 경우에는 등록된 인증코드를 삭제하기 때문에 이 부분으로 보완이 될 것이라고 생각했습니다. 또한 인증 즉시 인증코드를 삭제해버리면, 사용자가 실수로 인증 버튼을 2번 눌렀을 때 의도하지 않게 인증코드를 재발급 받아야 하는 상황이 생길 수 있어, 불편함을 느낄 수도 있다고 생각했습니다. 만약 결제와 같이 보안이 중요한 서비스를 추가로 구현한다면 인증코드 즉시 삭제도 고려해 보아야 한다고 생각합니다.

인증 이후 회원가입을 진행하지 않는 경우에는 다음과 같이 해결하였습니다. 이 경우도 가입절차를 완료하지 않은 사용자들의 데이터가 불필요하게 쌓이게 되므로, 인증 후 20분 경과했을 때, 이에 해당하는 유저 정보를 setTimeOut을 이용해 삭제해 주었습니다.

마지막으로 추후 개선점에 대해 말씀드리겠습니다. 현재 프로젝트에 적용한 인증방법은 인증코드를 직접 복사해서 붙여넣어야 한다는 점에서 다소 번거로운 면이 있는데, 추후에는 사용성을 고려해 이메일로 링크를 전송하여 그 링크를 통한 이메일 인증이 가능하도록 개선해 나가겠습니다. 이상으로 기술발표를 마치도록 하겠습니다, 감사합니다.