개발일지

개발일지 49일차

index.ys 2023. 5. 10. 18:39

nodemailer 라이브러리 인증코드 불일치 오류 발생

문제

- router.post스코프 안에 변수를 넣지 않아서 6자리 인증코드를 생성하는 변수가 authMail로 post요청을 보낼때마다 인증코드가 생성되는것이 아닌 서버가 켜질때마다 생성되어서 다른 메일로 요청을 보내도 똑같은 인증코드가 메일로 발송됨

let authNum = Math.random().toString().substr(2, 6);

생각한 해결 방법

  • 이메일 인증코드를 생성하는 변수 authnumrouter.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 생성완료