nodemailer 라이브러리 인증코드 불일치 오류 발생
문제
- router.post스코프 안에 변수를 넣지 않아서 6자리 인증코드를 생성하는 변수가 authMail로 post요청을 보낼때마다 인증코드가 생성되는것이 아닌 서버가 켜질때마다 생성되어서 다른 메일로 요청을 보내도 똑같은 인증코드가 메일로 발송됨
let authNum = Math.random().toString().substr(2, 6);
생각한 해결 방법
- 이메일 인증코드를 생성하는 변수 authnum을 router.post(authMail) 스코프 안으로 가져와 인증번호발송 요청을 할때마다 새로운 인증코드를 생성하도록 수정
- 생성된 인증코드와 입력받은 email값을 redis에 만료시간을 3분으로 설정하여 저장
- db에 저장된 email : authcode의 value값을 입력받은 email의 값으로 찾아 생성된 인증코드와 입력받은 인증코드가 같은지 비교하고 같다면 회원가입 진행
문제해결
root경로에 util폴더 생성후 index.js파일 생성
const redis = require('redis');
// Redis 연결
const redisClient = redis.createClient({
url: `redis://${process.env.REDIS_USERNAME}:${process.env.REDIS_PASSWORD}@${process.env.REDIS_HOST}:${process.env.REDIS_PORT}/0`,
// legacyMode 옵션은 Redis v2 호환성 모드를 사용합니다.
// 따라서, Redis v4 사용시에는 필요 없습니다.
//legacyMode: true,
});
// Redis 연결 이벤트 핸들러 등록
redisClient.on('connect', () => {
console.info('Redis connected!');
});
// Redis 오류 이벤트 핸들러 등록
redisClient.on('error', (err) => {
console.error('Redis Client Error', err);
});
// Redis 연결
redisClient.connect();
// 다른 모듈에서 RedisClient를 사용할 수 있도록 export
module.exports = redisClient;
users.js에 Redis연결 모듈 불러오기
const redisClient = require('../utils/index.js')
Redis에 data 저장
- 입력받은 email로 인증번호 요청시 인증번호를 생성하고 인증번호 발송
만료시간 설정
- 입력받은 { email : authNum } 객체를 Redis에 저장 SETEX 메서도르 데이터의 만료시간을 3분으로 설정
const redisSetResult = await redisClient.SETEX(email, 180, authNum)
데이터 확인
- 저장된 데이터 확인
입력된 메일로 메일발송
전송받은 데이터 입력
- singup 라우터에서 입력받은 이메일에 해당하는 인증번호를 Redis에서 찾아서 rediSetResult 변수에 할당
const redisSetResult = await redisClient.get(email)
새롭게 알게된 부분
- 자주쓰게 되는 모듈은 utils라는 폴더를 root 경로에 생성하여 따로 모듈을 관리해주면 좋다
- 프론트엔드에서 axios로 api요청할 경우 요청옵션에 withCredental: true 라는 옵션을 주었을때 서버에서는 cors의 origin설정을 '*' 이아닌 특정한 url주소로 설정해 주어야 오류가 발생하지 않는다.
- 서버에서 cors설정을 할때 특정경로를 설정하고 마지막에 포트번호 뒤에는 아무런 설정을 하지 않아야 함
예시
app.use(cors({
origin: "http://localhost:3000", // 접근 권한을 부여하는 도메인 서버에러 http://44.201.251.58:3000
credentials: true, // 응답 헤더에 Access-Control-Allow-Credentials 추가
optionsSuccessStatus: 200, // 응답 상태 200으로 설정
}));
Redis Insight 설정하기
Redis Insight 페이지 접속후 Redis Insight 다운받기
https://redis.com/redis-enterprise/redis-insight/
RedisInsight | The Best Redis GUI
RedisInsight provides an intuitive and efficient graphical interface for Redis, allowing you to interact with your databases and manage your data.
redis.com
DB추가
- [ADD REDIS DATABASE] 클릭
DB 정보 입력
- redis cloud에서 발급받은 HOST, PORT ,USERNAME, PASSWORD 를 Redis Insight에 입력
DB 생성완료