🤖

본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.

⚠️

본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.

이미지 로딩 중...

Security 실무 활용 팁 가이드 - 슬라이드 1/11
A

AI Generated

2025. 11. 5. · 22 Views

Security 실무 활용 팁 가이드

웹 애플리케이션 개발 시 반드시 알아야 할 보안 실무 팁을 다룹니다. SQL Injection, XSS, CSRF 등 주요 보안 취약점을 방어하는 실전 코드를 제공합니다.


카테고리:JavaScript
언어:JavaScript
메인 태그:#Security
서브 태그:
#XSS#SQL Injection#CSRF#Authentication

들어가며

이 글에서는 Security 실무 활용 팁 가이드에 대해 상세히 알아보겠습니다. 총 10가지 주요 개념을 다루며, 각각의 개념에 대한 설명과 실제 코드 예제를 함께 제공합니다.

목차

  1. SQL_Injection_방어
  2. XSS_방어_입력_검증
  3. CSRF_토큰_검증
  4. 비밀번호_안전하게_저장하기
  5. JWT_토큰_검증
  6. 환경변수로_민감정보_관리
  7. Rate_Limiting_구현
  8. HTTPS_사용_강제
  9. Content_Security_Policy_설정
  10. 입력값_길이_제한

1. SQL Injection 방어

개요

사용자 입력을 직접 SQL 쿼리에 넣지 않고, Parameterized Query를 사용하여 SQL Injection을 방지합니다.

코드 예제

// ❌ 위험한 방법
const query = `SELECT * FROM users WHERE id = ${userId}`;

// ✅ 안전한 방법 (Parameterized Query)
const query = 'SELECT * FROM users WHERE id = ?';
db.execute(query, [userId]);

설명

Parameterized Query를 사용하면 사용자 입력이 SQL 명령어로 해석되지 않아 SQL Injection 공격을 막을 수 있습니다.


2. XSS 방어 입력 검증

개요

사용자 입력을 그대로 HTML에 렌더링하면 XSS 공격에 취약합니다. 입력값을 이스케이프 처리하여 안전하게 만듭니다.

코드 예제

// ❌ 위험한 방법
element.innerHTML = userInput;

// ✅ 안전한 방법
const escapeHtml = (str) => {
  return str.replace(/[&<>"']/g, (m) => ({
    '&': '&amp;', '<': '&lt;', '>': '&gt;',
    '"': '&quot;', "'": '&#39;'
  }[m]));
};
element.textContent = escapeHtml(userInput);

설명

HTML 특수문자를 이스케이프 처리하거나 textContent를 사용하여 스크립트 실행을 방지합니다.


3. CSRF 토큰 검증

개요

CSRF 공격을 방지하기 위해 각 요청에 고유한 토큰을 포함시켜 검증합니다.

코드 예제

// 서버에서 CSRF 토큰 생성 및 검증
const csrfToken = crypto.randomBytes(32).toString('hex');

// 클라이언트 요청
fetch('/api/delete', {
  method: 'POST',
  headers: {
    'X-CSRF-Token': csrfToken
  },
  body: JSON.stringify({ id: 123 })
});

설명

각 세션마다 고유한 CSRF 토큰을 생성하고, 서버에서 검증하여 외부 사이트에서의 요청을 차단합니다.


4. 비밀번호 안전하게 저장하기

개요

비밀번호를 평문으로 저장하면 안 됩니다. bcrypt 같은 해시 함수로 암호화하여 저장합니다.

코드 예제

const bcrypt = require('bcrypt');

// 회원가입 시
const hashedPassword = await bcrypt.hash(password, 10);
await db.insert({ email, password: hashedPassword });

// 로그인 시
const isValid = await bcrypt.compare(
  inputPassword,
  user.hashedPassword
);

설명

bcrypt는 솔트를 자동으로 생성하고 느린 해시 알고리즘으로 무차별 대입 공격을 어렵게 만듭니다.


