[Node.js] express 미들웨어 소개

Elen li·2021년 12월 18일
0

1. .env

비밀 키들을 소스 코드에 그대로 적어두면 소스 코드가 유출되었을 때 키도 같이 유출되는데, .env 같은 벼도의 파일에 비밀 키를 적어두고 dotenv 패키지로 비밀 키를 로딩하는 방식으로 관리합니다.

dotenv 패키지는 .env 파일을 읽어서 process.env로 만듭니다. process.env.COOKIE_SECRET에 cookiesecret 값이 할당됩니다. 키-값 형식으로 추가하면 됩니다.
<.env>

COOKIE_SECRET = cookiesecret

2. static 미들웨어

정적인 파일들을 제공하는 라우터 역할을 함. 기본적으로 제공되며 express 객체 안에서 꺼내 장착하면 됩니다.

app.use('요청 경로', express.static('실제 경로'));
app.use('/', express.static(path.join(__dirname, 'public'));
  • 위의 코드는 'public' 폴더가 지정되어 있습니다.
    • public/stylesheets/style.css => http ://localhost:3000/stylesheets/style.css 로 접근
    • public 폴더를 만들고 css나 js, 이미지 파일들을 public 폴더에 넣으면 브라우저에서 접근 가능

요청 주소에는 public이 들어있지 않기 때문에, 서버의 폴더 경로와 요청 경로가 다릅니다.
이것이 보안에 큰 도움이 됩니다.

3. body-parser

요청의 본문에 있는 데이터를 해석해서, req.body 객체로 만들어주는 미들웨어입니다. 보통 폼 데이터나 AJAX 요청의 데이터를 처리합니다. 기본적으로 제공되며 express 객체 안에서 꺼내 장착하면 됩니다.

멀티파트 (이미지, 동영상, 파일) 데이터는 처리하지 못하므로 multer 모듈을 사용합니다.

app.use(express.json());
app.use(express.urlencoded({extended:false}));

3-1. 요청 데이터 종류

  • express.json() : JSON 형식의 데이터 전달 방식
  • express.urlencoded() : 주소 형식으로 데이터를 보내는 방식.(폼 전송은 URL-encoded 방식을 주로 사용)
    • {extended: false}: 노드의 querystring 모듈을 사용하여 쿼리 스트링 해석
    • {extended: true}: qs 모듈을 사용하여 쿼리 스트링 해석. qs 모듈은 내장 모듈이 아니라 npm 패키지이며 querystring 모듈의 기능을 좀 더 확장한 모듈

cookie-parser는 요청에 동봉된 쿠키를 해석해 req.cookies 객체로 만듭니다.

app.use(cookieParser(비밀키));
  • 해석된 쿠키들은 req.cookies 객체에 들어갑니다.
    • 예) 'name=elen'으로 쿠키를 보냈다면 req.cookies는 {name: 'elen'}가 됨
  • 유효기간이 지난 쿠키는 알아서 걸러냄
  • 쿠키는 클라이언트에서 위조하기 쉬우므로 비밀 키를 통해 만들어낸 서명을 쿠키값 뒤에 붙입니다. 서명이 붙으면 쿠키가 name=elen.sign과 같은 모양이 됩니다.
    서명된 쿠키는 req.cookies 대신 req.signedCookies 객체에 들어있습니다.

쿠키 생성 / 제거

  • cookie-parser가 쿠키를 생성할 때 쓰이는 것은 아님
  • 쿠키 생성: res.cookie
  • 쿠키 제거: res.clearCookie (키와 옵션이 모두 정확해야 삭제 가능)
  • res.cookie('키', '값', '옵션')
    • 옵션에는 domain, expires, httpOnly, maxAge, path, secure등이 있음
    • signed: true 옵션 시, 쿠키 뒤에 서명이 되며, 내 서버가 쿠키를 만들었다는 것을 검증할 수 있으므로 서명 옵션을 켜두는 것을 추천
res.cookie('name', 'elen', {
  expires: new Date(Date.now() + 90000),
  httpOnly: true,
  secure: true
});

res.clearCookie('name', 'elen', {httpOnly: true, secure: true});

5. express-session

세션 관리용 미들 웨어
로그인 등의 이유로 세션을 구현하거나 특정 사용자를 위한 데이터를 임시적으로 저장해둘 때 매우 유용

app.use(세션 설정())
  • resave: 요청이 올 때 세션에 수정 사항이 생기지 않더라도 세션을 다시 저장할 지 설정
  • saveUninitialized: 세션에 저장할 내역이 없더라도 처음부터 세션을 생성할 지 설정하는 것
  • secret: 안전하게 쿠키를 전송할 때 쿠키에 서명을 하는데 secret의 값이 필요
    * cookie-parser의 secret과 같게 설정하는 것이 좋음
  • cookie: 세션 쿠키에 대한 설정
    * httpOnly: 클라이언트에서 쿠키를 확인하지 못하도록 함
    • secure: http가 아닌 환경에서도 사용할 수 있는지 여부 체크
    • store: 메모리에 세션을 저장 (서버 재 시작 시, 메모리 초기화로 세션 모두 제거)
      • 배포 시에는 store에 데이터베이스를 연결하여 세션을 유지하는 것이 좋으며 레디스'를 사용함
app.use(session({
  resave: false, 
  saveUninitialized: false, 
  secret: process.env.COOKIE_SECRET,
  cookie: {
    httpOnly: true,
    secure: false,
  },
  name: 'session-cookie'
}));

6. multer

이미지, 동영상 등을 비롯한 여러가지 파일들을 멀티파트 형식으로 업로드 할 때 사용하는 미들웨어

멀티 파트: enctype이 multipart/form-data인 폼을 통해 업로드하는 형식

<form action="/upload" method="post" enctype="multipart/form-data">
	<input type="file" name="image"/>
    <input type="text" name="title"/>
    <button type="submit">업로드</button>
</form>
profile
Android, Flutter 앱 개발자입니다.

0개의 댓글