노드에서 세션을 이용한 로그인/아웃 구현

노드 익스프레스에서는 세션관리를 위한 미들웨어를 기본으로 제공한다. 세션은 쿠키에 의존하기때문에 cookieParser와 session 미들웨어를 함께 사용한다. 노드 익스프레스의 세션 미들웨어를 이용해 로그인, 로그아웃 기능을 구현해 보자. 또한 세션 저장소로 레디스 서버를 사용해 보자.

로그인

cookieParser와 session 미들웨어를 추가한다. 세션키, 세션 쿠키 등을 함께 설정한다.

app.use(express.cookieParser())
app.use(
  express.session({
    key: "sid", // 세션키
    secret: "secret", // 비밀키
    cookie: {
      maxAge: 1000 * 60 * 60, // 쿠키 유효기간 1시간
    },
  })
)

이렇게 설정하고 나면 Request 객체의 session 프로퍼티를 가지고 세션을 핸들링할 수 있다.

function (req, res) {
  req.session.user_id = 1234, // 아이디
  req.session.name = 'chris' // 이름
}

로그아웃

로그 아웃시 세션을 삭제한다. 세션 정보를 완전히 삭제하려면 세션과 쿠키를 함께 삭제해야 한다. 쿠키를 삭제하지 않을 경우 쿠기에 저장된 세션 정보로 인해 세션이 다시 살아나는 문제가 있기 때문이다. 세션 객체에서 제공하는 destory() 메소드로 세션을 삭제한다. 쿠키는 Response 개체의 clearCookie() 메소드에 세션 생성시 사용한 키값을 파라매터로 전달하여 삭제할 수 있다.

exports.logout = function (req, res) {
  req.session.destory() // 세션 삭제
  res.clearCookie("sid") // 세션 쿠키 삭제
}

레디스 (Redis)

그러나 메모리 세션을 사용하면 익스프레스에서 경고 메세지를 뿌린다. Production 모드에서는 사용하지 말라. 실제 서버에서는 메모리 용량 제한으로 세션 정보를 유실할 수 있다. 혹은 오토스케일링으로 인한 서버 인스턴스 증가로 세션 정보 공유에 대한 문제가 발생 할 수 있다. 그래서 세션 저장을 위한 별도의 저장소로 레디스, 몽고디비 등을 사용한다. 여기에서는 레디스를 사용해 보자.

노드에서 레디스 서버 연결을 위해 connect-redis를 설치한다. (npm install connect-redis) 익스프레스 버전에 따라 세션과 레디스 서버를 연결하지 못하는 경우가 있다.(참고) 익스프레스에서 제공하는 기본 세션 미들웨어를 사용하지 말고 express-seesion을 사용해야 한다. (npm install express-session) express-session – redid – express를 세팅하는 코드는 아래와 같다.

var session = require("express-session"),
  RedisStore = require("connect-redis")(session)

app.use(express.cookieParser())
app.use(
  session({
    store: new RedisStore(/*redis config: host, port 등*/), // 세션 저장소를 레디스 서버로 설정
    /* 이하 express.session 코드와 동일 */
  })
)

세션 설정하는 부분에서만 레디스 정보를 추가하고 나머지 부분은 express.session과 동일하다.