5. JWT 토큰 검증

개요

JWT 토큰을 사용할 때는 반드시 서버에서 서명을 검증하고, 만료 시간을 확인해야 합니다.

코드 예제

const jwt = require('jsonwebtoken');

// 토큰 생성
const token = jwt.sign({ userId }, SECRET_KEY, {
  expiresIn: '1h'
});

// 토큰 검증
const decoded = jwt.verify(token, SECRET_KEY);
if (decoded.exp < Date.now() / 1000) {
  throw new Error('Token expired');
}

설명

JWT 토큰에 만료 시간을 설정하고, verify 메서드로 서명을 검증하여 위조된 토큰을 걸러냅니다.


6. 환경변수로 민감정보 관리

개요

API 키, 데이터베이스 비밀번호 등 민감한 정보는 코드에 직접 작성하지 않고 환경변수로 관리합니다.

코드 예제

// ❌ 위험한 방법
const apiKey = 'sk-1234567890abcdef';

// ✅ 안전한 방법
require('dotenv').config();
const apiKey = process.env.API_KEY;

// .env 파일 (gitignore에 추가)
// API_KEY=sk-1234567890abcdef

설명

환경변수를 사용하면 민감한 정보가 Git에 노출되지 않고, 배포 환경마다 다른 값을 사용할 수 있습니다.


7. Rate Limiting 구현

개요

무차별 대입 공격(Brute Force)을 방지하기 위해 API 요청 횟수를 제한합니다.

코드 예제

const rateLimit = require('express-rate-limit');

const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15분
  max: 100, // 최대 100회
  message: '너무 많은 요청이 발생했습니다.'
});

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

설명

일정 시간 동안 요청 횟수를 제한하여 무차별 대입 공격이나 DDoS 공격을 완화합니다.


8. HTTPS 사용 강제

개요

HTTP 요청을 자동으로 HTTPS로 리다이렉트하여 중간자 공격(MITM)을 방지합니다.

코드 예제

// Express.js에서 HTTPS 강제
app.use((req, res, next) => {
  if (req.header('x-forwarded-proto') !== 'https') {
    return res.redirect(
      `https://${req.header('host')}${req.url}`
    );
  }
  next();
});

설명

모든 통신을 암호화된 HTTPS로 강제하여 데이터가 평문으로 전송되는 것을 방지합니다.


9. Content Security Policy 설정

개요

CSP 헤더를 설정하여 허용된 소스에서만 스크립트를 실행하도록 제한합니다.

코드 예제

const helmet = require('helmet');

app.use(helmet.contentSecurityPolicy({
  directives: {
    defaultSrc: ["'self'"],
    scriptSrc: ["'self'", "'unsafe-inline'"],
    styleSrc: ["'self'", "https://fonts.googleapis.com"],
    imgSrc: ["'self'", "data:", "https:"]
  }
}));

설명

CSP를 설정하면 신뢰할 수 있는 출처의 리소스만 로드되어 XSS 공격을 추가로 방어할 수 있습니다.


10. 입력값 길이 제한

개요

사용자 입력의 최대 길이를 제한하여 버퍼 오버플로우나 DoS 공격을 방지합니다.

코드 예제

// Express.js body parser 설정
app.use(express.json({
  limit: '10kb'
}));

// 입력 검증
if (username.length > 50) {
  return res.status(400).json({
    error: '사용자명은 50자를 초과할 수 없습니다.'
  });
}

설명

입력값의 크기를 제한하면 대용량 데이터 전송을 통한 서버 부하 공격을 막을 수 있습니다.


마치며

이번 글에서는 Security 실무 활용 팁 가이드에 대해 알아보았습니다. 총 10가지 개념을 다루었으며, 각각의 사용법과 예제를 살펴보았습니다.

관련 태그

#Security #XSS #SQL Injection #CSRF #Authentication

#Security#XSS#SQL Injection#CSRF#Authentication#JavaScript

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.