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); }, );
성공적으로 소독(?) 처리가 되었음을 알 수 있다. 👏👏