서버/Express

ExpressJS nodemailer 비밀번호 초기화

realtrynna 2022. 6. 21. 01:28

ExpressJS nodemailer 비밀번호 초기화

사용자 비밀번호 초기화는 요즘 웹 서비스에 없어서는 안 될 기능 중 하나다. 예전에는 휴대폰 인증 방식을 사용했지만 요즘은 비밀번호 초기화 링크를 사용자가 입력 한 메일로 보내주는 방식을 사용한다. 노드로 수천 또는 수만 건을 동시에 처리하는 메일 서버를 만드는 건 단순 요청과 응답을 처리하는 작업이랑 차원이 다르다. 다행히도 사용자에게 메일을 쉽게 보낼 수 있도록 도와주는 nodemailer 라이브러리가 존재한다. 실제 대부분의 웹 서비스들이 자사 메일 서버를 직접 구축해 사용하기보다 AWS 등 제3자 라이브러리를 이용한다.

 

 

Use

- npm i nodemailer

- nodemailer 임포트 후 발신(서버) 설정과 수신(클라이언트)에 대한 설정을 해준다.

- 메일 발신은 재사용 할 가능성이 있으므로 utils 폴더에 따로 분리했다.

- 노드 메일러에 대한 자세한 설명과 설정에 대한 옵션들은 공식 문서를 참고하자.

 

app.js > utils > nodemailer.js

 

프로세스

비밀번호 분실 시 사용자는 자신이 가입 한 이메일을 서버로 보낸다. 서버는 사용자가 보낸 이메일이 가입되어 있는 회원인지 확인 후 토큰 발급 후 사용자 테이블에 임시 저장하여 생성된 토큰 값을 사용자 메일로 발신한다. 여기서 토큰은 노드 내장 모듈인 crypto를 사용한다. 사용자는 수신된 이메일을 클릭하면 비밀번호 초기화 페이지로 이동하는데 이동된 주소(req.params)에 토큰 값이 포함돼있으므로 토큰 확인 후 요청 초기화 비밀번호 업데이트와 최초 데이터베이스 저장 한 토큰을 null로 넣어준다. 여기서 주의할 점은 MySQL은 undefined 자료형을 지원하지 않는 사실을 알아두자. 추가로 토큰 유효기간은 개인의 프로젝트 성향에 따라 적절한 시간으로 지정하면 된다.

 

 

사용자가 이메일 입력 후 reset 함수가 실행된다. 보내온 메일을 유저 테이블에서 찾고 있다면 토큰 발급과 메일을 발신한다. 메일 발신 함수는 사용자 메일과 토큰 값 그리고 응답 3개의 매개변수를 받는다.

 

 

서버가 발신 한 메일을 사용자가 클릭하면 비밀번호 초기화 페이지를 랜더 해주는데 랜더와 동시에 최초 데이터베이스에 저장한 토큰 값을 토대로 그 유저의 id를 같이 넘겨준다. 유저 id가 있어야 비밀번호 초기화 유저가 누군지 식별할 수 있다.

 

 

사용자 보내준 id 값을 토대로 사용자를 찾고 해당 사용자의 비밀번호를 업데이트하고 토큰과 토큰의 만료 기간의 값을 null로 만들어준다. 간단한 기능이지만 지금 코드로 실행해 보니 유저에게 이메일을 보내는 응답 속도가 3초 정도 걸린다. 매우 느린 거 같다. 비동기 방식의 이해가 완벽하지 않아 그런 거 같은데 일단 기능은 작동하니 추후 리팩토링을 통해 고민해 봐야겠다.

 

'서버 > Express' 카테고리의 다른 글

ExpressJS Jest ES6 import export  (0) 2022.08.10
ExpressJS express-validator 유효성 검사  (0) 2022.06.23
ExpressJS moment  (0) 2022.06.20
ExpressJS CSRF  (0) 2022.06.19
ExpressJS Sequelize transaction  (0) 2022.06.17