데이터 Sanitization (살균 ? 🤔)

Sanitization 필요 이유

앞서 본 데이터 유효성 검사 이후, 데이터 sanitization 처리를 해줘야한다.

예를 들어, 위 포스팅의 최종 코드에서 아래와 같은 요청을 받으면 어떻게 될까 ?

상식적으로, request body 내의 name은 올바른 이름 규격이 아니므로 생성에 실패해야하지만, 서버 기준에서는 엄밀히 말해 2글자 이상이라 성공 처리가 되는 것을 볼 수 있다.

그래서 데이터 정규화 작업을 해줘야 한다.


How to do?

  • trim()
    • 글자 길이를 확인하기 전, 공백을 모두 제거한다. (순서가 중요!)
    • 실수로 입력했던, 고의로 입력했던 공백을 모두 제거하므로 실제 데이터의 길이를 비교할 수 있다.
  • normalizeEmail()
    • validate 핸들러로 전달 전, 이메일 포맷 정규화 과정
    • 실수로 입력한 대문자 형식을 모두 변경
const validate = (req, res, next) => {
  const errors = validationResult(req);
  if (errors.isEmpty()) {
    return next();
  }
  res.status(400).send({ message: errors.array()[0].msg });
}; // validate 는 계속 사용하므로, 따로 정의

app.post(
  '/users',
  [
    body('name')
      .trim() // 문자길이 비교전 공백 삭제
      .isLength({ min: 2, max: 10 })
      .withMessage('2~10 글자 사이로 입력해주세요!'),
    body('age').notEmpty().isInt().withMessage('숫자를 입력해주세요!'),
    body('email')
      .isEmail()
      .withMessage('유효한 이메일 형식을 입력하세요!')
      .normalizeEmail(), // 이메일 포맷 정규화
    body('job.name').notEmpty(),
    validate, // 배열로 전달
  ],
  (req, res, next) => {
    console.log(req.body);
    res.sendStatus(201);
  },
);

성공적으로 소독(?) 처리가 되었음을 알 수 있다. 👏👏