🔒 보안

해킹

Hacking

시스템에 무단 접근하는 행위. 화이트햇(윤리적), 블랙햇(악의적), 그레이햇으로 구분.

📖 상세 설명

해킹(Hacking)은 원래 "기발한 방법으로 문제를 해결한다"는 긍정적 의미의 컴퓨터 문화 용어였으나, 현대에는 컴퓨터 시스템, 네트워크, 애플리케이션의 보안 취약점을 탐지하고 악용(또는 테스트)하는 행위를 포괄합니다. 해커의 의도와 윤리성에 따라 화이트햇(White Hat), 블랙햇(Black Hat), 그레이햇(Gray Hat)으로 분류됩니다.

화이트햇 해커(윤리적 해커)는 조직의 허가를 받아 시스템 보안을 테스트하고 취약점을 발견하여 보고하는 보안 전문가입니다. 침투 테스트(Penetration Testing, 펜테스트), 레드팀 훈련, 버그 바운티 프로그램 등을 통해 활동합니다. 반면 블랙햇 해커는 금전적 이득, 정보 탈취, 시스템 파괴 등 악의적 목적으로 무단 침입을 시도합니다. 그레이햇은 허가 없이 취약점을 발견하지만 이를 공개적으로 알리거나 제한적으로 악용하는 중간 영역에 있습니다.

침투 테스트는 체계적인 방법론을 따릅니다. 정보 수집(Reconnaissance) 단계에서 대상 시스템에 대한 공개 정보를 수집하고, 스캐닝(Scanning) 단계에서 열린 포트와 서비스를 탐지합니다. 취약점 분석(Vulnerability Assessment) 후 실제 공격(Exploitation)을 시도하고, 권한 상승(Privilege Escalation)과 측면 이동(Lateral Movement)을 통해 추가 시스템을 장악합니다. 마지막으로 발견 사항을 문서화하여 보고합니다. OWASP, PTES, OSSTMM 등의 표준 방법론이 있습니다.

버그 바운티(Bug Bounty) 프로그램은 기업이 외부 보안 연구자에게 취약점 발견에 대한 보상을 제공하는 제도입니다. Google, Microsoft, Apple 등 대기업부터 스타트업까지 버그 바운티를 운영하며, HackerOne, Bugcrowd 같은 플랫폼을 통해 관리됩니다. 크리티컬 취약점의 경우 수만 달러에서 수십만 달러의 보상금이 지급되기도 합니다. 이는 조직이 내부 보안팀만으로는 발견하기 어려운 취약점을 크라우드소싱 방식으로 탐지할 수 있게 합니다.

💻 코드 예제

주의: 아래 예제들은 보안 교육 및 방어 목적으로 제공됩니다. 허가 없이 타인의 시스템에 적용하는 것은 불법입니다. 반드시 자신의 테스트 환경 또는 명시적 허가를 받은 시스템에서만 실습하세요.

취약점 유형과 방어 코드 예제

# ===========================================
# 1. SQL Injection 취약점과 방어
# ===========================================

# 취약한 코드 (절대 사용 금지)
def get_user_vulnerable(username):
    # 사용자 입력을 직접 쿼리에 삽입 - SQL Injection 취약!
    query = f"SELECT * FROM users WHERE username = '{username}'"
    # 공격 예: username = "' OR '1'='1" 입력 시 모든 사용자 조회

# 안전한 코드 (Parameterized Query 사용)
import sqlite3

def get_user_safe(username: str) -> dict:
    conn = sqlite3.connect('database.db')
    cursor = conn.cursor()

    # 파라미터 바인딩으로 SQL Injection 방지
    cursor.execute(
        "SELECT id, username, email FROM users WHERE username = ?",
        (username,)  # 튜플로 파라미터 전달
    )

    row = cursor.fetchone()
    conn.close()

    if row:
        return {"id": row[0], "username": row[1], "email": row[2]}
    return None

# ORM 사용 (SQLAlchemy) - 가장 안전한 방법
from sqlalchemy.orm import Session
from models import User

def get_user_with_orm(db: Session, username: str) -> User:
    # ORM이 자동으로 파라미터 이스케이프 처리
    return db.query(User).filter(User.username == username).first()


# ===========================================
# 2. XSS (Cross-Site Scripting) 방어
# ===========================================

from markupsafe import escape
from flask import Flask, request, render_template_string

app = Flask(__name__)

