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이다.