26강. Node.js 프로젝트 실무 보안
이번 강의에서는 Node.js + Express 프로젝트에서 반드시 알아야 하는 보안 기초를 배웁니다.
목표: 로그인, API, 파일 업로드, 데이터베이스를 안전하게 보호하는 실무 보안 기법을 익힙니다.
1. 왜 보안이 중요한가?
웹 서비스는 항상 외부에 노출되어 있습니다.
공격 예시
사용자
↓
로그인
↓
게시판
↓
파일 업로드
↓
DB
↓
공격 대상
보안이 약하면
회원정보 유출
관리자 계정 탈취
DB 삭제
서버 해킹
등의 문제가 발생할 수 있습니다.
2. 주요 공격 종류
공격 설명
SQL Injection SQL 조작
XSS 스크립트 삽입
CSRF 사용자 권한 악용
Brute Force 비밀번호 무차별 대입
File Upload 악성 파일 업로드
JWT 탈취 토큰 탈취
3. SQL Injection 방어
❌ 위험한 코드
const sql =
"SELECT *
FROM member
WHERE id=" + req.params.id;
안전한 코드
const sql =
"SELECT *
FROM member
WHERE id=?";
db.query(
sql,
[req.params.id]
);
항상 **Placeholder(?)**를 사용합니다.
4. 비밀번호 암호화
설치
npm install bcrypt
암호화
const bcrypt = require("bcrypt");
const hash = await bcrypt.hash(
password,
10
);
로그인 비교
const ok = await bcrypt.compare(
password,
hash
);
비밀번호는 절대 평문으로 저장하지 않습니다.
5. JWT 보안
jwt.sign(
payload,
process.env.JWT_SECRET,
{
expiresIn:"1h"
}
);
좋은 방법
.env
↓
JWT_SECRET
↓
jwt.sign()
비밀키를 코드에 직접 작성하지 않습니다.
6. Helmet 설치
설치
npm install helmet
사용
const helmet = require("helmet");
app.use(
helmet()
);
Helmet은 다양한 HTTP 보안 헤더를 자동으로 설정합니다.
7. CORS 제한
설치
npm install cors
예시
const cors = require("cors");
app.use(cors({
origin:
"http://localhost:5173"
}));
운영 환경에서는 허용할 도메인만 등록합니다.
8. Rate Limit
설치
npm install express-rate-limit
설정
const rateLimit = require("express-rate-limit");
const limiter = rateLimit({
windowMs:15*60*1000,
max:100
});
app.use(
limiter
);
15분 동안 100회 요청만 허용합니다.
9. 파일 업로드 보안
multer
const upload = multer({
storage,
limits:{
fileSize:
5*1024*1024
}
});
확장자 검사
if(
file.mimetype
!==
"image/png"
){
return cb(null,false);
}
실행 파일(.exe, .bat 등)은 업로드하지 못하게 제한합니다.
10. 입력값 검증
설치
npm install express-validator
예시
const {
body
} = require(
"express-validator"
);
body(
"email"
).isEmail();
사용자가 입력한 데이터를 검증합니다.
11. XSS 방어
React는 기본적으로 출력 시 HTML을 이스케이프합니다.
예시
<h1>
{name}
</h1>
Node.js에서도 HTML을 그대로 출력하는 경우에는 사용자 입력을 그대로 렌더링하지 않도록 주의해야 합니다.
12. 환경 변수
.env
DB_PASSWORD=*****
JWT_SECRET=********
API_KEY=********
.gitignore
node_modules
.env
.env 파일은 Git 저장소에 올리지 않습니다.
13. HTTPS
모든 로그인과 API 요청은 HTTPS를 사용합니다.
http://
↓
https://
HTTPS는 데이터를 암호화하여 전송합니다.
14. 에러 처리
try{
// 작업
}catch(err){
console.log(err);
res.status(500).json({
message:
"Server Error"
});
}
실무에서는 상세한 오류 내용을 사용자에게 그대로 보여주지 않습니다.
15. 로그 관리
설치
npm install morgan
사용
const morgan = require("morgan");
app.use(
morgan("dev")
);
요청 로그를 기록합니다.
16. 보안 미들웨어 순서
Request
↓
Helmet
↓
CORS
↓
RateLimit
↓
JWT
↓
Controller
↓
Response
17. 실무 보안 체크
항목 적용
bcrypt ✅
JWT ✅
Helmet ✅
CORS ✅
Rate Limit ✅
HTTPS ✅
SQL Placeholder ✅
파일 확장자 검사 ✅
18. 프로젝트 구조
project
│
├── middleware
│ auth.js
│ admin.js
│ limiter.js
│
├── config
├── routes
├── controllers
├── models
└── uploads
19. 보안 흐름
React
↓
JWT
↓
Express
↓
Helmet
↓
Rate Limit
↓
Auth
↓
Controller
↓
MySQL
20. 이번 강의 핵심 정리
보안 기술 목적
bcrypt 비밀번호 암호화
jsonwebtoken 사용자 인증
helmet HTTP 보안 헤더
cors 허용 도메인 제한
express-rate-limit 요청 제한
multer 파일 업로드 제한
express-validator 입력값 검증
.env 민감 정보 보호
실무 팁
실무에서는 보안은 기능을 다 만든 뒤 추가하는 것이 아니라, 처음부터 함께 설계합니다.
예를 들어 회원가입 기능을 만들 때도 다음 순서를 따르는 것이 좋습니다.
회원가입
↓
입력값 검증
↓
비밀번호 암호화
↓
DB 저장
↓
로그 기록
↓
응답
이렇게 하면 이후 기능이 늘어나도 일관된 보안 정책을 유지할 수 있습니다.
실습 미션
다음 보안 기능을 프로젝트에 적용해 보세요.
✅ bcrypt로 비밀번호 암호화
✅ JWT 인증 미들웨어 적용
✅ helmet 적용
✅ cors 허용 도메인 제한
✅ express-rate-limit 적용
✅ express-validator 입력값 검증
✅ 파일 업로드 확장자 및 용량 제한
✅ .env를 이용한 환경 변수 관리
이번 강의에서는 Node.js + Express 프로젝트에서 반드시 알아야 하는 보안 기초를 배웁니다.
목표: 로그인, API, 파일 업로드, 데이터베이스를 안전하게 보호하는 실무 보안 기법을 익힙니다.
1. 왜 보안이 중요한가?
웹 서비스는 항상 외부에 노출되어 있습니다.
공격 예시
사용자
↓
로그인
↓
게시판
↓
파일 업로드
↓
DB
↓
공격 대상
보안이 약하면
회원정보 유출
관리자 계정 탈취
DB 삭제
서버 해킹
등의 문제가 발생할 수 있습니다.
2. 주요 공격 종류
공격 설명
SQL Injection SQL 조작
XSS 스크립트 삽입
CSRF 사용자 권한 악용
Brute Force 비밀번호 무차별 대입
File Upload 악성 파일 업로드
JWT 탈취 토큰 탈취
3. SQL Injection 방어
❌ 위험한 코드
const sql =
"SELECT *
FROM member
WHERE id=" + req.params.id;
안전한 코드
const sql =
"SELECT *
FROM member
WHERE id=?";
db.query(
sql,
[req.params.id]
);
항상 **Placeholder(?)**를 사용합니다.
4. 비밀번호 암호화
설치
npm install bcrypt
암호화
const bcrypt = require("bcrypt");
const hash = await bcrypt.hash(
password,
10
);
로그인 비교
const ok = await bcrypt.compare(
password,
hash
);
비밀번호는 절대 평문으로 저장하지 않습니다.
5. JWT 보안
jwt.sign(
payload,
process.env.JWT_SECRET,
{
expiresIn:"1h"
}
);
좋은 방법
.env
↓
JWT_SECRET
↓
jwt.sign()
비밀키를 코드에 직접 작성하지 않습니다.
6. Helmet 설치
설치
npm install helmet
사용
const helmet = require("helmet");
app.use(
helmet()
);
Helmet은 다양한 HTTP 보안 헤더를 자동으로 설정합니다.
7. CORS 제한
설치
npm install cors
예시
const cors = require("cors");
app.use(cors({
origin:
"http://localhost:5173"
}));
운영 환경에서는 허용할 도메인만 등록합니다.
8. Rate Limit
설치
npm install express-rate-limit
설정
const rateLimit = require("express-rate-limit");
const limiter = rateLimit({
windowMs:15*60*1000,
max:100
});
app.use(
limiter
);
15분 동안 100회 요청만 허용합니다.
9. 파일 업로드 보안
multer
const upload = multer({
storage,
limits:{
fileSize:
5*1024*1024
}
});
확장자 검사
if(
file.mimetype
!==
"image/png"
){
return cb(null,false);
}
실행 파일(.exe, .bat 등)은 업로드하지 못하게 제한합니다.
10. 입력값 검증
설치
npm install express-validator
예시
const {
body
} = require(
"express-validator"
);
body(
"email"
).isEmail();
사용자가 입력한 데이터를 검증합니다.
11. XSS 방어
React는 기본적으로 출력 시 HTML을 이스케이프합니다.
예시
<h1>
{name}
</h1>
Node.js에서도 HTML을 그대로 출력하는 경우에는 사용자 입력을 그대로 렌더링하지 않도록 주의해야 합니다.
12. 환경 변수
.env
DB_PASSWORD=*****
JWT_SECRET=********
API_KEY=********
.gitignore
node_modules
.env
.env 파일은 Git 저장소에 올리지 않습니다.
13. HTTPS
모든 로그인과 API 요청은 HTTPS를 사용합니다.
http://
↓
https://
HTTPS는 데이터를 암호화하여 전송합니다.
14. 에러 처리
try{
// 작업
}catch(err){
console.log(err);
res.status(500).json({
message:
"Server Error"
});
}
실무에서는 상세한 오류 내용을 사용자에게 그대로 보여주지 않습니다.
15. 로그 관리
설치
npm install morgan
사용
const morgan = require("morgan");
app.use(
morgan("dev")
);
요청 로그를 기록합니다.
16. 보안 미들웨어 순서
Request
↓
Helmet
↓
CORS
↓
RateLimit
↓
JWT
↓
Controller
↓
Response
17. 실무 보안 체크
항목 적용
bcrypt ✅
JWT ✅
Helmet ✅
CORS ✅
Rate Limit ✅
HTTPS ✅
SQL Placeholder ✅
파일 확장자 검사 ✅
18. 프로젝트 구조
project
│
├── middleware
│ auth.js
│ admin.js
│ limiter.js
│
├── config
├── routes
├── controllers
├── models
└── uploads
19. 보안 흐름
React
↓
JWT
↓
Express
↓
Helmet
↓
Rate Limit
↓
Auth
↓
Controller
↓
MySQL
20. 이번 강의 핵심 정리
보안 기술 목적
bcrypt 비밀번호 암호화
jsonwebtoken 사용자 인증
helmet HTTP 보안 헤더
cors 허용 도메인 제한
express-rate-limit 요청 제한
multer 파일 업로드 제한
express-validator 입력값 검증
.env 민감 정보 보호
실무 팁
실무에서는 보안은 기능을 다 만든 뒤 추가하는 것이 아니라, 처음부터 함께 설계합니다.
예를 들어 회원가입 기능을 만들 때도 다음 순서를 따르는 것이 좋습니다.
회원가입
↓
입력값 검증
↓
비밀번호 암호화
↓
DB 저장
↓
로그 기록
↓
응답
이렇게 하면 이후 기능이 늘어나도 일관된 보안 정책을 유지할 수 있습니다.
실습 미션
다음 보안 기능을 프로젝트에 적용해 보세요.
✅ bcrypt로 비밀번호 암호화
✅ JWT 인증 미들웨어 적용
✅ helmet 적용
✅ cors 허용 도메인 제한
✅ express-rate-limit 적용
✅ express-validator 입력값 검증
✅ 파일 업로드 확장자 및 용량 제한
✅ .env를 이용한 환경 변수 관리
#26강. Node.js 프로젝트 실무 보안