# 취약한 코드
@app.route('/vulnerable')
def vulnerable():
    name = request.args.get('name', '')
    # 사용자 입력을 그대로 출력 - XSS 취약!
    return f"<h1>Hello, {name}</h1>"
    # 공격: ?name=<script>alert('XSS')</script>

# 안전한 코드 - HTML 이스케이프
@app.route('/safe')
def safe():
    name = request.args.get('name', '')
    # markupsafe.escape()로 특수문자 이스케이프
    safe_name = escape(name)
    return f"<h1>Hello, {safe_name}</h1>"
    # <script> -> &lt;script&gt; 로 변환

# 템플릿 엔진 사용 (Jinja2 - 자동 이스케이프)
@app.route('/template')
def with_template():
    name = request.args.get('name', '')
    # Jinja2는 기본적으로 자동 이스케이프
    return render_template_string("<h1>Hello, {{ name }}</h1>", name=name)


# ===========================================
# 3. 비밀번호 안전 저장
# ===========================================

import bcrypt
import secrets

class PasswordManager:
    @staticmethod
    def hash_password(password: str) -> str:
        """비밀번호를 bcrypt로 해시 (솔트 자동 생성)"""
        salt = bcrypt.gensalt(rounds=12)  # cost factor 12
        hashed = bcrypt.hashpw(password.encode('utf-8'), salt)
        return hashed.decode('utf-8')

    @staticmethod
    def verify_password(password: str, hashed: str) -> bool:
        """비밀번호 검증"""
        return bcrypt.checkpw(
            password.encode('utf-8'),
            hashed.encode('utf-8')
        )

    @staticmethod
    def generate_secure_token(length: int = 32) -> str:
        """암호학적으로 안전한 랜덤 토큰 생성"""
        return secrets.token_urlsafe(length)

# 사용 예
password = "my_secure_password"
hashed = PasswordManager.hash_password(password)
print(f"Hashed: {hashed}")

is_valid = PasswordManager.verify_password(password, hashed)
print(f"Valid: {is_valid}")  # True


# ===========================================
# 4. CSRF (Cross-Site Request Forgery) 방어
# ===========================================

from flask_wtf import CSRFProtect
from flask import Flask, render_template, request

app = Flask(__name__)
app.config['SECRET_KEY'] = secrets.token_hex(32)
csrf = CSRFProtect(app)

# HTML 폼에 CSRF 토큰 포함
"""
<form method="post" action="/transfer">
    <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
    <input type="text" name="amount">
    <button type="submit">Transfer</button>
</form>
"""

@app.route('/transfer', methods=['POST'])
def transfer():
    # Flask-WTF가 자동으로 CSRF 토큰 검증
    amount = request.form.get('amount')
    # ... 송금 처리
    return "Transfer complete"

# API에서 CSRF 토큰 검증 (SameSite 쿠키와 함께 사용)
@app.route('/api/transfer', methods=['POST'])
@csrf.exempt  # API는 다른 방식으로 보호
def api_transfer():
    # Authorization 헤더 검증
    auth_header = request.headers.get('Authorization')
    if not auth_header or not auth_header.startswith('Bearer '):
        return {"error": "Unauthorized"}, 401
    # ... JWT 토큰 검증 및 처리
    return {"status": "success"}

보안 스캐닝 및 취약점 탐지 (방어 관점)

# ===========================================
# 보안 감사 및 취약점 스캔 도구 (방어 목적)
# ===========================================

# 1. 의존성 취약점 스캔
# npm audit (Node.js)
npm audit
npm audit fix

# pip-audit (Python)
pip install pip-audit
pip-audit

# Snyk (다양한 언어 지원)
snyk test
snyk monitor

# 2. 정적 코드 분석 (보안 취약점 탐지)
# Bandit (Python 보안 분석)
pip install bandit
bandit -r ./src -f html -o security-report.html

# ESLint Security Plugin (JavaScript)
npm install eslint-plugin-security
# .eslintrc에 추가: "plugins": ["security"]

# Semgrep (다양한 언어 지원)
semgrep --config=auto ./src

# 3. 컨테이너 이미지 취약점 스캔
# Trivy
trivy image myapp:latest
trivy fs --security-checks vuln,secret ./

# Docker Scout
docker scout cves myapp:latest

# 4. 인프라 취약점 스캔
# Nmap (네트워크 스캔 - 자체 시스템만!)
nmap -sV -sC -p- localhost

