## 들어가며
웹 애플리케이션을 배포하기 전, 보안 점검은 선택이 아닌 필수입니다. 특히 사용자 인증과 API를 제공하는 서비스라면 더욱 그렇습니다. 이 글에서는 실제 프로젝트 배포 전 진행한 보안 강화 작업을 바탕으로, 재사용 가능한 8가지 보안 모듈과 적용 과정에서 얻은 실전 노하우를 공유합니다.
## SOLID 원칙 기반 보안 모듈 설계
보안 기능을 단일 파일에 몰아넣지 않고, 각 책임별로 분리된 8개 모듈로 구성했습니다.
### 1. 중앙화된 설정 관리 (config.py)
```python
class SecurityConfig:
PASSWORD_MIN_LENGTH = 8
RATE_LIMIT_LOGIN = 5 # per minute
TOKEN_EXPIRE_MINUTES = 30
```
설정을 한 곳에서 관리하면 환경별 보안 정책 변경이 용이합니다.
### 2. Rate Limiter (rate_limiter.py)
슬라이딩 윈도우 방식으로 구현하여 로그인 5회/분, 회원가입 5회/시간 제한을 적용했습니다. 멀티스레드 환경에서 안전하게 동작하도록 락(Lock)을 활용했습니다.
### 3. 비밀번호 정책 검증 (password_policy.py)
최소 8자, 대문자+소문자+숫자 조합을 강제하는 유효성 검사 모듈입니다. 정규식 기반으로 확장 가능하게 설계했습니다.
### 4. 토큰 관리 (token_manager.py)
Access Token과 Refresh Token의 생성, 검증, 만료 처리를 담당합니다. JWT 기반으로 구현했습니다.
### 5. 보안 헤더 미들웨어 (headers.py)
```python
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Strict-Transport-Security: max-age=31536000
Content-Security-Policy: default-src 'self'
```
5가지 핵심 보안 헤더를 자동으로 추가하는 미들웨어입니다.
### 6. Proof-of-Work 챌린지 (pow_challenge.py)
SHA-256 기반 작업증명(PoW)으로 봇 자동 가입을 방지합니다. 클라이언트에게 해시 연산을 요구하여 무차별 대입 공격을 차단합니다.
### 7. 감사 로그 (audit.py)
모든 API 요청을 파일 기반으로 기록하는 미들웨어입니다. 보안 사고 발생 시 추적이 가능합니다.
### 8. 모듈 파사드 (\_\_init\_\_.py)
외부에서는 `from security import RateLimiter` 형태로 간편하게 import할 수 있도록 인터페이스를 제공합니다.
## Node.js 클라이언트 보안 강화
### Shell Injection 방지
```javascript
// 취약한 코드
exec(`python script.py ${userInput}`);
// 개선된 코드
execFileSync('python', ['script.py', userInput]);
```
`execFileSync`를 사용하면 쉘 인터프리터를 거치지 않아 명령어 주입 공격을 원천 차단할 수 있습니다.
### 토큰 암호화 저장
AES-256-CBC 방식으로 토큰을 암호화하여 로컬 파일에 저장합니다. 암호화 키는 머신별로 고유하게 생성하여 바인딩했습니다.
### 파일 권한 설정
```javascript
fs.writeFileSync(configPath, data, { mode: 0o600 });
```
설정 파일과 결과 파일은 소유자만 읽고 쓸 수 있도록 권한을 제한했습니다.
## 실전 트러블슈팅 3가지
### 1. Starlette 미들웨어 등록 방식
```python
# 잘못된 방식
app.middleware('http')(SecurityHeadersMiddleware())
# 올바른 방식
app.add_middleware(SecurityHeadersMiddleware)
```
BaseHTTPMiddleware를 상속한 클래스는 인스턴스가 아닌 클래스 자체를 전달해야 합니다.
### 2. CORS 미들웨어 순서
CORSMiddleware는 SecurityHeadersMiddleware보다 먼저 등록해야 합니다. 순서가 바뀌면 OPTIONS 요청에서 CORS 헤더가 누락됩니다.
### 3. Windows 한글 출력 문제
```python
# cp949 인코딩 에러 회피
sys.stdout.buffer.write(message.encode('utf-8'))
```
SSH를 통한 원격 스크립트 실행 시 Windows 환경에서 한글이 깨지는 문제는 바이트 스트림으로 직접 출력하여 해결했습니다.
## 관리자 시스템 구축
7개의 관리 API와 React 기반 AdminTab 컴포넌트로 구성했습니다.
- 통계 대시보드 (Overview)
- 사용자 관리 (Users)
- 봇 관리 (Bots)
- 활동 로그 (Activity)
IP 화이트리스트와 DB의 `is_admin` 컬럼을 조합하여 이중 인증을 적용했습니다.
## 배포 후 개선 사항
현재 구현은 개발 환경 기준이며, 프로덕션 배포 시 다음 사항을 추가해야 합니다.
1. **HTTPS/TLS 적용**: Let's Encrypt를 활용한 무료 인증서 설정
2. **HSTS 및 Secure 쿠키**: 브라우저 강제 HTTPS 리디렉션
3. **CORS Origin 제한**: 와일드카드(*) 대신 명시적 도메인 지정
4. **OAuth 통합**: Google OAuth 2.0 소셜 로그인
5. **토큰 해시 저장**: 평문 토큰 대신 해시값을 DB에 저장
## 마치며
보안은 단 한 번의 작업이 아니라 지속적인 개선 과정입니다. 이번 사전 강화 작업을 통해 기본적인 공격 벡터는 차단했지만, 실제 서비스 운영 중에는 정기적인 보안 점검과 업데이트가 필수입니다.
특히 SOLID 원칙에 따라 모듈을 분리하면 향후 특정 보안 정책 변경 시 다른 모듈에 영향을 주지 않고 유연하게 대응할 수 있습니다. 여러분의 프로젝트에도 이 체크리스트를 참고하여 안전한 배포를 준비하시기 바랍니다.