한 줄의 코드가 가장 많은 Node.js 앱을 충돌시키는 이유
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발
대상자
- *대상자:** Node.js 및 Express.js를 사용하는 개발자, 특히 초보자나 미들웨어 사용법을 이해하지 못한 경우
- *난이도:** 중간 (보편적 실수이지만, 초보자에게는 큰 영향을 줌)
핵심 요약
req.body
에JSON.parse()
를 직접 적용하지 말 것 (이미express.json()
미들웨어로 파싱됨)express.json()
미들웨어를 반드시 초기 스택에 적용하여 자동 파싱을 활용- 자체 파싱 시
typeof req.body === 'string'
조건 확인 후 안전한 처리 JSON.parse()
사용 시 보안 취약점과 메모리 누수 위험에 주의
섹션별 세부 요약
1. 문제의 핵심: 잘못된 `JSON.parse()` 사용
express.json()
미들웨어가 이미req.body
를 JavaScript 객체로 파싱함JSON.parse(req.body)
로 다시 파싱하면SyntaxError
발생- 예:
const data = JSON.parse(req.body);
→ 앱 충돌
2. 실전 예시: 미들웨어 설정 오류
app.use(express.json());
미들웨어가 없거나 설정되지 않으면req.body
는 문자열 상태JSON.parse()
를 사용하는 유틸리티 함수(parseInput
)가 전역적으로 사용되면 모든 POST 요청이 충돌- 미들웨어 업데이트 누락으로 인한 문제 사례
3. 안전한 파싱 방법
express.json()
미들웨어를app.use()
로 초기 설정req.body
를 직접 사용 (const data = req.body;
)typeof req.body === 'string'
조건 체크 후 안전한 파싱- 예:
const data = typeof req.body === 'string' ? JSON.parse(req.body) : req.body;
4. 보안 및 성능 고려사항
- 대량의 JSON 페이로드로 인한 서버 메모리 소모 방지:
app.use(express.json({ limit: '100kb' }));
Content-Type: text/plain
요청은express.json()
미들웨어를 우회해 수동 파서에 직접 도달해 충돌 유발- 에러 핸들링 미들웨어 추가:
SyntaxError
시 400 에러 응답 전송
5. 실무 팁 및 테스트 전략
JSON.parse()
사용 위치 전반 검토- 자동화 테스트로 문자열/객체 페이로드 모두 처리 가능 확인
- 예:
supertest
로 테스트 코드 작성 - 미들웨어 순서, 파싱 조건, 보안 제한 설정 체크리스트 활용
결론
express.json()
미들웨어 사용 시JSON.parse(req.body)
는 절대 사용하지 말 것- 안전한 파싱을 위한 조건 확인과 에러 핸들링 미들웨어 적용 필수
- 자동화 테스트 및 체크리스트를 통해 실무에서의 충돌 예방
- "한 줄의 코드"가 대규모 서버 다운타임을 유발할 수 있음 → 주의 깊은 코드 리뷰 필요