Workspace & Namespace Sanitization 아키텍처

개요

이 문서는 Runna 백엔드에서 workspace와 namespace 이름에 대해 구현된 다층 sanitization 및 검증 시스템을 설명합니다. 이 시스템은 injection 공격에 대한 심층 방어(defense-in-depth) 보안을 제공하고 Kubernetes 호환성을 보장합니다.

보안 목표

  1. Injection 공격 방지: SQL injection, command injection, XSS, path traversal 시도 차단
  2. Kubernetes 호환성: 모든 이름이 Kubernetes DNS-1123 label 표준을 준수하도록 보장
  3. 심층 방어: 여러 계층에서 검증을 적용하여 모든 진입점에서 악의적인 입력 포착
  4. 안전한 실패: 위험한 패턴을 sanitize하려 시도하기보다 유효하지 않은 입력을 거부

아키텍처

2단계 방어 시스템

┌─────────────────────────────────────────────────────────────┐
│                사용자 입력 (HTTP Request)                     │
└──────────────────────┬──────────────────────────────────────┘
                       │
                       ▼
┌─────────────────────────────────────────────────────────────┐
│ Layer 1: API 계층 (app/api/workspaces.py)                   │
│ - 첫 번째 방어선                                              │
│ - 사용자 입력을 즉시 sanitize                                 │
│ - 빠른 피드백으로 UX 향상                                      │
│ - 실패 시 SANITIZATION_ERROR 반환                            │
└──────────────────────┬──────────────────────────────────────┘
                       │
                       ▼
┌─────────────────────────────────────────────────────────────┐
│ Service 계층 (app/services/workspace_service.py)            │
│ - 비즈니스 로직 처리 (중복 체크 등)                            │
│ - 검증된 데이터를 신뢰                                         │
└──────────────────────┬──────────────────────────────────────┘
                       │
                       ▼
┌─────────────────────────────────────────────────────────────┐
│ Layer 2: 모델 계층 (app/models/workspace.py)                │
│ - 두 번째 (최종) 방어선                                        │
│ - SQLAlchemy @validates 데코레이터                           │
│ - 데이터베이스 저장 직전 검증                                  │
│ - 데이터 무결성 보장                                          │
└──────────────────────┬──────────────────────────────────────┘
                       │
                       ▼
┌─────────────────────────────────────────────────────────────┐
│ Infrastructure 계층 (app/core/namespace_manager.py)         │
│ - 검증된 데이터를 신뢰                                         │
│ - 길이 검증만 수행 (63자 제한)                                 │
└──────────────────────┬──────────────────────────────────────┘
                       │
                       ▼
┌─────────────────────────────────────────────────────────────┐
│                    Database / Kubernetes                     │
└─────────────────────────────────────────────────────────────┘

설계 원칙

  1. API Layer (첫 번째 방어): 사용자에게 즉각적인 피드백 제공
  2. Model Layer (최종 방어): 데이터 무결성의 최종 보루
  3. Service/Infrastructure: 이미 검증된 데이터를 신뢰하여 성능 최적화
  4. 검증은 2번만: 과도한 중복 제거로 성능 향상

핵심 구성 요소

1. Sanitization 유틸리티 (app/core/sanitize.py)

모든 sanitization 및 검증 로직을 포함하는 중앙 모듈입니다.