개발일지

개발일지 61일차

index.ys 2023. 5. 31. 21:19

redis로 세션 구현하기

설치

- express-session 미들웨어 설치 , express를 사용해 세션을 관리할 수 있도록 사용하는 미들웨어

npm install express-session

파일을 저장할 저장소 선택

1. Memory session store

  • 말 그대로 session데이터를 메모리에 저장하는 방식, 디스크나 db에 저장하는 것 보다 훨씬 속도가 빠름, 메모리에 쌓이는 데이터가 많을때는 부하가 심함 => 메모리 모니터링 필요
 npm install memorystore
  • store옵션을 메모리스토어로 설정해주고 checkPeriod옵션으로 만료기간을 지정함.
app.use(
    session({
        secret: "secret key",
        resave: false,
        saveUninitialized: true,
        store: new MemoryStore({
            checkPeriod: 86400000, 
        }),
        cookie: { maxAge: 86400000 },
    })
);

2. File session store

  • 파일을 생성하고 파일안에 세션을 저장함

  • 파일에 저장된 세션 데이터

3. redis store

  • redis 스토어에 세션을 저장함
const RedisStore = require("connect-redis").default
const redisClient = require('../modules/redisClient');
const session = require('express-session');
  • session에 사용자 데이터 할당하고 저장하기
  const sessionData = {
        userId: loginUser.userId,
        phoneNumber: loginUser.phoneNumber,
        nickname: loginUser.nickname,
        isLogined: true
      };

      req.session.sessionData = sessionData
      await req.session.save()
      return res.status(200).json({ accessToken, refreshToken });
  • redis에 저장된 session 데이터

  • 터미널에서 세션 확인

Redis 호환성모드 에러

  • redisClient 설정에서 legacyMode를 true로 설정하면 redisClient.get 메서드나 다른 메서드 들이 실행되지 않는 오류발생
  • Redis v4에서 트랜잭션 명령어를 실행할 떄 사용하는 multi와 exec 명령어의 동작방식이 변경되어서 이전 버전의 redis와 호환성이 떨어질 수 있기때문에 이전버전과의 호환성을 설정해주기 위해 legacy모드로 설정
  • 일반적인 상황에서는 호환성옵션 설정하지 않음
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,
});

Redis 버전확인하는 명령어

- Redis 터미널에 접속

redis-cli

- 설치된 Redis의 정보를 확인하는 명령어

info

여기서 설치된 버전은 5이다.