# OWASP ZAP (웹 취약점 스캔)
zap-cli quick-scan --self-contained https://your-test-site.com

# 5. 시크릿 탐지 (Git 저장소)
# TruffleHog
trufflehog git https://github.com/your-org/your-repo

# GitLeaks
gitleaks detect --source . --verbose

보안 헤더 및 설정 강화

# Flask 보안 헤더 설정
from flask import Flask
from flask_talisman import Talisman

app = Flask(__name__)

# Content Security Policy 설정
csp = {
    'default-src': "'self'",
    'script-src': ["'self'", "'unsafe-inline'", "cdnjs.cloudflare.com"],
    'style-src': ["'self'", "'unsafe-inline'", "fonts.googleapis.com"],
    'font-src': ["'self'", "fonts.gstatic.com"],
    'img-src': ["'self'", "data:", "https:"],
    'connect-src': "'self'",
    'frame-ancestors': "'none'",
    'form-action': "'self'",
}

# Talisman으로 보안 헤더 자동 추가
Talisman(
    app,
    content_security_policy=csp,
    force_https=True,
    strict_transport_security=True,
    strict_transport_security_max_age=31536000,
    session_cookie_secure=True,
    session_cookie_http_only=True,
    session_cookie_samesite='Strict',
)

# Django 보안 설정 (settings.py)
"""
# HTTPS 강제
SECURE_SSL_REDIRECT = True
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

# HSTS (HTTP Strict Transport Security)
SECURE_HSTS_SECONDS = 31536000
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True

# XSS 보호
SECURE_BROWSER_XSS_FILTER = True
SECURE_CONTENT_TYPE_NOSNIFF = True

# Clickjacking 방지
X_FRAME_OPTIONS = 'DENY'

# 쿠키 보안
SESSION_COOKIE_SECURE = True
SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_SAMESITE = 'Strict'
CSRF_COOKIE_SECURE = True

# Content Security Policy (django-csp 패키지)
CSP_DEFAULT_SRC = ("'self'",)
CSP_SCRIPT_SRC = ("'self'", "cdnjs.cloudflare.com")
CSP_STYLE_SRC = ("'self'", "'unsafe-inline'")
"""

🗣️ 실무에서 이렇게 말해요

  • "분기별 침투 테스트 결과 나왔는데, 크리티컬 취약점 2개 발견됐어요. 이번 스프린트에서 패치해야 해요"
  • "버그 바운티 프로그램 시작한 이후로 내부에서 못 찾던 취약점들이 리포트되고 있어요. 비용 대비 효과 좋아요"
  • "OWASP Top 10 기준으로 보안 감사 진행하려고 해요. SQL Injection, XSS 위주로 먼저 점검해주세요"
  • "레드팀 훈련 계획 잡아서 실제 공격 시나리오 대응 훈련 해봐야 할 것 같아요. 블루팀 대응 역량도 테스트하고요"
  • "화이트햇 해커는 조직의 허가를 받아 보안 테스트를 수행하고, 블랙햇은 악의적 목적으로 무단 침입을 시도합니다."
  • "침투 테스트는 정보 수집, 스캐닝, 취약점 분석, 공격, 권한 상승, 보고 단계로 진행됩니다. PTES, OWASP Testing Guide 등의 방법론을 따릅니다."
  • "버그 바운티는 외부 보안 연구자에게 취약점 발견 보상을 제공하여 크라우드소싱 방식으로 보안을 강화하는 프로그램입니다."
  • "방어를 위해 OWASP Top 10을 기준으로 SQL Injection, XSS, CSRF 등 주요 웹 취약점에 대한 대응책을 구현해야 합니다."
  • "사용자 입력을 직접 쿼리에 넣으면 SQL Injection 취약점이에요. Parameterized Query나 ORM 사용하세요"
  • "HTML 출력에 escape() 처리 안 되어 있네요. XSS 취약점 발생할 수 있어요. 템플릿 엔진 자동 이스케이프 기능 쓰세요"
  • "비밀번호를 MD5로 해싱하면 안 돼요. bcryptArgon2 사용하고, salt도 자동 생성되게 하세요"
  • "CSRF 토큰 검증 로직이 없어요. 상태 변경 API는 반드시 CSRF 보호 적용해주세요"

⚠️ 주의사항

🔗 관련 용어

📚 더 배우기