Why JSON.parse() Crashes Node.js Apps | Express.js Tips

한 줄의 코드가 가장 많은 Node.js 앱을 충돌시키는 이유

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

웹 개발

대상자

  • *대상자:** Node.js 및 Express.js를 사용하는 개발자, 특히 초보자나 미들웨어 사용법을 이해하지 못한 경우
  • *난이도:** 중간 (보편적 실수이지만, 초보자에게는 큰 영향을 줌)

핵심 요약

  • req.bodyJSON.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)는 절대 사용하지 말 것
  • 안전한 파싱을 위한 조건 확인에러 핸들링 미들웨어 적용 필수
  • 자동화 테스트 및 체크리스트를 통해 실무에서의 충돌 예방
  • "한 줄의 코드"가 대규모 서버 다운타임을 유발할 수 있음 → 주의 깊은 코드 리뷰 필요