이 문서를 통해 아래 질문들에 답할 수 있게 됩니다.
- 보안 사고를 감지한 직후 첫 시간에 무엇을 보존하고 무엇을 차단해야 하는가?
- 서버 재시작, 로그 삭제, 비밀키 회전 같은 조치를 어떤 순서로 판단해야 하는가?
- 사고 대응 기록은 이후 보고서와 재발 방지로 어떻게 이어지는가?
개요
보안 사고 초기 대응의 목표는 완벽한 원인 분석이 아니다. 첫 단계에서는 추가 피해를 줄이고, 증거를 보존하고, 영향 범위를 좁히고, 사용자 보호 조치를 시작해야 한다.
사고가 의심되면 운영자는 흔히 서버 재시작, 로그 삭제, 계정 일괄 잠금, secret 전체 회전처럼 큰 조치를 떠올린다. 이런 조치는 필요할 수 있지만 순서가 틀리면 증거를 잃거나 정상 사용자 피해를 키운다.
초기 대응은 detect, analyze, contain, eradicate, recover, post-incident로 이어지는 긴 흐름의 시작이다. 첫 기록이 이후 법무, 고객지원, 개발, 운영, 보안팀의 공통 타임라인이 된다.
이 문서의 핵심은 “침착하게 대응한다”가 아니라 “증거 보존과 피해 제한을 동시에 실행할 runbook을 미리 갖춘다”는 것이다.
공격 시나리오
- 관제에서 refresh token 재사용과 여러 계정의 비정상 결제 시도를 감지한다.
- 운영자가 원인을 확인하려고 서버를 재시작해 메모리와 임시 파일 증거를 잃는다.
- 로그를 줄이기 위해 debug log를 삭제하면서 사고 시간대 원본 로그가 사라진다.
- 전체 사용자 세션을 즉시 무효화해 정상 사용자 피해와 고객지원 폭증이 발생한다.
- 유출된 secret이 의심되지만 어떤 서비스가 사용하는지 몰라 rotation이 지연된다.
- 사용자 통지와 내부 보고 기준이 없어 외부 커뮤니케이션이 늦어진다.
취약한 요청/응답 예시
10:02 WARN token_reuse_detected user=1004
10:05 INFO restarted api-1
10:06 INFO cleared old logs
10:08 WARN payment_high_risk user=1004incident note: "이상해서 재시작함. 원인은 나중에 확인."재시작과 로그 삭제가 먼저 이루어져 증거가 줄었다. 누가 어떤 판단으로 어떤 범위를 차단했는지도 남아 있지 않다.
주제별 핵심 판단
- 초기 대응은 증거 보존과 추가 피해 차단을 동시에 한다.
- 모든 조치는 시간, 실행자, 근거, 영향 범위를 남긴다.
- 원본 로그와 snapshot은 별도 보존하고 분석은 사본으로 수행한다.
- containment는 전체 중단보다 영향 범위 기반으로 시작한다.
- secret rotation, session revocation, account lock은 blast radius를 따져 순서화한다.
- 사용자 통지와 법적 보고 필요성은 조직 정책과 관할 요구를 따라 별도 판단한다.
- 사고 종료 후 post-incident review와 재발 방지 backlog가 필요하다.
개선된 요청/응답 예시
level=INFO event=incident_declared result=opened incidentId=SEC-2026-071 actor=oncall:lee severity=high reason=token_reuse_and_payment_attempts startedAt=2026-07-01T10:02:00Z traceId=1b2a9d04level=INFO event=incident_containment_action result=applied incidentId=SEC-2026-071 actor=oncall:lee action=disable_refresh_for_affected_accounts affectedAccounts=18 evidenceSnapshot=s3://evidence/sec-2026-071/10-10 traceId=1b2a9d04사고 대응 자체도 감사 로그다. 어떤 근거로 어떤 범위의 조치를 했는지 나중에 설명할 수 있어야 한다.
방어 설계
- severity 기준과 incident commander 역할을 미리 정한다.
- 증거 보존 checklist를 둔다. access log, application log, DB audit, cloud audit, WAF log, provider log, deployment history를 포함한다.
- 사고 시간대를 UTC 기준으로 고정한다.
- containment option을 준비한다. affected account session revoke, token denylist, feature flag off, rate limit tighten, key rotation, network isolation을 구분한다.
- 조치 전후 영향을 기록한다.
- 사용자 보호 조치와 고객지원 macro를 준비한다.
- 외부 보고와 사용자 통지는 법무/개인정보 담당자와 함께 판단한다.
- 복구 후에는 root cause, detection gap, prevention task, owner, due date를 남긴다.
Spring/HTTP 예시
public void containTokenReuse(IncidentId incidentId, List<MemberId> affectedMembers) {
evidenceService.snapshotLogs(incidentId, affectedMembers, Duration.ofHours(2));
tokenService.revokeRefreshTokens(affectedMembers);
audit.recordIncidentAction(
incidentId,
"revoke_refresh_tokens",
"token_reuse_detected",
affectedMembers.size()
);
}public void addDenyRule(IncidentId incidentId, AbuseRule rule) {
abuseRuleService.enable(rule);
audit.recordIncidentAction(
incidentId,
"enable_abuse_rule",
rule.id(),
rule.estimatedImpact()
);
}초기 대응 코드는 보안팀 전용 도구일 수 있지만, 실제 제품 기능과 연결되는 조치에는 감사 이벤트가 필요하다.
운영 로그와 감사 지점
level=INFO event=evidence_snapshot_created result=allowed incidentId=SEC-2026-071 sources=access,app,db-audit,waf timeRange=2026-07-01T09:00Z/2026-07-01T10:30Z storage=evidence-vault traceId=1b2a9d04level=WARN event=incident_action_failed result=error incidentId=SEC-2026-071 action=rotate_jwt_key reason=dependent_service_not_ready rollback=not_started traceId=1b2a9d04- incident id는 모든 대응 로그에 들어간다.
- 증거 snapshot은 원본 보존과 접근 권한을 분리한다.
- containment action은 affected scope와 expected user impact를 남긴다.
- 실패한 대응 조치도 숨기지 않고 기록한다.
- 사고 대응 중 log level 변경과 feature flag 변경도 감사 대상이다.
실전 판단 기준
- 서버 재시작은 증거를 잃을 수 있으므로 먼저 snapshot 가능성을 본다.
- 전체 세션 무효화는 강력하지만 정상 사용자 영향이 크다.
- secret rotation은 준비 없이 하면 장애를 만들 수 있다.
- 로그 삭제는 사고 대응이 아니라 증거 훼손이 될 수 있다.
- containment는 완벽한 원인 분석을 기다리지 않아도 되지만 근거와 범위를 기록해야 한다.
- 사고 후 회고가 없으면 같은 탐지 실패가 반복된다.
테스트 포인트
- incident id 생성부터 evidence snapshot까지 runbook을 리허설한다.
- affected account만 refresh token revoke하는 절차를 테스트한다.
- feature flag로 고위험 기능을 일시 중지할 수 있는지 확인한다.
- secret rotation emergency runbook이 staging에서 동작하는지 확인한다.
- 사고 대응 조치가 모두 감사 로그로 남는지 확인한다.
- post-incident action item이 owner와 due date를 갖는지 확인한다.
위험 신호!
- 사고 대응 기록이 채팅방에만 남는다.
- 로그 삭제와 서버 재시작이 첫 조치로 되어 있다.
- evidence snapshot 저장소와 일반 로그 저장소 권한이 같다.
- incident commander와 의사결정자가 정해져 있지 않다.
- 전체 사용자 세션 무효화 외의 containment option이 없다.
- 사고 종료 후 재발 방지 task가 만들어지지 않는다.
확인 질문
확인 질문
- 사고 초기 대응에서 가장 먼저 균형 잡아야 하는 두 가지는 무엇인가?
- 증거 보존과 추가 피해 차단이다.
- 모든 대응 조치에 남겨야 하는 정보는 무엇인가?
- incident id, actor, action, reason, affected scope, time, result, traceId다.
- post-incident review의 산출물은 무엇이어야 하는가?
- root cause, detection gap, containment 평가, 재발 방지 task, owner, due date다.