본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
AI Generated
2025. 11. 2. · 20 Views
Security 디자인 패턴 완벽 가이드
소프트웨어 보안을 강화하는 핵심 디자인 패턴들을 실전 코드와 함께 배웁니다. 인증, 권한 관리, 데이터 보호 등 실무에서 바로 적용할 수 있는 보안 패턴을 소개합니다.
들어가며
이 글에서는 Security 디자인 패턴 완벽 가이드에 대해 상세히 알아보겠습니다. 총 12가지 주요 개념을 다루며, 각각의 개념에 대한 설명과 실제 코드 예제를 함께 제공합니다.
목차
- Secure_Singleton_패턴
- Input_Sanitization_패턴
- Role_Based_Access_Control
- Secure_Token_Manager
- Password_Hashing_패턴
- Rate_Limiting_패턴
- Secure_Data_Encryption
- CORS_Security_패턴
- SQL_Injection_Prevention
- Session_Security_패턴
- Content_Security_Policy
- Secure_File_Upload
1. Secure Singleton 패턴
개요
민감한 설정이나 인증 정보를 안전하게 단일 인스턴스로 관리하는 패턴입니다. 외부 접근을 차단하고 제어된 방식으로만 접근을 허용합니다.
코드 예제
class SecureConfig {
static #instance = null;
#apiKey;
constructor() {
if (SecureConfig.#instance) {
throw new Error('Use getInstance()');
}
this.#apiKey = process.env.API_KEY;
}
static getInstance() {
if (!SecureConfig.#instance) {
SecureConfig.#instance = new SecureConfig();
}
return SecureConfig.#instance;
}
getApiKey() {
return this.#apiKey;
}
}
설명
private 필드(#)를 사용하여 민감한 데이터를 보호하고, getInstance()를 통해서만 접근 가능하도록 제어합니다.
2. Input Sanitization 패턴
개요
사용자 입력을 검증하고 정제하여 XSS, SQL Injection 등의 공격을 방지하는 패턴입니다.
코드 예제
class InputSanitizer {
static sanitizeHTML(input) {
const map = {
'<': '<',
'>': '>',
'"': '"',
"'": ''',
'/': '/'
};
return input.replace(/[<>"'/]/g, (char) => map[char]);
}
static validateEmail(email) {
const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return regex.test(email);
}
}
설명
위험한 문자를 HTML 엔티티로 변환하고, 정규식으로 입력 형식을 검증하여 보안 위협을 사전에 차단합니다.
3. Role Based Access Control
개요
사용자의 역할에 따라 접근 권한을 제어하는 RBAC 패턴입니다. 리소스별로 필요한 권한을 명확히 정의합니다.
코드 예제
class AccessControl {
constructor() {
this.roles = {
admin: ['read', 'write', 'delete'],
user: ['read', 'write'],
guest: ['read']
};
}
hasPermission(role, action) {
return this.roles[role]?.includes(action) || false;
}
authorize(user, action) {
if (!this.hasPermission(user.role, action)) {
throw new Error('Access denied');
}
}
}
설명
역할별로 허용된 작업을 정의하고, authorize 메서드로 실행 전에 권한을 검사하여 무단 접근을 방지합니다.
4. Secure Token Manager
개요
JWT 토큰을 안전하게 생성하고 검증하는 패턴입니다. 토큰 만료 시간과 서명을 통해 보안을 강화합니다.
코드 예제
const crypto = require('crypto');
class TokenManager {
#secret;
constructor(secret) {
this.#secret = secret;
}
generateToken(payload, expiresIn = 3600) {
const header = { alg: 'HS256', typ: 'JWT' };
const data = { ...payload, exp: Date.now() + expiresIn * 1000 };
const token = `${this.encode(header)}.${this.encode(data)}`;
const signature = this.sign(token);
return `${token}.${signature}`;
}
encode(obj) {
return Buffer.from(JSON.stringify(obj)).toString('base64');
}
sign(data) {
return crypto.createHmac('sha256', this.#secret).update(data).digest('base64');
}
}
설명
HMAC-SHA256으로 토큰에 서명하고 만료 시간을 포함하여 위조 방지 및 세션 보안을 확보합니다.
5. Password Hashing 패턴
개요
비밀번호를 평문으로 저장하지 않고 해시화하여 안전하게 관리하는 패턴입니다. Salt를 추가해 레인보우 테이블 공격을 방지합니다.
코드 예제
const crypto = require('crypto');
class PasswordManager {
static hashPassword(password) {
const salt = crypto.randomBytes(16).toString('hex');
const hash = crypto.pbkdf2Sync(password, salt, 1000, 64, 'sha512').toString('hex');
return { salt, hash };
}
static verifyPassword(password, salt, hash) {
const verifyHash = crypto.pbkdf2Sync(password, salt, 1000, 64, 'sha512').toString('hex');
return hash === verifyHash;
}
}
설명
PBKDF2 알고리즘과 랜덤 salt를 사용하여 같은 비밀번호도 다른 해시값을 생성하고, 안전하게 비교합니다.
6. Rate Limiting 패턴
개요
API 요청 횟수를 제한하여 DDoS 공격이나 무차별 대입 공격을 방지하는 패턴입니다.
코드 예제
class RateLimiter {
constructor(maxRequests, windowMs) {
this.requests = new Map();
this.maxRequests = maxRequests;
this.windowMs = windowMs;
}
checkLimit(userId) {
const now = Date.now();
const userRequests = this.requests.get(userId) || [];
const validRequests = userRequests.filter(time => now - time < this.windowMs);
if (validRequests.length >= this.maxRequests) {
throw new Error('Rate limit exceeded');
}
validRequests.push(now);
this.requests.set(userId, validRequests);
}
}
설명
시간 창(window) 내의 요청 수를 추적하고, 제한을 초과하면 요청을 거부하여 서비스 남용을 방지합니다.
7. Secure Data Encryption
개요
민감한 데이터를 암호화하여 저장하고 복호화하는 패턴입니다. AES 알고리즘으로 데이터를 안전하게 보호합니다.
코드 예제
const crypto = require('crypto');
class DataEncryption {
constructor(key) {
this.algorithm = 'aes-256-cbc';
this.key = crypto.scryptSync(key, 'salt', 32);
}
encrypt(data) {
const iv = crypto.randomBytes(16);
const cipher = crypto.createCipheriv(this.algorithm, this.key, iv);
const encrypted = Buffer.concat([cipher.update(data, 'utf8'), cipher.final()]);
return iv.toString('hex') + ':' + encrypted.toString('hex');
}
decrypt(encrypted) {
const [ivHex, dataHex] = encrypted.split(':');
const decipher = crypto.createDecipheriv(this.algorithm, this.key, Buffer.from(ivHex, 'hex'));
return Buffer.concat([decipher.update(Buffer.from(dataHex, 'hex')), decipher.final()]).toString('utf8');
}
}
설명
AES-256-CBC 암호화로 데이터를 보호하고, 랜덤 IV(초기화 벡터)를 사용하여 같은 데이터도 다르게 암호화됩니다.
8. CORS Security 패턴
개요
Cross-Origin 요청을 안전하게 제어하여 허용된 도메인만 API에 접근하도록 하는 패턴입니다.
코드 예제
class CORSManager {
constructor(allowedOrigins) {
this.allowedOrigins = allowedOrigins;
}
validateOrigin(origin) {
return this.allowedOrigins.includes(origin);
}
setCORSHeaders(req, res) {
const origin = req.headers.origin;
if (this.validateOrigin(origin)) {
res.setHeader('Access-Control-Allow-Origin', origin);
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
res.setHeader('Access-Control-Allow-Credentials', 'true');
}
}
}
설명
요청의 Origin을 검증하고 허용된 도메인에만 CORS 헤더를 설정하여 무단 크로스 도메인 접근을 차단합니다.
9. SQL Injection Prevention
개요
SQL 쿼리에서 파라미터를 안전하게 처리하여 SQL Injection 공격을 방지하는 패턴입니다.
코드 예제
class SafeQueryBuilder {
constructor(db) {
this.db = db;
}
findUser(email) {
const query = 'SELECT * FROM users WHERE email = ?';
return this.db.prepare(query).get(email);
}
createUser(name, email) {
const query = 'INSERT INTO users (name, email) VALUES (?, ?)';
return this.db.prepare(query).run(name, email);
}
}
설명
Prepared Statement를 사용하여 사용자 입력을 쿼리 문자열에 직접 삽입하지 않고, 파라미터로 안전하게 전달합니다.
10. Session Security 패턴
개요
세션을 안전하게 관리하고 하이재킹을 방지하는 패턴입니다. 세션 ID를 주기적으로 갱신하고 검증합니다.
코드 예제
class SessionManager {
constructor() {
this.sessions = new Map();
}
createSession(userId) {
const sessionId = crypto.randomBytes(32).toString('hex');
this.sessions.set(sessionId, {
userId,
createdAt: Date.now(),
lastActivity: Date.now()
});
return sessionId;
}
validateSession(sessionId) {
const session = this.sessions.get(sessionId);
if (!session || Date.now() - session.lastActivity > 30 * 60 * 1000) {
this.sessions.delete(sessionId);
return null;
}
session.lastActivity = Date.now();
return session.userId;
}
}
설명
강력한 랜덤 세션 ID를 생성하고, 30분 비활성 시 자동으로 만료시켜 세션 하이재킹 위험을 줄입니다.
11. Content Security Policy
개요
CSP 헤더를 설정하여 XSS 공격과 데이터 삽입 공격을 방지하는 패턴입니다.
코드 예제
class SecurityHeaders {
static setCSP(res) {
const csp = {
'default-src': ["'self'"],
'script-src': ["'self'", "'unsafe-inline'"],
'style-src': ["'self'", "'unsafe-inline'"],
'img-src': ["'self'", 'data:', 'https:'],
'font-src': ["'self'"],
'connect-src': ["'self'"]
};
const cspString = Object.entries(csp)
.map(([key, values]) => `${key} ${values.join(' ')}`)
.join('; ');
res.setHeader('Content-Security-Policy', cspString);
}
}
설명
리소스 로딩 정책을 정의하여 신뢰할 수 있는 출처에서만 스크립트, 스타일, 이미지 등을 로드하도록 제한합니다.
12. Secure File Upload
개요
파일 업로드 시 파일 타입과 크기를 검증하여 악성 파일 업로드를 방지하는 패턴입니다.
코드 예제
class FileUploadValidator {
constructor(maxSize, allowedTypes) {
this.maxSize = maxSize;
this.allowedTypes = allowedTypes;
}
validate(file) {
if (file.size > this.maxSize) {
throw new Error('File too large');
}
const ext = file.name.split('.').pop().toLowerCase();
if (!this.allowedTypes.includes(ext)) {
throw new Error('Invalid file type');
}
return true;
}
}
설명
파일 크기와 확장자를 검증하고, 허용된 타입만 업로드할 수 있도록 제한하여 악성 코드 업로드를 차단합니다.
마치며
이번 글에서는 Security 디자인 패턴 완벽 가이드에 대해 알아보았습니다. 총 12가지 개념을 다루었으며, 각각의 사용법과 예제를 살펴보았습니다.
관련 태그
#JavaScript #Security #Authentication #Encryption #Authorization
이 카드뉴스가 포함된 코스
댓글 (0)
함께 보면 좋은 카드 뉴스
Istio 보안 완벽 가이드
마이크로서비스 환경에서 필수적인 Istio 보안 기능을 실무 중심으로 설명합니다. mTLS부터 인증, 인가까지 단계별로 학습하여 안전한 서비스 메시를 구축할 수 있습니다.
서비스 메시 완벽 가이드
마이크로서비스 간 통신을 안전하고 효율적으로 관리하는 서비스 메시의 핵심 개념부터 실전 도입까지, 초급 개발자를 위한 완벽한 입문서입니다. Istio와 Linkerd 비교, 사이드카 패턴, 실무 적용 노하우를 담았습니다.
EFK 스택 로깅 완벽 가이드
마이크로서비스 환경에서 로그를 효과적으로 수집하고 분석하는 EFK 스택(Elasticsearch, Fluentd, Kibana)의 핵심 개념과 실전 활용법을 초급 개발자도 쉽게 이해할 수 있도록 정리한 가이드입니다.
Grafana 대시보드 완벽 가이드
실시간 모니터링의 핵심, Grafana 대시보드를 처음부터 끝까지 배워봅니다. Prometheus 연동부터 알람 설정까지, 초급 개발자도 쉽게 따라할 수 있는 실전 가이드입니다.
분산 추적 완벽 가이드
마이크로서비스 환경에서 요청의 전체 흐름을 추적하는 분산 추적 시스템의 핵심 개념을 배웁니다. Trace, Span, Trace ID 전파, 샘플링 전략까지 실무에 필요한 모든 것을 다룹니다.