project/웹 개발 실무 기술 A to Z

웹 개발 실무 기술 A to Z # 4 - 웹 애플리케이션 보안 강화: CORS, HTTPS, SQL Injection 방어

octo54 2025. 2. 24. 11:53
반응형

웹 개발 실무 기술 A to Z

D – 웹 애플리케이션 보안 강화: CORS, HTTPS, SQL Injection 방어

웹 애플리케이션은 다양한 보안 위협에 노출될 수 있습니다.
API가 보안 설정 없이 공개되면, 데이터 유출, 해킹, 크로스 사이트 공격(XSS), SQL Injection 등의 위험이 발생할 수 있습니다.
이번 글에서는 CORS 정책, HTTPS 적용, SQL Injection 방어 등 보안 강화를 위한 핵심 기술을 소개하겠습니다.


1. 웹 애플리케이션 보안이 중요한 이유

웹 애플리케이션이 해킹되면 사용자 데이터 유출, 시스템 마비, 금전적 손실 등의 문제가 발생할 수 있습니다.
✔️ 클라이언트 & 서버 간 안전한 데이터 전송
✔️ API 남용 방지
✔️ 데이터 변조 및 공격 방어


2. CORS (Cross-Origin Resource Sharing) 정책

2-1. CORS란?

CORS(Cross-Origin Resource Sharing)는 다른 도메인 간의 요청을 허용하는 정책입니다.
기본적으로 웹 브라우저는 보안상 동일 출처(Same-Origin) 정책을 적용하여, 다른 도메인에서 API 요청을 차단합니다.

✔️ 예제:

  • frontend.com에서 api.backend.com으로 요청할 경우 CORS 설정이 필요함

2-2. CORS 오류 해결 방법

(1) CORS 에러 발생 시

Access to fetch at 'https://api.backend.com' from origin 'https://frontend.com' has been blocked by CORS policy.

(2) Express에서 CORS 허용

npm install cors
const cors = require("cors");
app.use(cors({ origin: "https://frontend.com" })); // 특정 도메인만 허용

CORS 정책을 설정하면 프론트엔드와 백엔드 간 데이터 교환이 가능!
무분별한 API 사용을 방지하려면 특정 도메인만 허용하는 것이 안전!


3. HTTPS 적용 및 보안 강화

3-1. HTTPS가 필요한 이유

HTTPS(HyperText Transfer Protocol Secure)는 데이터 암호화 및 무결성을 보장하는 보안 프로토콜입니다.
✔️ 데이터 보호 → TLS(SSL) 암호화를 통해 해킹 방지
✔️ 브라우저 신뢰도 증가 → HTTPS를 사용하면 브라우저에서 "안전한 사이트"로 표시됨

3-2. HTTPS 적용 방법

(1) Let's Encrypt로 무료 SSL 인증서 적용

sudo certbot --nginx -d example.com -d www.example.com

(2) Express에서 HTTPS 서버 설정

const https = require("https");
const fs = require("fs");

const privateKey = fs.readFileSync("privkey.pem", "utf8");
const certificate = fs.readFileSync("fullchain.pem", "utf8");

const credentials = { key: privateKey, cert: certificate };
const server = https.createServer(credentials, app);

server.listen(443, () => {
  console.log("HTTPS Server running on port 443");
});

HTTPS를 적용하면 데이터가 암호화되어 해킹 위험이 줄어듦!
Google SEO 순위에도 긍정적인 영향을 줌!


4. SQL Injection 방어

4-1. SQL Injection이란?

SQL Injection은 사용자가 입력한 값이 그대로 SQL 쿼리에 삽입되면서 데이터베이스가 해킹되는 공격 기법입니다.

✔️ SQL Injection 공격 예시

SELECT * FROM users WHERE username = 'admin' OR 1=1; -- 모든 사용자 데이터 노출

4-2. SQL Injection 방어 방법

✔️ Prepared Statements (ORM 사용)
✔️ 입력값 검증 및 필터링
✔️ 최소 권한의 DB 계정 사용

(1) SQL Injection 취약한 코드

app.post("/login", async (req, res) => {
  const { username, password } = req.body;
  const query = `SELECT * FROM users WHERE username = '${username}' AND password = '${password}'`; // 취약한 코드
  const result = await db.query(query);
  res.json(result);
});

✔️ 문자열을 직접 삽입하는 방식은 위험!

(2) SQL Injection 방어 코드 (Prepared Statements)

app.post("/login", async (req, res) => {
  const { username, password } = req.body;
  const query = "SELECT * FROM users WHERE username = ? AND password = ?";
  const result = await db.query(query, [username, password]); // 안전한 방식
  res.json(result);
});

Prepared Statements를 사용하면 SQL Injection 공격을 방어 가능!
ORM (Sequelize, Prisma) 사용 시 자동으로 보안 강화됨!


5. 추가적인 웹 보안 강화 방법

✔️ XSS (Cross-Site Scripting) 방어

  • 사용자 입력을 필터링하여 악성 코드 실행 방지
const sanitizeHtml = require("sanitize-html");
const cleanInput = sanitizeHtml(req.body.comment);

✔️ 보안 헤더 설정 (Helmet 사용)

npm install helmet
const helmet = require("helmet");
app.use(helmet());

✔️ Rate Limiting 적용 (DDoS 방어)

const rateLimit = require("express-rate-limit");
const limiter = rateLimit({ windowMs: 15 * 60 * 1000, max: 100 });
app.use(limiter);

6. 마무리 및 다음 글 예고

이번 글에서는 **웹 애플리케이션 보안 강화 방법 (CORS, HTTPS, SQL Injection 방어)**을 살펴봤습니다.
다음 글에서는 **데이터베이스 성능 최적화 (인덱싱, 샤딩, 캐싱)**을 다룰 예정입니다.

다음 글 예고: "데이터베이스 성능 최적화 – 인덱싱, 샤딩, 캐싱 전략" 🚀