express-session 미들웨어

김무연·2023년 12월 15일

Backend

목록 보기
40/49
post-thumbnail

express-session

세션 관리용 미들웨어

  • 세션 쿠키에 대한 설정(secret: 쿠키 암호화, cookie: 세션 쿠키 옵션)
  • 세션 쿠키는 앞에 s%3A가 붙은 후 암호화되어 프런트에 전송됨
  • resave: 요청이 왔을 때 세션에 수정사항이 생기지 않아도 다시 저장할지 여부
  • saveUninitialized: 세션에 저장할 내역이 없더라도 세션을 저장할지
  • req.session.save로 수동 저장도 가능하지만 할 일 거의 없음
app.use(session());

app.get('/', (req, res, next) => {
  req.session.id = 'hello' 
  
  res.send('hello express11');
})

위와 같이 할 경우, 각 개인 사용자에게 session 개인의 저장공간이 생긴다. `

app.use(session({
  resave: false,
  saveUninitialized: false,
  secret: 'mymypassword',
  cookie: {
    httpOnly: true,
  },
  name: 'connect.sid',
}
));

위 처럼 session의 여러 속성 지정 가능

console.로 req.session 찍어보면 나의 세션이 나옴

Session {
  cookie: { path: '/', _expires: null, originalMaxAge: null, httpOnly: true },
  name: 'kakakakak'
}

세션의 문제점 (미들웨어간 데이터 전달하기, 데이터 공유)

  • 혹시 여러 미들웨어에서 요청 값을 공유하고 싶다면 절대로 전역변수(app.set)을 통해 클라이언트의 데이터를 공유해서는 안된다.
  • 미들웨어의 request인수에 값을 저장하면 요청이 끝나기 전 까지 서로 다른 미들웨어에서 공유할 수 있다.
app.use((req, res, next) => {
  req.session.data = "똥똥또로똥"
  next();
})

app.get('/about', (req, res) => {
  console.log(req.session.data)
  res.send('hello express33');
});

위와 같이 시작할 때 session에 데이터를 저장해두고, get할 때 session의 데이터를 불러오면, session에 저장되어 있기 때문에 다음의 요청에도 똑같이 데이터가 남아 있음

영구적이 아닌 일회성으로 데이터를 남게 하고 싶으면 session에 저장되게 하지말고, 그냥 req에 저장하기

app.use((req, res, next) => {
  req.data = "똥똥또로똥"
  next();
})

app.get('/about', (req, res) => {
  console.log(req.data)
  res.send('hello express33');
});

그러면 요청이 끝난 후 데이터가 정리되기 때문에 안전해진다

req나 res 객체 안에 값을 넣어 데이터 전달 가능

  • app.set과의 차이점: app.set은 서버 내내 유지, req, res는 요청 하나 동안만 유지
  • 일반적으로 res.locals 객체를 데이터 전달용으로 많이 사용함

미들웨어 확장하기

  • 미들웨어 내부에 미들웨어를 삽입하는 방식으로, 예를 들어 특정 사용자 별 다른 리소스를 응답하여야 할 경우에 사용한다.
  • 미들웨어를 연달아 사용하는 것과는 다름
  • 원리는 미들웨어의 패턴인 (req, res, next) 내부적으로콜백을 전달하는 방식이다. 이러한 패턴을 미들웨어 확장법이라 한다.

미들웨어 안에 미들웨어를 넣는 방법

두 코드는 동일하다

app.use(morgan('dev'))

app.use((req, res, next) => {
	morgan('dev')(req,res,next);
});

응용

app.use('/', (req, res, next) => {
	if (req.session.id) {
		express.static(__dirname + 'public)(req, res, next)
    } else {
    	next();
    }
})

위 처럼 로그인 권한 분기도 가능하다.

profile
Notion에 정리된 공부한 글을 옮겨오는 중입니다... (진행중)

0개의 댓글