보안 AI 개발
Complete developer guide to building secure AI applications - from input validation to deployment
Updated: August 2026
보안 원칙
1. 심층 방어
Implement multiple layers of security controls. No single control should be relied upon exclusively.
2. 최소 권한
사용자, API 및 AI 구성 요소에 최소한의 필수 권한을 부여합니다.
3. Fail Secure
오류가 발생하면 기본적으로 허용 상태가 아닌 보안 상태로 설정됩니다.
4. 제로 트러스트
Never trust, always verify. Validate at every boundary, including internal systems.
입력 유효성 검사
All user input must be validated and sanitized before processing. This is your first line of defense against prompt injection and other attacks.
입력 검증 클래스
```python
import re
from typing import Optional, List
class InputValidator:
# Known injection patterns
INJECTION_PATTERNS = [
r"ignore\s+(previous|prior|all)\s+(instructions|rules)",
r"(forget|disregard)\s+(your|all)\s+(instructions|rules)",
r"you\s+are\s+(now|still)\s+(dan|do\s+anything)",
r"system\s+prompt:",
r"{{.*}}",
r"\[INST\]|\[/INST\]|<\|end\|>",
]
# Encoding patterns
ENCODING_PATTERNS = [
r"base64:", # Base64 prefix
r"\\x[0-9a-fA-F]{2}", # Hex encoding
r"%[0-9a-fA-F]{2}", # URL encoding
]
def validate(self, user_input: str) -> dict:
"""Validate user input for potential attacks."""
issues = []
# Length check
if len(user_input) > 10000:
issues.append("Input exceeds maximum length")
# Check for injection patterns
for pattern in self.INJECTION_PATTERNS:
if re.search(pattern, user_input, re.IGNORECASE):
issues.append(f"Suspicious pattern detected: {pattern}")
# Check for encoding attempts
for pattern in self.ENCODED_PATTERNS:
if re.search(pattern, user_input):
issues.append(f"Encoded content detected")
# Check for high entropy (possible encoding)
unique_chars = len(set(user_input))
if len(user_input) > 50 and unique_chars / len(user_input) < 0.3:
issues.append("High entropy detected - possible encoding")
return {
"valid": len(issues) == 0,
"issues": issues,
"sanitized": self._sanitize(user_input)
}
def _sanitize(self, user_input: str) -> str:
"""Basic sanitization."""
# Remove control characters
sanitized = re.sub(r'[\x00-\x1F\x7F]', '', user_input)
return sanitized.strip()
```
검증 체크리스트
- 애플리케이션 경계에서 유효성 검사
- 입력 길이 확인
- 주입을 위한 패턴 일치
- 인코딩 시도 감지
- 유형 검증
- 처리 전 삭제
- 로그 검증 실패
- 속도 제한
출력 처리
LLM outputs must be validated and sanitized before being presented to users or passed to other systems.
콘텐츠 필터링
- 민감한 데이터 노출 확인
- 시스템 메시지가 유출되지 않았는지 확인
- 출력 형식 검증
- 삽입된 콘텐츠 확인
PII 탐지
- 개인 정보 검사
- 민감한 데이터 마스킹 또는 수정
- PII 노출 시도 기록
- 감지 시 사용자 알림
형식 유효성 검사
- JSON 출력 검증
- 예상 구조 확인
- 허용 값 확인
- 해당하는 경우 HTML 삭제
출력 핸들러 예
```python
import re
import json
class OutputHandler:
PII_PATTERNS = {
"ssn": r"\b\d{3}-\d{2}-\d{4}\b",
"email": r"\b[\w.-]+@[\w.-]+\.\w+\b",
"phone": r"\b\d{3}[-.]?\d{3}[-.]?\d{4}\b",
}
def process_output(self, raw_output: str) -> dict:
"""Process and validate LLM output."""
result = {
"original": raw_output,
"cleaned": raw_output,
"warnings": [],
"blocked": False
}
# Check for system prompt leakage
if "system prompt" in raw_output.lower():
result["warnings"].append("System prompt reference detected")
# Scan for PII
for pii_type, pattern in self.PII_PATTERNS.items():
matches = re.findall(pattern, raw_output)
if matches:
result["warnings"].append(f"{pii_type} detected in output")
# Optionally mask
result["cleaned"] = re.sub(pattern, "[REDACTED]", result["cleaned"])
return result
```
API 보안
인증
- 강력한 API 키 관리 사용
- 가능한 경우 OAuth 2.0 구현
- JWT 토큰 검증
- API 키 순환
Authorization
- 역할 기반 액세스 제어(RBAC)
- API 키 범위 지정
- 사용자별 속도 제한
- 테넌트 격리
Rate Limiting
- 토큰 기반 제한
- 요청 기반 제한
- 비용 제어
- 계층형 제한
API 보안 체크리스트
- HTTPS만 사용
- 속도 제한 구현
- 모든 입력 검증
- 모든 출력을 삭제합니다
- 내장형이 아닌 API 키 사용
- 요청 서명 구현
- 로그 API 액세스
- CORS를 적절하게 구현
인증 및 승인
사용자 인증
- 강력한 비밀번호 정책
- MFA 지원
- 세션 관리
- 토큰 만료
API 인증
- API 키 관리
- OAuth 범위
- JWT 검증
- 키 순환
Authorization
- RBAC 구현
- 권한 확인
- 리소스 수준 액세스
- 감사 로깅
데이터 보안
데이터 분류
- 민감한 데이터 식별
- 민감도별로 분류
- 카테고리별로 제어 적용
- 정기 감사
암호화
- 전송 중인 TLS
- 유휴 AES
- 키 관리
- 키 순환
PII 처리
- 탐지
- 최소화
- 동의 관리
- 삭제 권리
로깅 및 모니터링
기록할 내용
보안 이벤트
- 인증 시도
- 인증 실패
- 비율 제한 초과
- 의심스러운 패턴
AI 관련 이벤트
- 신속한 주입 시도
- 시스템 프롬프트 액세스
- 도구 호출
- AI를 통한 데이터 액세스
운영 이벤트
- API 호출
- 오류 및 예외
- 성능 지표
- 비용 추적
모니터링 모범 사례
- 보안 이벤트에 대한 실시간 경고
- 보안 측정 기준 대시보드
- 자동 변칙 검색
- SIEM과의 통합
- 정기 로그 검토
- 보존 정책
일반적인 취약점
1. AI 기능의 IDOR
AI가 리소스에 액세스할 때 안전하지 않은 직접 객체 참조
예
User asks AI to "read file X" and AI has access without proper authorization checks.
2. LLM을 통한 SSRF
AI 도구 호출을 통한 서버 측 요청 위조
예
프롬프트는 AI가 내부 서비스에 요청하도록 속입니다.
3. 인증 우회
AI 엔드포인트에 대한 인증이 약하거나 누락됨
예
적절한 인증 확인 없이 AI API 엔드포인트.
4. 벡터 DB 노출
민감한 임베딩이 포함된 보호되지 않은 벡터 데이터베이스
예
민감한 데이터가 내장되어 공개적으로 액세스할 수 있는 벡터 DB.
규정 준수
GDPR (EU)
- 처리를 위한 합법적인 근거
- 데이터 최소화
- 접근/삭제 권한
- 데이터 이동성
CCPA (California)
- 알 권리
- 삭제 권한
- 거부할 권리
- 비차별
AI 관련
- EU AI Act 요구 사항
- AI 위험 평가
- 투명성 의무
- 인적 감독