통합 감사 타임라인: 누가 언제 무엇을 왜 했는지 보여주는 스키마와 UI
로그인, 데이터 변경, 워크플로 단계를 아우르는 '누가 언제 무엇을 왜 했는지'를 보여주는 통합 감사 타임라인의 실용적 스키마와 UI 레이아웃을 설계하세요.

통합 감사 타임라인이란(그리고 왜 유용한가)
통합 감사 타임라인은 제품 전반의 이벤트를 시간순으로 읽기 쉽게 모아 보여주는 단일 피드입니다. 여러 도구를 오가며 조사할 필요 없이 무슨 일이 있었는지 한눈에 이해할 수 있게 해 줍니다. 별도의 로그인 로그, 데이터 히스토리 테이블, 워크플로 추적기가 아니라 하나의 장소에서 사건의 흐름을 알려줍니다.
문제가 생겼을 때 팀이 고통을 느끼는 경우가 흔합니다. 고객이 변경을 승인하지 않았다고 주장하거나, 레코드가 “수상하게” 업데이트되거나, 계정이 침해된 것처럼 보일 때가 그렇습니다. 데이터는 존재하지만 여기저기 흩어져 있고 레이블도 다르며, 원시 로그를 설명으로 바꿔줄 작은 세부사항들이 빠져 있는 경우가 많습니다. 조사에 시간이 걸리고 사람들은 추측을 하기 시작합니다.
통합 감사 타임라인은 다섯 가지 질문에 답해야 합니다:
- 누가 했는가(사용자, 서비스, 시스템)
- 무엇을 했는가(행동과 대상)
- 언제 일어났는가(명확한 타임존의 정확한 타임스탬프)
- 어디서 일어났는가(웹, 모바일, API)
- 왜 일어났는가(이유, 요청, 승인)
범위가 중요합니다. 대부분 제품에서는 로그인과 세션, CRUD 데이터 변경, 워크플로 단계(승인·상태 이동 등), 주요 시스템 이벤트(권한 변경이나 접근 실패 시도 등)를 포함하는 것이 좋습니다. 이 항목들을 잘 설명할 수 있다면 일상적인 감사 질문의 대부분을 해결할 수 있습니다.
또한 이것이 아닌 것을 명확히 하는 것이 도움이 됩니다. 통합 감사 타임라인은 완전한 SIEM도 아니고 심층 분석 도구도 아닙니다. 목표는 지원, 보안 검토, 내부 책임을 위해 빠르고 신뢰할 수 있는 답을 제공하는 것입니다.
노코드 플랫폼인 AppMaster 같은 곳에서 앱을 빌드하면 백엔드 로직, UI 액션, 통합이 동일한 이벤트 포맷을 방출할 수 있어 통합 타임라인의 가치는 더 커집니다. 제품의 “이야기”가 누구에게나 일관되게 전달됩니다.
포함할 이벤트: 로그인, 데이터 변경, 워크플로 단계
통합 감사 타임라인은 실제 행동이 발생하는 곳에서 이벤트를 끌어올 때만 작동합니다. 대부분 제품에는 네 가지 주요 소스가 있습니다: 인증(로그인/세션), 데이터 변경(생성·수정·삭제), 워크플로 단계(승인·할당·상태 이동), 통합(웹후크, 임포트, 봇).
작은 이벤트 카테고리 집합을 정의하고 그것을 고수하세요. 카테고리는 구현이 아니라 의도를 설명해야 합니다. 예를 들어 비밀번호 재설정과 API 키 회전은 서로 다른 시스템에서 오더라도 둘 다 접근 관련 이벤트입니다. 사람들이 타임라인을 빠르게 훑어볼 수 있도록 access.login.succeeded 또는 data.customer.updated처럼 일관된 이름을 사용하세요.
모든 것을 감사 대상에 포함할 필요는 없습니다. 실용적인 규칙: 상태를 변경하거나 접근을 변경하거나 비즈니스 결과를 촉발하는 액션을 기록하세요. 페이지 뷰, 자동 저장, 반복되는 백그라운드 재시도 같은 노이즈는 인시던트를 설명하는 데 필요하지 않다면 건너뛰세요.
행위자 유형을 명확히 하여 “누가”를 추측하게 하지 마세요. 타임라인 항목은 해당 행위가 사용자, 관리자, 서비스 계정, 자동화 중 어느 쪽에 의해 발생했는지 분명히 표기해야 합니다.
시작하기에 좋은 간단한 이벤트 그룹:
- 접근(Access): 로그인 성공/실패, 로그아웃, MFA 변경, 비밀번호 재설정
- 데이터(Data): 레코드 생성/수정/삭제, 대량 편집, 내보내기
- 워크플로(Workflow): 상태 변경, 승인/거부, 할당, SLA 위반
- 통합(Integration): 임포트 완료/실패, 웹후크 수신, 외부 동기화
- 관리자/보안(Admin/security): 역할 변경, 권한 변경, API 키 이벤트
앱이 멀티 테넌트라면 모든 이벤트에 테넌트 식별자를 포함하세요. 또한 환경(prod, staging, dev)을 기록해 조사 중에 타임라인을 섞어 쓰지 않도록 하세요.
타임라인을 읽기 쉽게 만드는 최소 데이터 모델
타임라인은 각 줄이 동일한 기본 질문에 답할 때만 통합된 느낌을 줍니다. 시스템별로 로그가 다르면 암호같이 읽기 어려운 기록의 연속이 될 뿐입니다.
모든 이벤트를 하나의 단순한 형태로 표준화하세요. 추가 세부정보는 나중에 저장할 수 있지만, 타임라인에는 항상 일관된 헤드라인이 있어야 합니다.
반드시 포함해야 할 다섯 필드
다음은 세부 패널을 열지 않고도 한 줄을 이해하게 해 주는 최소 필드들입니다:
- event_id: 사람들이 특정 이벤트를 참조할 수 있는 고유하고 안정적인 ID
- timestamp: 발생 시각(가능하면 밀리초 단위)
- actor: 누가 했는지(사용자, 서비스 계정, 자동화 등)
- action + target: 무슨 일이 있었고 대상이 무엇인지(예: “updated” + “Invoice #1042”)
- outcome: 성공/실패(실패 시 짧은 이유 코드 포함)
이것만으로도 타임라인은 읽기 쉬워집니다. 그러나 조사는 보통 단일 라인보다는 이벤트 체인을 포함합니다.
로그를 이야기로 연결하는 세 가지 ID
다음 식별자를 추가하면 화면, API, 백그라운드 작업 전반의 활동을 따라갈 수 있습니다:
- correlation_id: 하나의 사용자 의도에 걸친 여러 단계(클릭 -> 검증 -> 업데이트 -> 알림)를 묶습니다.
- session_id: 로그인 세션에 이벤트를 묶어 계정 공유나 탈취 패턴을 파악합니다.
- request_id (또는 trace_id): 같은 작업 체인으로 API 호출과 백그라운드 잡을 연결합니다.
시간은 마지막 함정입니다. 타임스탬프는 UTC로 저장하고, UI가 로컬 시간을 보여줄 수 있도록 타임존 필드(또는 행위자 로케일)를 함께 보관하세요.
예: 사용자가 “환불 승인”을 클릭하면 타임라인에는 하나의 가시적 작업이 표시될 수 있고, correlation_id가 승인, 상태 변경, 고객에게 보낸 이메일, 자동 지급 단계 등을 하나의 스레드로 묶어 일관된 흐름을 제공합니다.
스키마 제안: 테이블과 필드(실용적 제안)
통합 감사 타임라인은 한 시점당 하나의 이벤트를 저장하고 상세는 그 이벤트에 연결하는 방식이 가장 잘 작동합니다. 핵심 행은 작고 일관되게 유지하고 변경 세부사항은 가변적으로 두세요.
핵심 테이블
대부분의 제품을 커버하는 네 개의 테이블:
- audit_event:
id,tenant_id,occurred_at,event_type(login, data_change, workflow),actor_id,target_type,target_id,summary,ip,user_agent,request_id,correlation_id,why_id(nullable) - audit_actor:
id,tenant_id,actor_type(user, api_key, system),user_id(nullable),display_name,role_snapshot(선택적 JSON) - audit_target(선택사항, 한 이벤트가 여러 대상을 가질 수 있는 경우):
event_id,target_type,target_id,label(예: “Invoice INV-1042”) - audit_change:
event_id,field_path(예:billing.address.city),old_value_json,new_value_json,value_type,redacted(bool)
대상(target)은 단순히 audit_event에 target_type + target_id를 두는 것이 가장 간단한 모델입니다. 하나의 이벤트가 여러 레코드를 건드리면 audit_target을 추가하고 빠른 필터링을 위해 audit_event에 기본 대상을 유지하세요.
값은 audit_change에 필드별로 저장하면 UI가 읽기 쉽고 검색도 편리합니다. 전체 스냅샷이 필요하면 audit_event에 old_record_json과 new_record_json을 선택적으로 추가하되 저장소 관리를 위해 선택적으로 유지하세요.
워크플로 필드
워크플로 단계의 경우 audit_event에 컬럼을 추가하세요(단, event_type='workflow'인 경우에만 채움): workflow_id, step_key, transition_key, from_status, to_status, result(success, blocked).
성능을 유지하는 인덱스
대부분의 화면은 “테넌트의 최근 활동”, “레코드 관련 모든 이벤트”, “사람이 한 모든 활동”을 쿼리합니다. 다음 경로들에 인덱스를 만드세요:
(tenant_id, occurred_at desc)(tenant_id, target_type, target_id, occurred_at desc)(tenant_id, actor_id, occurred_at desc)audit_change에는(event_id)및 필드별 필터가 필요하면(field_path)
“왜”를 캡처하기: 이유, 승인, 맥락
“누가 무엇을 언제”만 보여주는 타임라인은 여전히 가장 어려운 질문인 “왜”를 남깁니다. 이유가 없으면 조사는 추측으로 빠지고 사람들은 채팅 기록이나 오래된 티켓을 뒤지게 됩니다.
이유 코드가 자유 텍스트보다 우수한 경우가 많음
자유 텍스트는 유용하지만 정리가 어렵습니다. 동일한 상황에 대해 사람들이 다른 문구를 쓰거나 아무것도 남기지 않는 일이 발생합니다. 짧고 일관된 reason_code는 깨끗한 필터링을 가능하게 하고, 선택적 reason_text는 필요한 경우 사람의 설명을 더합니다.
다음 항목들을 이벤트(또는 워크플로 전환)에 포함하세요:
reason_code(데이터나 상태를 변경하는 동작에는 필수)reason_text(선택적, 짧고 검토된 문구)
도메인별(청구, 접근, 주문, 지원 등)로 10~30개의 이유 코드를 정의하고 느리게 추가하는 실용적 접근이 좋습니다.
승인과 자동화 맥락
“왜”는 종종 “정책에 의해” 또는 “누군가가 승인해서”라는 의미입니다. 승인 맥락을 구조화된 필드로 캡처하면 다른 시스템을 열지 않고도 빠르게 답할 수 있습니다.
관련 이벤트에 다음 필드를 저장하세요:
approved_by_actor_id및approved_atapproval_rule_id(또는policy_name) 및decision(approved/denied)reference_id(티켓, 케이스, 변경 요청 번호)automation_rule_name및rule_versionautomation_inputs(안전한 최소 파라미터, 예:threshold=5000)
주의: “왜” 필드는 비밀이 유출되기 쉬운 곳입니다. 비밀번호, API 키, 전체 세션 토큰, 고객 결제 상세 같은 민감한 값을 reason_text나 automation_inputs에 저장하지 마세요. 민감하면 마스킹(예: 마지막 4자리만)하거나 token_present=true 같은 포인터로 대체하세요.
예: 환불 한도가 500에서 5000으로 증가한 경우 타임라인은 “Limit changed from 500 to 5000”라고 읽히고, reason_code=RISK_REVIEW, approved_by=Maria, policy=RefundLimitPolicy v3, reference_id=CASE-18422, automation_rule_name은 빈 값(수동)으로 기록되어 단일 항목만으로 결정 배경을 설명합니다.
UI 레이아웃: 질문에 빠르게 답하는 한 화면
좋은 통합 감사 타임라인은 검색 결과, 이야기, 영수증의 느낌을 모두 줍니다. 목표는 속도입니다: 10초 안에 무슨 일이 있었는지 파악하고, 한 줄을 열면 행동할 충분한 맥락을 얻어야 합니다.
단순한 3-패널 레이아웃
화면을 좌측 필터 패널, 중앙 타임라인 목록, 우측 세부 드로어(또는 슬라이드 오버 패널)로 구성하세요. 목록은 항상 보이게 해 세부를 검사해도 위치를 잃지 않도록 합니다.
필터는 적지만 유용하게 유지하세요. 인시던트나 지원 통화 중 사람들이 자주 찾는 것들부터 시작합니다:
- 날짜 범위(지난 1시간, 지난 24시간 같은 빠른 프리셋)
- 행위자(사용자, API 키, 시스템)
- 대상(레코드, 객체 타입, 워크플로 인스턴스)
- 이벤트 타입(로그인, 업데이트, 승인, 내보내기)
- 결과(성공, 실패, 거부)
중앙 목록의 각 행은 아무것도 열지 않고도 “누가 무엇을 언제 왜”를 답해야 합니다. 타임스탬프(타임존 포함), 행위자 이름(관련 시 역할 포함), 동사, 대상 레이블, 짧은 이유 스니펫을 포함하세요. 이유가 없으면 빈칸을 두지 말고 “이유 미제공” 같은 명확한 플레이스홀더를 표시하세요.
세부 드로어: 증거 제시
세부 보기에서는 신뢰를 쌓아야 합니다. 로그인에는 행위자의 IP와 디바이스를, 데이터 편집에는 정확한 필드 변경 내역(전/후 값)을, 승인에는 워크플로 단계·담당자·결정을 보여 주세요.
페이로드 위에 컴팩트한 “관련 이벤트” 스트립을 추가해 “요청 생성” -> “매니저 승인” -> “결제 실패” 같은 인접 단계를 바로 이동할 수 있게 하세요. 감사자와 엔지니어를 위해 원시 페이로드 토글을 제공하되 기본적으로는 숨기세요.
실패 상태는 명확히 표시하세요. 거부나 실패 결과는 눈에 띄는 스타일을 사용하고 “권한 거부” 또는 “검증 실패” 같은 메시지를 보여줘 사용자가 추측하지 않게 하세요.
단계별: 실제 제품에서 어떻게 구현할지
감사 타임라인을 로그 더미가 아니라 제품 기능으로 취급하세요. 지원과 컴플라이언스가 “누가 무엇을 언제 왜”를 1분 이내에 답하지 못하면 재검토가 필요합니다.
일반적으로 유효한 빌드 순서:
- 먼저 작은 이벤트 분류법과 필수 필드를 정의하세요. 어떤 것이 이벤트인지, 그리고 반드시 있어야 할 필드(actor, time, action, object, outcome, correlation ID)를 고정하세요.
- 이미 진실을 알고 있는 소스들을 계측하세요. 인증은 로그인과 토큰 이벤트를, CRUD 레이어는 변경된 필드를 포함한 생성/수정/삭제를, 워크플로 엔진은 단계와 결정 이벤트를 방출해야 합니다.
- 이벤트를 append-only 감사 저장소에 기록하세요. 감사 행을 업데이트하지 마세요. 쓰기 시에 엄격하게 검증(행위자 누락, 대상 ID 누락, 잘못된 타임스탬프 등)하여 나중에 “고치겠다”고 데이터 신뢰를 잃지 마세요.
- 사람들이 조사하는 방식에 맞춘 읽기 경로를 만드세요. 보통 세 가지 뷰가 필요합니다: 메인 타임라인, 이벤트 세부 패널, 관련 이벤트 쿼리(같은 correlation ID, 같은 객체, 같은 행위자, 같은 세션).
- 역할 기반 접근을 추가하고 지원팀처럼 테스트하세요. 감사 데이터에는 종종 민감한 필드가 포함되므로 역할에 따라 필터링하고 값은 마스킹하세요.
AppMaster에서 이걸 빌드한다면 Data Designer에 감사 테이블을 모델링하고, 의사결정이 일어나는 지점에서 Business Process Editor로 이벤트를 발행하며, UI 빌더로 타임라인과 세부를 나란히 렌더링하는 것이 깔끔한 접근입니다.
완료 선언 전에 실제 시나리오로 테스트하세요: 매니저가 주문 총액이 변경되었다고 보고하면 지원은 정확한 필드 변경, 사용자와 IP, 이를 유발한 워크플로 단계, 그리고 명시된 이유(또는 “없음”)를 여러 화면을 오가지 않고 볼 수 있어야 합니다.
타임라인을 쓸모없게 만드는 흔한 실수들
통합 감사 타임라인은 사람들이 신뢰하고 빠르게 읽을 수 있어야만 작동합니다. 대부분의 실패는 예측 가능한 이유로 발생합니다.
과도한 로깅은 첫 번째 문제입니다. 모든 페이지 뷰, 호버, 자동 저장이 이벤트로 기록되면 중요한 순간들이 묻힙니다. 고부하의 기술 로그가 필요하면 별도로 보관하고 내부적으로 이벤트 ID로 연결하세요.
과소 로깅도 마찬가지로 나쁩니다. “Record updated”라고만 기록되고 행위자나 대상, 명확한 결과가 없으면 아무도 도움을 받을 수 없습니다. 모든 이벤트에는 누가, 무엇에 대해, 언제, 무엇이 바뀌었는지 포함되어야 합니다. 제품이 이유를 묻거나 승인을 요구한다면 그 맥락은 별도 시스템에 숨기지 말고 이벤트에 저장하세요.
변경 가능한 로그는 신뢰를 무너뜨립니다. 관리자가 감사 이벤트를 수정하거나 삭제할 수 있다면 더 이상 감사 추적이 아니라 노트가 됩니다. 감사 이벤트는 append-only로 취급하세요. 잘못 기록되었다면 원본을 수정하지 말고 원본을 참조하는 보정 이벤트를 작성하세요.
일관성 없는 동사는 필터링과 스캔을 힘들게 합니다. 같은 행동에 대해 “Updated”, “Changed”, “Edited”를 따로 두지 마세요. 작은 동사 집합(예: created, updated, deleted, approved, rejected, logged_in, permission_changed)을 정하고 준수하세요.
마지막으로 민감한 데이터를 유출하지 마세요. 원시 diff에는 종종 비밀번호, 토큰, 개인 데이터, 결제 정보가 포함됩니다. 필요한 것만 저장하고 민감한 필드는 마스킹하며, 누가 어떤 이벤트 세부를 볼 수 있는지 권한을 제한하세요. 예: “전화번호 변경”은 보여주되 전/후 값을 보려면 특정 권한이 필요하게 하세요.
출시 전 빠른 체크리스트
지원 담당자와 보안 검토자가 하는 방식으로 타임라인을 테스트하세요. 민감한 레코드(예: 고객 지급 설정)를 하나 골라 타임라인 화면만으로 무슨 일이 있었는지 설명할 수 있는지 확인하세요.
검증할 질문들:
- 항상 행위자를 명명할 수 있나? 민감한 레코드의 경우 “누가 수행했는가”(사용자, 서비스 계정, 시스템)와 역할, 인증 방법(비밀번호, SSO, API 키)을 보여 주세요.
- 무엇이 바뀌었는지 증명할 수 있나? 핵심 필드에 대해 전후 값을 보여 주세요. 값이 너무 민감하면 마스킹된 버전과 변경이 발생했음을 증명할 해시를 함께 보여 주세요.
- 한 행동을 끝까지 추적할 수 있나?
correlation_id가 로그인, UI 동작, 워크플로 단계, 데이터베이스 쓰기를 하나의 스레드로 묶는지 확인하세요. - 지원이 올바른 이벤트를 빠르게 찾을 수 있나? 행위자, 대상(레코드 타입 및 ID), 시간 범위, 결과(성공, 실패, 거부)로 필터가 작동하는지 확인하세요.
- 감사 접근은 통제되고 내보내기는 감시되는가? 누가 감사 데이터를 보고 내보낼 수 있는지 제한하고, 모든 보기/내보내기를 별도의 이벤트(누가, 언제, 무엇을 내보냈는지)로 기록하세요.
간단한 최종 테스트: 타임라인을 만든 사람이 아닌 사람에게 건네고 “왜 이 레코드가 3:12 PM에 변경되었나?”라고 물어보세요. 60초 안에 답하지 못하면 더 많은 맥락 필드(reason, request ID, approval, error details 등)가 필요합니다.
예: 의심스러운 변경을 몇 분 안에 조사하기
지원 매니저가 연락합니다: “Acme Corp의 고객 레코드가 잘못된 것 같습니다. 청구 이메일이 바뀌었는데 고객 측에서 아무도 변경하지 않았대요.” 고객 ID로 타임라인을 검색하면 연관된 모든 이벤트가 correlation_id로 묶여 있어 명확한 흐름을 볼 수 있습니다.
먼저 로그인 이벤트가 보입니다: **Sam(영업 담당)**이 09:12에 새로운 디바이스와 평소와 다른 위치에서 로그인했습니다. 세션 블록에는 IP, 유저 에이전트, MFA 상태가 포함됩니다. 2분 뒤에 “레코드 조회”가 있고 이어서 “레코드 편집”이 있습니다.
레코드 업데이트 이벤트는 읽기 쉽습니다. 정확한 필드 변경(청구 이메일의 전/후 값)과 출처(웹 앱)를 나열합니다. 바로 아래에 reason_code로 Customer requested update가 보이지만 메모는 비어 있습니다.
다음으로 워크플로 항목이 무엇이 일어났는지 설명합니다. 자동화 규칙이 실행되어 “청구 이메일이 바뀌면 재무팀에 알리고 승인을 요구”했습니다. 타임라인에는 승인 대기 단계가 있고, 최종적으로 09:18에 **Dana(팀장)**가 “티켓 #4812에 따라 승인”이라는 짧은 메모와 함께 승인한 기록이 있습니다.
지원은 추측 없이 사건을 해결할 수 있습니다:
- 행위자 확인: Sam의 로그인이 수상(새 디바이스, 메모 없음)이므로 해당 세션의 소유 여부를 확인합니다.
- 의도 확인: Dana의 승인 메모에 티켓이 언급되어 있는데 그 티켓이 실제로 존재하지 않으면 경고 신호입니다.
- 안전한 복원: 의심되는 계정 남용으로 판단되면 이전 이메일로 되돌리는 보정 업데이트 이벤트를 작성하고 이유를 필수로 기록합니다(예: “의심스러운 계정 오용으로 복원”).
- 결과 문서화: 같은
correlation_id로 케이스 노트를 추가해 이후 검토자가 전체 흐름을 볼 수 있게 합니다.
다음 단계: 안전하게 롤아웃하고 유지관리하기
사람들이 신뢰해야만 통합 감사 타임라인이 유용합니다. 첫 릴리스는 부가 기능이 아니라 안전 시스템으로 취급하세요.
보존 기간, 검색 속도, 비용에 대한 명확한 목표를 세우세요. 많은 팀은 단순한 접근을 사용합니다: 90일은 “핫”(빠른 검색), 1~2년은 “웜”(느린 검색), 그 이상은 아카이브.
"빠름"의 기준을 출시 전에 정의하세요. 예를 들어 일반 레코드에 대해 타임라인이 2초 이내에 열려야 한다면 (target_type, target_id, occurred_at)로 인덱스하고 페이로드를 작게 유지하며 오래된 행은 아카이브로 옮기세요.
뷰를 깔끔하게 유지하고 데이터 일관성을 지키려면 작게 단계적으로 롤아웃하세요:
- 실제 조사를 커버하는 5~8개의 이벤트 타입으로 UI 프로토타입을 만드세요.
- 이벤트 볼륨을 늘리기 전에 보존 및 아카이빙 규칙을 추가하세요.
- 기본 검색과 필터(actor, 날짜 범위, 이벤트 타입)를 추가하세요.
- 실제 케이스로 검증하세요: “지원이 이것을 누가 왜 변경했는지 답할 수 있나?”
- 핵심 뷰가 신뢰받을 때만 이벤트 타입을 확장하세요.
내보내기와 보고 기능은 유혹적이지만 실수를 증폭시킬 수 있습니다. 화면상의 타임라인이 신뢰할 수 있고 이벤트 이름과 맥락이 안정화된 후에 내보내기를 추가하세요. 내보내기에는 타임존, 사용된 필터, 변조 증거가 되는 식별자(예: export ID)를 포함하세요.
권한을 일찍 설계하세요. 감사 데이터는 종종 민감한 세부를 포함합니다:
- 타임라인 보기(레코드를 다루는 대부분 직원)
- 내보내기(리드 또는 컴플라이언스에 제한)
- 원시 페이로드 보기(보안, 엔지니어링, 관리자만)
- 보존 정책 관리(관리자 전용)
AppMaster에서 빌드한다면 Data Designer에 스키마를 매핑하고 Business Processes에서 주요 결정 지점에서 이벤트를 발행하면 웹/모바일 전반에서 "누가 무엇을 언제 왜"가 일관되게 유지되어 워크플로 변화에도 관리하기 쉽습니다.
자주 묻는 질문
통합 감사 타임라인은 제품 전반의 중요한 이벤트를 시간순으로 나열한 단일 피드입니다. 인증 로그, 데이터 변경 이력, 워크플로 도구를 여기저기 찾을 필요 없이 누가 무엇을 언제 어디서 왜 했는지 빠르게 조사할 수 있게 합니다.
상태를 변경하거나 접근을 변경하거나 비즈니스 결과를 촉발하는 액션을 우선적으로 기록하세요. 보통 로그인/세션, 생성·수정·삭제 같은 CRUD 변경, 승인·상태 전환 같은 워크플로 단계, 역할이나 API 키 같은 관리자/보안 변경을 먼저 포함합니다.
일관된 이벤트 형식을 유지하세요: event_id, timestamp, actor, action + target, outcome이 최소형입니다. 여기에 correlation_id, session_id, request_id 같은 식별자를 추가하면 UI, API, 백그라운드 작업 전반에서 하나의 작업을 끝까지 추적할 수 있습니다.
의도를 설명하는 안정적인 이름을 사용하세요. 구현 세부사항이 아닌 목적을 드러내는 네이밍이 좋습니다. 예: access.login.succeeded, data.customer.updated 같은 작은 분류법으로 스캔과 필터링이 쉬워집니다.
정렬과 일관성을 위해 타임스탬프는 UTC로 저장하세요. UI에서는 로컬 시간으로 변환해 보여주고, 표시된 시간을 이해할 수 있게 타임존 필드(또는 행위자 로케일)를 함께 보관하세요.
자유 텍스트는 유용하지만 일관성이 떨어집니다. 변경을 유발하는 경우에는 필수 reason_code를 사용하고, 추가로 사람이 이해할 짧은 reason_text를 선택적으로 저장하세요. 승인이나 정책 관련이면 승인자, 결정 시각, 참조 ID를 함께 저장하면 항목 하나만으로 맥락을 제공합니다.
기본 원칙은 append-only입니다: 감사 이벤트를 편집하거나 삭제하지 마세요. 기록이 잘못되면 원본을 수정하지 말고 원본 이벤트를 참조하는 새로운 보정 이벤트를 작성해 무엇이 왜 수정되었는지 남기세요.
좌측에 필터, 중앙에 타임라인 목록, 우측에 세부 정보 창을 둔 단순한 3-영역 레이아웃을 추천합니다. 목록은 한눈에 “누가/무엇을/언제/왜”를 답해야 하고, 세부 창은 IP·디바이스·변경 전후 값 같은 증거를 보여줘야 합니다.
과도한 로깅은 핵심 이벤트를 묻어버리고, 과소 로깅은 모호한 항목을 만듭니다. 흔히 실패하는 다른 원인은 일관성 없는 동사 사용, 상관 ID 누락, 그리고 변경 내역에 민감한 데이터가 노출되는 경우입니다.
AppMaster에서는 Data Designer에 감사 테이블을 모델링하고, Business Process Editor에서 주요 결정 지점에 이벤트를 발행하며, 웹/모바일 빌더로 타임라인 UI를 구성하면 많은 코드를 쓰지 않고도 구현할 수 있습니다. 일관된 이벤트 포맷이 특히 유용합니다.


