Node.js 보안 - 실무 보안 체크리스트
2026-02-10
NODE.JSSECURITY
Node.js 애플리케이션의 보안은 다층 방어 전략으로 접근해야 합니다.
이 글에서는 실무에서 자주 놓치는 보안 이슈와 대응 방법을 정리합니다.
1. 의존성 보안
# npm audit로 취약점 검사 npm audit # 자동 수정 npm audit fix
2. 환경 변수 관리
// .env 파일 (git에 커밋하지 않음) require("dotenv").config(); const dbPassword = process.env.DB_PASSWORD;
- 시크릿은 환경 변수로 관리하고
.env는.gitignore에 추가
3. 입력 검증
const express = require("express"); const { body, validationResult } = require("express-validator"); app.post("/users", [ body("email").isEmail(), body("password").isLength({ min: 8 }), ], (req, res) => { const errors = validationResult(req); if (!errors.isEmpty()) { return res.status(400).json({ errors: errors.array() }); } // ... });
4. SQL Injection 방지
// ❌ 나쁜 예 const query = `SELECT * FROM users WHERE id = ${userId}`; // ✅ 좋은 예 (파라미터화된 쿼리) const query = "SELECT * FROM users WHERE id = ?"; db.query(query, [userId]);
5. Helmet.js
const helmet = require("helmet"); app.use(helmet());
- Helmet은 HTTP 헤더를 설정하여 일반적인 취약점을 방지합니다.
6. Rate Limiting
const rateLimit = require("express-rate-limit"); const limiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15분 max: 100, // 최대 100 요청 }); app.use("/api/", limiter);
7. 실무 체크리스트
- 의존성 업데이트: 정기적으로
npm audit실행 - 환경 변수: 시크릿은 환경 변수로 관리
- 입력 검증: 모든 사용자 입력 검증
- HTTPS: 프로덕션에서는 항상 HTTPS 사용
- 에러 메시지: 상세한 에러 정보는 사용자에게 노출하지 않음
보안은 "다층 방어 전략"으로 접근해야 합니다.
