10장: 로깅, 모니터링 및 사고 대응
FileBolt의 관측 가능성(observability)은 영지식 경계와 일치해야 합니다. 시스템은 새로운 민감 정보 유출 경로를 만들지 않으면서 장애를 파악하고, 공격을 탐지하고, 성능을 수치화할 수 있어야 합니다. 이 장에서는 어떤 이벤트를 기록하는지 정의하고, 특정 정보의 기록을 명시적으로 금지하며, 경보와 이상 탐지 방법을 개괄하고, 보안 사고 대응(IR) 프로세스와 외부 커뮤니케이션 원칙을 자세히 설명합니다.
10.0 요약
- SHOULD: 로그와 모니터링은 필요한 운영 및 보안 이벤트만 다루고, 집계와 샘플링을 활용하여 원시 세부 정보의 보존을 최소화합니다.
- MUST NOT: 어떤 로그, APM, 오류 보고서에도 CEK, URL 프래그먼트(
location.hash), 프래그먼트가 포함된 전체 URL이 들어가서는 안 됩니다. - MUST NOT: 평문 콘텐츠, 복호화된 청크, 유추할 수 있는 키 자료를 기록하지 않습니다.
- MUST: 열거, 무차별 대입, 트래픽 급증, 비정상 패턴에 대한 탐지와 경보 체계를 구축하고, 차단 조치를 마련합니다.
- MUST: 사고 대응(IR) 프로세스(분류, 격리, 포렌식, 복구, 검토, 커뮤니케이션)를 유지합니다.
10.1 기록하는 이벤트(최소주의)
시스템 로그와 모니터링은 “운영과 보안에 필요한” 이벤트 집합만 다루어야 하며(SHOULD), 사용자 콘텐츠나 민감한 자격 증명이 관측 시스템에 수집되지 않도록 해야 합니다. 이벤트는 수명 주기, 인증, 스토리지/네트워크, 보안 보호로 분류하며, 집계를 권장합니다.
10.1.1 전송 수명 주기 이벤트
- 전송 생성(transferId 생성)
- 청크 업로드 완료(평문이 아닌 암호문 수준에서 기록)
- 매니페스트 쓰기/업데이트
- 만료 정리, 사용자 삭제/취소(정리 작업의 시작 및 완료 포함)
- 다운로드 시작/완료(암호문 다운로드 수준에서 측정)
10.1.2 인증 및 권한 부여 이벤트
- 세션 토큰 발급, 검증 실패(범위 불일치, 만료, 취소 등)
- 장기 로그인 토큰 검증 실패(관리 작업 거부)
- 의심스러운 접근 패턴: 401/403/404의 비정상적인 급증
참고: “결과와 사유 코드”만 기록합니다. 토큰 평문, Authorization 헤더 평문, 서명 매개변수 평문을 기록해서는 안 됩니다(MUST NOT).
10.1.3 시스템 상태 및 성능 지표
- 요청 지연 시간(p50/p95/p99), 오류율, 처리량
- 객체 스토리지 읽기/쓰기 실패율, 오리진 가져오기 실패율, 재시도 횟수
- 엣지 노드 이상, 대기열 적체, 백그라운드 정리 작업 성공률
- 대역폭 및 트래픽 추이(집계된 차원)
10.1.4 보안 보호 이벤트
- 요청 제한(rate limiting) 발동, WAF/방화벽 규칙 적중
- 열거/무차별 대입으로 의심되는 행위의 임계값 도달
- 비정상적인 동시 접속 및 트래픽 패턴(동일 출처의 높은 동시성, 비정상적인 리소스 집중 접근)
10.1.5 집계 및 샘플링
- SHOULD: 세부 로그를 줄이기 위해 분/시간 단위로 건수와 지연 시간 분위수를 집계합니다.
- SHOULD: 빈도가 높은 성공 요청은 샘플링하고, 오류와 비정상 경로에 대해서만 필요한 세부 정보를 보존합니다.
- SHOULD: 이상 이벤트에는 감사와 기계 분석이 쉽도록 안정적인 분류 필드(예: eventType, reasonCode)를 유지합니다.
10.2 기록 금지 정보(CEK, 프래그먼트, 자격 증명)
영지식 약속을 지키는 핵심은 모든 관측 시스템에 “민감 데이터 기록 금지” 정책을 엄격하게 적용하는 것입니다. 이 정책은 서버 로그, APM, 오류 보고, 제3자 모니터링, 클라이언트 로그, 브라우저 콘솔 출력을 모두 포함해야 합니다.
10.2.1 서버 측에서 기록해서는 안 되는 것(MUST NOT)
- CEK(콘텐츠 암호화 키)와 이를 유추할 수 있는 모든 자료
- URL 프래그먼트(
#...),location.hash, 프래그먼트가 포함된 전체 URL - 평문 콘텐츠: 파일 평문, 미리 보기 콘텐츠, 복호화된 청크, 평문 요약
- 민감한 자격 증명 평문: 세션 토큰, 장기 토큰, Authorization 헤더 평문, 서명된 URL의 서명 필드 평문
디버깅을 위해 URL을 기록해야 하는 경우: 반드시(MUST) 정제(프래그먼트 제거, 민감한 쿼리는 마스킹 또는 제거)하고, 이를 수동 관례에 의존하지 않고 코드 수준에서 강제해야 합니다.
10.2.2 클라이언트 측에서 기록해서는 안 되는 것(MUST NOT)
- 프로덕션 환경에서
location.href(프래그먼트가 포함될 수 있음)를 출력하지 않습니다 - 오류 보고서에 프래그먼트, CEK, noncePrefix가 포함된 URL을 넣지 않습니다
- 디버그 로그와 개발자 도구 출력은 기본적으로 비활성화하거나 최소화해야 합니다
SHOULD: 프런트엔드에 통합 로그/보고 함수를 두고, 출력하거나 보고하기 전에 내부적으로 URL 정제와 민감 필드 필터링을 수행하도록 캡슐화합니다.
10.3 모니터링 지표 및 경보(가용성, 성능, 보안)
10.3.1 가용성 및 성능 경보
- 오류율 경보: 5xx 급증, 4xx의 비정상적 증가(인증 실패와 악용을 구분)
- 지연 시간 경보: p95/p99 임계값 초과, 지역별 오리진 가져오기 이상
- 스토리지 경보: 객체 스토리지 쓰기 실패 증가, 읽기 시간 초과
- 정리 작업 경보: 만료 정리 적체, 삭제 작업의 과도한 재시도
10.3.2 보안 경보
- 요청 제한 적중률의 비정상적 상승
- 동일 출처의 고빈도 401/403/404, 열거/무차별 대입 의심
- 단일 리소스의 비정상적인 다운로드 대역폭/동시성, 트래픽 폭주 또는 핫링크 의심
- 주요 정책 변경(예: WAF 규칙, CSP/헤더 변경)은 변경 감사와 경보를 발생시켜야 합니다(해당하는 경우)
10.3.3 경보 거버넌스
- SHOULD: 경보를 등급(P0/P1/P2)별로 분류하고 순환 대기/에스컬레이션 경로를 마련합니다.
- SHOULD: 잡음이 많은 지표에는 디바운스/시간 창 집계를 적용하여 경보 피로를 방지합니다.
- SHOULD: 각 경보에는 민감 데이터를 제외한 최소한의 진단 정보(사유 코드, 추이 차트, 영향받는 지역/경로)를 첨부합니다.
10.4 이상 탐지 및 악용 식별
파일 전송 서비스는 구조적으로 열거, 무차별 대입, 트래픽 폭주, 리소스 악용의 위험에 노출됩니다. 이 절에서는 탐지할 수 있는 신호와 대응 원칙을 개괄합니다. 구체적인 임계값과 전략은 서비스 규모와 오탐 비용에 따라 동적으로 조정해야 합니다.
10.4.1 일반적인 이상 패턴
- 열거(Enumeration): 짧은 시간에 transferId/리소스 경로를 대량으로 탐색하며, 404/401/403이 급증합니다.
- 무차별 대입(Brute Force): 짧은 코드/비밀번호/토큰에 대한 고빈도 시도, 비정상적인 실패율 곡선.
- 트래픽 폭주(Traffic Flooding): 단일 리소스의 비정상적인 대역폭, 동일 출처의 대규모 동시 연결, 반복 다운로드.
- 프로토콜 이상: 비합리적인 청크 순서, 중복 업로드, 잦은 중단/재시도, 비정상적인 UA 패턴.
10.4.2 완화 전략(원칙)
- SHOULD: 요청 제한, 단계별 차단, 챌린지 메커니즘(해당하는 경우), ASN/지역/핑거프린트 기반 동적 정책을 적용합니다.
- SHOULD: 오탐에 민감한 경로(일반 사용자도 자주 다운로드할 수 있음)에는 지연, 구간별 속도 제한 같은 더 완만한 전략을 채택합니다.
- MUST: 취한 조치에 대해 감사할 수 있는 근거(사유 코드, 임계값 범주)를 보존하고, 지원 채널을 제공합니다(해당하는 경우).
10.5 사고 대응 프로세스
FileBolt는 신속한 피해 통제, 검토 가능성, 투명한 커뮤니케이션을 보장하기 위해 보안 사고 대응(IR) 프로세스를 갖추어야 합니다(MUST). 영지식 약속에 영향을 줄 수 있는 이벤트(예: XSS, 공급망 주입, 로그를 통한 프래그먼트 유출)는 최우선 순위로 다루어야 합니다.
- 분류(Triage): 영향 범위와 심각도(예: P0/P1/P2)에 따라 분류하고, 에스컬레이션 경로와 담당자를 정의합니다.
- 격리(Containment): 위험 요인을 신속하게 격리합니다(공격 출처 차단, 기능 일시 중지, 정책 강화, 키/토큰 교체).
- 포렌식 및 검토: 최소한의 로그와 지표를 바탕으로 타임라인을 재구성하고, 판단, 영향, 복구 조치, 개선 사항을 문서화합니다.
- 복구 및 검증: 패치를 배포하고, 회귀 테스트와 보안 검증을 수행하며, 필요하면 제3자 스캔을 다시 실시합니다.
- 커뮤니케이션 및 공개: 공격 표면을 넓히지 않는 범위에서 사용자와 대중에게 투명하게 설명하고, 필요하면 상태 페이지에 사고 보고서를 게시합니다.
외부 커뮤니케이션에서는 키 자료나 평문이 노출되었을 가능성이 있는지, 영향 범위, 취한 조치, 사용자가 취해야 할 조치(있는 경우)를 명확히 밝혀야 합니다.
10.6 데이터 보존 및 접근 제어
로그와 모니터링 데이터는 그 자체로 민감한 자산입니다. 유출과 악용 위험을 최소화하려면 필요한 만큼의 가장 짧은 보존 기간과 최소 권한 접근 제어를 적용해야 합니다.
- SHOULD: 로그 유형별로 보존 기간을 차등 설정합니다(오류와 보안 이벤트는 다소 길게, 성공 요청 세부 정보는 짧게 또는 보존하지 않음).
- SHOULD: 로그 및 모니터링 플랫폼에 최소 권한 접근(RBAC)을 적용하고 접근 감사 기록을 보존합니다.
- SHOULD: 로그를 내보내거나 공유할 때는 정제와 최소화를 수행합니다(민감한 자격 증명과 개인 식별 정보(PII) 포함 금지).
10.7 제3자 모니터링 및 연동 원칙
제3자 APM/오류 추적 도구는 기본적으로 URL, 헤더, 양식 필드, 기기 정보를 수집할 수 있습니다. 제3자 모니터링을 사용하는 경우, 해당 도구의 수집 범위가 영지식 약속을 위반하지 않는지 확인해야 합니다.
- MUST: 다운로드/복호화 페이지에서는 제3자 스크립트를 로드하지 않습니다(9장과 동일).
- MUST: 제3자 수집 설정을 명시적으로 구성합니다. 프래그먼트, 민감한 헤더 평문, 평문 콘텐츠는 수집하지 않습니다.
- SHOULD: 보고 시 URL 정제를 일원화하고, 민감한 필드가 포함될 수 있는 페이로드는 금지하거나 강하게 마스킹합니다.
- SHOULD: 엔드포인트의 수집 범위를 줄이기 위해 클라이언트 측의 세부 추적보다 서버 측 집계 지표를 우선합니다.
10.8 관련 Claim ID(예약)
이 장은 “민감 데이터 로깅 금지, 경보 및 IR, 제3자 모니터링 제약”을 다룹니다. 해당하는 Claim ID는 부록: Claim ID 마스터 목록에 유일한 기준 출처로 추가됩니다.