SHIN STORYSHIN STORY
홈포스트C#TypeScriptNext.jsNode.js시리즈
</>SHIN STORY

sdf

탐색

  • 홈
  • 모든 포스트
  • 시리즈
  • 검색

카테고리

  • C#
  • TypeScript
  • Next.js
  • Node.js
  • 알고리즘
  • 개발 도구

© 2025 Shin Blog. All rights reserved.

GitHubRSS
목록으로
Node.js#Node.js#Backend#Security

Node.js 보안 체크리스트 10가지

SHIN

2026년 5월 5일2분 읽기1
📚

Node.js 실전 팁 20선

20편
  1. 3Node.js Stream으로 대용량 파일 처리하기
  2. 4Worker Threads로 CPU 집약 작업 처리하기
  3. 5cluster 모듈로 멀티코어 CPU 100% 활용하기
  4. 6child_process로 외부 명령 실행하기
  5. 7fs/promises로 파일 시스템 다루기
  6. 20Node.js Event Loop 완전 정복
  7. 20Node.js path 모듈 완전 정복
  8. 20환경 변수 관리 — .env, dotenv, 그리고 검증
  9. 20EventEmitter 패턴으로 느슨한 결합 구현하기
  10. 20Node.js crypto 모듈로 해싱과 암호화 구현하기
  11. 20Node.js 메모리 누수 찾고 수정하기
  12. 20Express 미들웨어 패턴과 에러 처리
  13. 20Node.js CJS vs ESM 모듈 시스템 완전 정리
  14. 20Node.js Buffer와 인코딩 완전 가이드
  15. 20PM2로 Node.js 프로세스 관리하기
  16. 20Node.js HTTP 서버 직접 구현하기
  17. 20Node.js 성능 프로파일링 실전 가이드
  18. 20Node.js npm 스크립트 완전 활용하기
  19. Node.js 보안 체크리스트 10가지현재
  20. 20Node.js 테스팅 전략 — 단위, 통합, E2E 테스트

Node.js 보안 체크리스트 10가지

보안 취약점은 배포 후보다 개발 단계에서 막는 것이 훨씬 비용이 낮습니다.

1. 입력 검증 & 직렬화

CODE
import { z } from 'zod';

const createUserSchema = z.object({
  email: z.string().email(),
  password: z.string().min(8).max(128),
  name: z.string().min(1).max(100).trim(),
});

app.post('/users', async (req, res) => {
  const result = createUserSchema.safeParse(req.body);
  if (!result.success) {
    return res.status(400).json({ errors: result.error.flatten() });
  }
  // result.data만 사용
});

2. SQL/NoSQL 인젝션 방지

CODE
// ❌ 위험: 문자열 연결
const query = `SELECT * FROM users WHERE email = '${email}'`;

// ✅ Prisma/파라미터화 쿼리
const user = await prisma.user.findUnique({ where: { email } });

// Raw 쿼리가 필요할 때
const users = await prisma.$queryRaw`
  SELECT * FROM users WHERE email = ${email}
`;

3. 보안 헤더 (helmet)

CODE
npm install helmet
CODE
import helmet from 'helmet';
app.use(helmet()); // CSP, HSTS, X-Frame-Options 등 자동 설정

// 커스텀 CSP
app.use(helmet({
  contentSecurityPolicy: {
    directives: {
      defaultSrc: ["'self'"],
      scriptSrc: ["'self'", "'nonce-{nonce}'"],
    },
  },
}));

4. Rate Limiting

CODE
import rateLimit from 'express-rate-limit';

const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15분
  max: 100,                  // IP당 최대 요청
  standardHeaders: true,
  legacyHeaders: false,
});

app.use('/api/', limiter);

// 인증 엔드포인트는 더 엄격하게
const authLimiter = rateLimit({ windowMs: 60_000, max: 5 });
app.use('/api/auth/', authLimiter);

5. 안전한 세션/JWT

CODE
import jwt from 'jsonwebtoken';
import { env } from './config/env.js';

// ❌ 약한 비밀 키, 만료 없음
jwt.sign({ userId }, 'secret');

// ✅ 강한 키, 짧은 만료
const token = jwt.sign(
  { userId, iat: Math.floor(Date.now() / 1000) },
  env.JWT_SECRET, // 최소 32바이트 랜덤
  { expiresIn: '15m', algorithm: 'HS256' }
);

6. CORS 올바른 설정

CODE
import cors from 'cors';

app.use(cors({
  origin: ['https://myapp.com', 'https://www.myapp.com'],
  methods: ['GET', 'POST', 'PUT', 'DELETE'],
  allowedHeaders: ['Content-Type', 'Authorization'],
  credentials: true,
}));
// ❌ origin: '*' with credentials: true 조합 불가

7. 의존성 취약점 관리

CODE
npm audit                    # 취약점 스캔
npm audit fix                # 자동 수정
npx snyk test               # Snyk으로 심층 스캔

# CI에서 자동 체크
npm audit --audit-level=high

8. 에러 정보 노출 방지

CODE
// ❌ 스택 트레이스를 클라이언트에 노출
res.status(500).json({ error: err.stack });

// ✅ 프로덕션에서는 일반 메시지만
app.use((err, req, res, next) => {
  const isProd = process.env.NODE_ENV === 'production';
  res.status(err.statusCode || 500).json({
    error: isProd ? '서버 오류가 발생했습니다' : err.message,
  });
});

9. 파일 업로드 제한

CODE
import multer from 'multer';

const upload = multer({
  limits: { fileSize: 5 * 1024 * 1024 }, // 5MB 제한
  fileFilter: (req, file, cb) => {
    const allowed = ['image/jpeg', 'image/png', 'image/webp'];
    cb(null, allowed.includes(file.mimetype));
  },
});

10. process.env 보호

CODE
// 환경 변수 절대 응답에 포함 금지
app.get('/debug', (req, res) => {
  // ❌ res.json(process.env)
  res.json({ nodeVersion: process.version }); // 안전한 정보만
});
공유
S

SHIN

.NET 개발자입니다

GitHub
Node.js npm 스크립트 완전 활용하기

이전 포스트

Node.js npm 스크립트 완전 활용하기

다음 포스트

Docker로 개발 환경 구축하기

Docker로 개발 환경 구축하기

같은 카테고리 포스트

Node.js 테스팅 전략 — 단위, 통합, E2E 테스트

Node.js 테스팅 전략 — 단위, 통합, E2E 테스트

2026년 5월 6일· 2분
Node.js npm 스크립트 완전 활용하기

Node.js npm 스크립트 완전 활용하기

2026년 5월 4일· 1분
Node.js 성능 프로파일링 실전 가이드

Node.js 성능 프로파일링 실전 가이드

2026년 5월 3일· 2분

댓글