- Published on
당신의 웹사이트는 안전한가요? 기초적인 보안 체크포인트
- Authors
- Name
- 한동훈
웹사이트 보안은 선택이 아닌 필수입니다. 특히 고객 데이터를 다루는 비즈니스 사이트라면 더욱 그렇죠. 오늘은 꼭 확인해야 할 기본적인 보안 요소들을 알아보겠습니다.
🔒 HTTPS 설정
SSL/TLS 인증서 확인
# OpenSSL로 인증서 정보 확인
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com
보안 헤더 설정
// Next.js에서 보안 헤더 설정
import { NextResponse } from 'next/server';
export function middleware(request: Request) {
const response = NextResponse.next();
// 보안 헤더 추가
response.headers.set('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
response.headers.set('X-Content-Type-Options', 'nosniff');
response.headers.set('X-Frame-Options', 'DENY');
response.headers.set('X-XSS-Protection', '1; mode=block');
return response;
}
🛡 XSS 공격 방지
// 입력값 sanitize 함수
const sanitizeInput = (input: string): string => {
return input
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''')
.replace(/\//g, '/');
};
🔑 안전한 비밀번호 관리
// 비밀번호 유효성 검사
interface IPasswordValidation {
isValid: boolean;
errors: string[];
}
const validatePassword = (password: string): IPasswordValidation => {
const errors: string[] = [];
if (password.length < 8) {
errors.push('비밀번호는 8자 이상이어야 합니다');
}
if (!/[A-Z]/.test(password)) {
errors.push('대문자를 포함해야 합니다');
}
if (!/[0-9]/.test(password)) {
errors.push('숫자를 포함해야 합니다');
}
return {
isValid: errors.length === 0,
errors
};
};
📱 API 보안
// JWT 토큰 검증 미들웨어
const validateToken = async (req: Request, res: Response, next: NextFunction) => {
const token = req.headers.authorization?.split(' ')[1];
if (!token) {
return res.status(401).json({ error: '인증 토큰이 없습니다' });
}
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET!);
req.user = decoded;
next();
} catch (error) {
return res.status(401).json({ error: '유효하지 않은 토큰입니다' });
}
};
🔍 보안 체크리스트
- HTTPS 적용
- 보안 헤더 설정
- 입력값 검증
- SQL 인젝션 방지
- CSRF 토큰 사용
💡 일반적인 공격 유형과 대응
- XSS (Cross-Site Scripting)
- CSRF (Cross-Site Request Forgery)
- SQL Injection
- DDoS 공격
🛠 보안 모니터링
// 로그인 시도 모니터링
const monitorLoginAttempts = (userId: string) => {
const attempts = loginAttempts.get(userId) || 0;
if (attempts >= 5) {
// 계정 잠금
lockAccount(userId);
sendAlertEmail(userId);
}
loginAttempts.set(userId, attempts + 1);
};
🎯 정기적인 보안 점검 항목
- 취약점 스캔
- 로그 분석
- 백업 확인
- 접근 권한 검토
웹사이트 보안은 한 번 설정하고 끝나는 것이 아닙니다. 정기적인 점검과 업데이트가 필요한 지속적인 과정이라는 것을 잊지 마세요.