Redis를 활용해 세션 구현하기
session옵션 설정
- store: 세션을 저장할 저장소를 설정함 Redis를 저장소로 설정
- secret: secret키를 설정함 쿠키를 설정할때 저장한 환경변수를 똑같이 넣음
- saveUninitialized: 수정되지 않은 세션 데이터도 저장소에 저장할지를 결정함 true를 기본으로 설정
- resave: 수정되지 않은 세션 데이터도 저장 false를 기본으로 설정
- name: 클라이언트에서 세션 식별자를 저장할 쿠키의 이름이다
- cookie 객체 - 세션 쿠키에 대한 설정을 담은 객체
- secure : 쿠키가 HTTPS를 통해서만 전송되어야 하는지 여부를 결정하는 옵션 false를 기본으로 설정하고 https를 적용 했을때 true를 설정
- httpOnly: 쿠키에 접근할 때 클라이언트 측의 javascript에서 읽을 수 없도록 하는 옵션 true를 기본으로 설정
- maxAge : 세션 쿠키의 만료시간을 밀리초 단위로 설정하는 옵션 여기선 30분
- sameSite : 쿠키를 어떤 상황에서만 서버로 전송할 것인지를 결정하는 옵션 lax 로 설정하면 다른 도메인으로 쿠키전송 x
app.use(session({
store: new RedisStore({ client: redisClient }),
secret: process.env.COOKIE_SECRET,
saveUninitialized: true,
resave: false,
//세션등록
name: 'connect.sid',
cookie: {
secure: false, // set it to true if you're using HTTPS
httpOnly: true,
maxAge: 1000 * 60 * 30,
sameSite: 'lax',
},
}));
세션에 사용자의 데이터를 할당하는 코드
로그인시 req.session객체에 사용자의 정보를 할당
req.session.userId = user.userId
req.session.isLogined = true
req.session.nickname = user.nickname
console.log(req.session)
session에 할당된 쿠키와 사용자 데이터
사용자의 로그인 상태를 확인하는 미들웨어
- 사용자가 로그인요청을 보냈을때 미들웨어에서 사용자의 상태가 isLogined = true 일때 다음 라우터나 미들웨어로 넘어감
function authenticate(req, res, next) {
if (req.session.isLogined) {
next()
} else {
const err = new Error('로그인 x');
err.statusCode = 401;
return err;
}
}
module.exports = authenticate;
- redis에 저장된 세션
- 브라우저에 저장된 세션ID
세션 저장 로직
- 사용자가 서버로 로그인 요청
- db에 사용자가 보낸 토큰이 있는지 확인후 일치하는 토큰이 있으면 데이터를 가져옴
- 가져온 데이터를 세션스토어에 할당하고, 브라우저에 저장
- 다음 홈페이지 접속시 세션을 가지고있는 사용자는 로그아웃이 되지 않고 로그인 상태유지