오늘 뭐했냐/함께했던 작업들

23.08.22 레디스 클라우드(Redis Cloud)

스스로에게 2023. 8. 31. 21:58

진행 중인 프로젝트가 회원가입을 하고 로그인을 해야 서비스를 이용할 수 있었다. 그래서 사용자 인증을 무엇으로 하냐 고민을 했을 때 토큰이 더 적합해 보였다. 

  • 서버의 성능이 좋지 않다. 그런데 세션을 사용할 경우 서버에 성능이 더 저하될 가능성이 있다.
  • 모바일 환경을 타겟으로 하는데 모바일에선 백그라운드에서 연결이 종료 되는 경우가 많다. 

그래서 토큰을 이용하는데 이 때 토큰의 가장 큰 단점인 탈취 문제가 생긴다. 이를 해결하기 위해서 리프레시 토큰 로테이션 전략을 사용하려는데 리프레시 토큰을 서버에서 가지고 있을 수 있는 공간이 필요했다. 그래서 처음에는 사용자 정보가 있는 테이블에 같이 저장하려 했으나 로테이션 전략으로 인해서 사용한 리프레시 토큰을 바꿔줘야 하고 리프레시 토큰의 유효 기간이 지나도 서버에서 가지고 있다면 불필요한 데이터가 생기게 되는 것이다. 이러한 문제로 인해서 레디스를 많이 사용한다는 것을 알게 되었다.  

 

처음에는 레디스를 클라우드가 아니라 로컬로 사용하려고 했었다. 그런데 아무리 설정을 해도 되지 않았다. 

  1.  윈도우에서는 WLS가 필요하다고 해서 이것을 설치하고 라이브러리도 설치했다.
  2.  WLS2로 추가적인 설정이 필요하다고 해서 가상환경설정부터 바이오스까지 찾아가며 설정을 마쳤다.
  3.  공식 사이트는 아니지만 깃허브에서 윈도우 버전을 설치할 수 있다고 해서 설치를 했다.
  4.  위에 과정을 하면서 각각 PowerShell, Bash, WLS(Ubuntu), cmd에서 모두 실행을 해봤다. 

 

추가적인 보안이나 다른 설정을 하지 않았는데도 실행되지 않는 원인을 파악할 수 없었다. 레디스 서버가 연결 준비는 되어있다고 하는데 연결하려고 하면 되지 않았다. 혹은 연결이 되었다고 나오는데 막상 실행시키면 코드에는 연결이 되어있지 않았다. 

다른 자료들을 찾아보던 중에 클라우드 환경에서 사용할 수 있다는 것을 알게 되었다. 클라우드가 상대적으로 협업에 편하게 사용할 수 있다는 정보와 무료로 30MB를 사용할 수 있다고 해서 토큰만 저장하는데에는 충분할 것이라고 생각이 되었다. 만약에 위에서 실행이 되었다고 해도 같이 협업하는 분도 복잡한 설정을 해야하는 것을 걱정했는데 더 나은 선택지를 찾아서 클라우드로 설정을 했다. 

 

const redis = require('redis');
const dotenv = require('dotenv');

dotenv.config();

const redisClient = redis.createClient({
    url: `redis://${process.env.REDIS_USERNAME}:${process.env.REDIS_PASSWORD}@${process.env.REDIS_HOST}:${process.env.REDIS_PORT}/0`,
    legacyMode: true, // 이것이 기존에 내가 했던 설정과 달랐다.
});

redisClient.on('connect', () => {
    console.info('Redis connected!');
});

redisClient.on('error', (err) => {
    console.error('Redis Client Error', err);
});

redisClient.connect().then();

const redisCli = redisClient.v4;

module.exports = redisCli;

 

그런데 내가 처음에 설정한 것과 다른 부분을 발견했다. legacyMode: true 설정이었다. 이것은 이전 버전과 호환을 위해서 사용된다. 무슨 내용인지 몰라서 찾아보니 레디스 라이브러리들과 레디스 서버와 상호 작용하는데 버전 차이로 인해서 생기는 문제를 해결 해준다고 한다. 즉, 이것을 추가하지 않았을 때 레디스 서버와 연결해주는데 사용되는 라이브러리들 간의 문제가 있었던 것이었다. 이렇게 일단 레디스 연결은 성공적으로 할 수 있었다.

 

참고