Group Study (2022-2023)/Node.js

[Node.js 입문] 3주차 스터디: 미들웨어, REST, 쿠키와 세션

yun jaeeeun 2022. 11. 6. 23:45

미들웨어

미들웨어는 요청과 응답의 중간에 위치한다. 뒤에 나오는 라우터와 에러 핸들러 또한 미들웨어의 일종이다.

미들웨어는 요청과 응답을 조작하여 기능을 추가하기도하고 나쁜 요청을 걸러내기도 한다.

app.use((req, res, next) => {
    console.log('모든 요청에서 다 실행된다.');
    next();
});
app.get('/', (req, res, next) => { //미들웨어 2개 연결
    console.log('GET / 요청에서만 실행된다.');
    next();
}, (req, res) => {
    throw new Error('에러는 에러 처리 미들웨어로 간다.')
});

app.use((err, req, res, next) => {
    console.error(err);
    res.status(500).send(err.message);
});
  • app.use(미들웨어): app.use()에 매개변수가 req, res, next인 함수를 넣으면 된다. 미들웨어는 위에서부터 순서대로 실행되면서 요청과 응답 사이에 특별한 기능을 추가할 수 있다. 
  • next: 다음 미들웨어로 넘어가는 함수다. next를 실행하지 않으면 다음 미들웨어가 실행되지 않는다.

주소를 첫 번째 인수로 넣어주지 않는다면 미들웨어는 모든 요청에서 실행되고, 주소를 넣는다면 해당하는 요청에서만 실행된다.

자주 쓰는 미들웨어

  • dotenv: .env 파일을 읽어서 process.env로 만든다. process.env를 별도의 파일로 관리하는 이유는 보안과 설정의 편의성 때문이다. 비밀 키들을 소스 코드에 그대로 적어두면 소스 코드 유출 시 키도 같이 유출된다. 따라서 .env 같은 별도의 파일에 비밀 키를 적어두고 dotenv 패키지로 비밀 키를 로딩하는 방식으로 관리하곤 한다.
  • static: 정적인 파일들을 제공하는 라우터 역할을 한다. 기본적으로 제공되기에 따로 설치할 필요없이 express 객체 안에서 꺼내 장착하면 된다. 함수의 인수로 정적 파일들이 담겨있는 폴더를 지정하면 된다.  서버의 폴더 경로와 요청 경로가 다르므로 외부인이 서버의 구조를 쉽게 파악할 수가 없다.
  • body-parser: 요청의 본문에 있는 데이터를 해석해서 req.body객체로 만들어준다. 멀티파트(이미지, 동영상, 파일) 데이터는 처리하지 못한다. 
  • cookie-parser: 요청에 동봉된 쿠키를 해석해 req.cookies 객체로 만든다.
  • express-session: 세션 관리용 미들웨어다. 로그인 등의 이유로 세션을 구현하거나 특정 사용자를 위한 데이터를 암시적으로 저장해둘 때 매우 유용하다. 세션은 사용자별로 req.session 객체 안에 유지된다.
  • multer: 이미지, 동영상 등을 비롯한 여러 가지 파일들을 멀티파트 형식으로 업로드할 때 사용하는 미들웨어다.

 

REST와 라우팅

REST는 REpresentational State Transfer의 줄임말이며, 서버의 자원을 정의하고 자원에 대한 주소를 지정하는 방법을 가리킨다. 자원은 꼭 파일일 필요는 없고 서버가 수행할 수 있는 것들을 통틀어 의미한다.

주소는 의미를 명확히 전달하기 위해 명사로 구성된다. /user이면 사용자 정보에 관련된 자원을 요청하는 것이고, /post는 게시글에 관련된 자원을 요청하는 것이라고 추측할 수 있다.

  • GET: 서버의 자원을 가져오고자 할 때 사용한다. 요청의 본문에 데이터를 넣지 않는다. 데이터를 서버로 보내야한다면 쿼리스트링을 사용한다.
  • POST: 서버에 자원을 새로 등록하고자 할 때 사용한다. 요청의 본문에 새로 등록할 데이터를 넣어 보낸다. 
  • PUT: 서버의 자원을 요청에 들어있는 자원으로 치환하고자 할 때 사용한다. 요청의 본문에 치환할 데이터를 넣어 보낸다.
  • PATCH: 서버 자원의 일부만 수정하고자 할 때 사용한다. 요청의 본문에 일부 수정할 데이터를 넣어 보낸다.
  • DELETE: 서버의 자원을 삭제하고자 할 때 사용한다. 요청의 본문에 데이터를 넣지 않는다. 
  • OPTIONS: 요청을 하기 전에 통신 옵션을 설명하기 위해 사용한다. 

 

쿠키와 세션

기본적으로 HTTP 프로토콜 환경은 "connectionless, stateless"한 특성을 가지기 때문에 서버는 클라이언트가 누구인지 매번 확인해야한다. 이 특성을 보완하기 위해서 쿠키와 세션을 사용하게 된다

쿠키

사용자가 누구인지 기억하기 위해 서버는 응답을 할 때 쿠키라는 것을 같이 보낸다. 쿠키는 유효기간이 있으며 단순한 ‘키-값’의 쌍이다.

서버로부터 쿠키가 오면 웹 브라우저는 쿠키를 저장해두었다가 다음에 요청할 때마다 쿠키를 동봉해서 보낸다. 서버는 요청에 들어있는 쿠키를 읽어서 사용자가 누구인지 파악할 수 있다. 서버는 미리 클라이언트에 요청자를 추정할만한 정보를 쿠키로 만들어 보내고, 그 다음부터 클라이언트로부터 쿠키를 받아 요청자를 파악한다. 쿠키는 요청의 헤더에 담겨 전송된다. 브라우저는 응답의 헤더에 따라 쿠키를 보낸다.

출처: https://interconnection.tistory.com/74

세션

세션은 쿠키를 기반하고 있지만, 사용자 정보 파일을 브라우저에 저장하는 쿠키와 달리 세션은 서버 측에서 관리한다.

서버에서는 클라이언트를 구분하기 위해 세션 ID를 부여하며 웹 브라우저가 서버에 접속해서 브라우저를 종료할 때까지 인증상태를 유지한다. 사용자에 대한 정보를 서버에 두기 때문에 쿠키보다 보안에 좋지만, 사용자가 많아질수록 서버 메모리를 많이 차지하게 된다.