Skip to content

[Refactor][Audit] 감사 기록·조회 경계 점진 이관 #306

Description

@HyungminYoon1

작업 설명

ADR-0022의 점진적 헥사고널 아키텍처 원칙에 따라 현재 분산된 audit 기록·조회 경계를 단계적으로 정리합니다. nodease/mbased#304은 사용자 관리에 필요한 최소한의 transaction-bound audit recorder와 safe read model만 도입하며, 이 이슈는 그 밖의 기존 audit 경로를 후속 정리합니다.

배경

현재 audit 경로에는 다음 형태가 공존합니다.

  • DB mutation과 같은 transaction에 AuditLog row를 추가하는 동기 경로
  • DB commit 이후 Celery task로 발행하는 비동기 경로
  • ORM listener 기반 data-change audit
  • Gateway service/router가 직접 audit payload를 구성하는 경로
  • Admin audit 조회와 domain mutation이 서로 다른 sanitization/read model을 사용하는 경로

이 공존 자체는 과도기 예외로 허용되지만, 보안·운영 mutation에서 audit 발행 실패가 성공 응답 뒤 누락으로 이어지거나 같은 mutation이 중복 기록될 수 있습니다.

상세 작업

  • 기존 audit producer와 action별 transaction 특성을 inventory로 정리합니다.
  • application use case가 의존할 AuditRecorder 또는 durable outbox port 계약을 확정합니다.
  • SQLAlchemy transaction-bound audit adapter와 필요 시 outbox adapter 책임을 분리합니다.
  • 동기 audit, Celery audit, ORM listener의 중복 방지 규칙을 정리합니다.
  • 기존 permission/workflow/LLM/Knowledge/organization mutation을 위험도 순으로 점진 이관합니다.
  • audit query repository와 safe detail read model을 application/adapter 경계로 분리합니다.
  • actor, target, reason, before/after에 target별 allowlist sanitization을 적용합니다.
  • retry, idempotency, dead-letter, 운영 가시성 정책을 정의합니다.
  • audit/tracing 공식 문서와 ADR을 갱신합니다.
  • unit/API/integration 테스트와 coverage baseline을 추가합니다.

범위 제외

완료 조건

  • 신규 보안 mutation은 audit/outbox 기록 실패 시 성공 처리되지 않습니다.
  • 이관된 mutation은 canonical audit을 정확히 한 번 기록합니다.
  • audit 상세 응답은 raw secret, raw payload, hidden resource를 노출하지 않습니다.
  • 기존 API status/response 계약은 명시적 문서 변경 없이 바뀌지 않습니다.
  • 관련 테스트와 공식 문서가 구현과 일치합니다.

2026-07-16 Permission audit 원자성 반영

최신 origin/dev @ 977d37f0의 일부 Team/User Workflow·LLM permission mutation은 DB commit 뒤 best-effort audit를 호출한다. 권한 변경 성공과 필수 감사 증거가 분리되는 실제 보안 결함이므로 우선순위를 High로 올린다.

  • nodease/mbased#472를 P1 하위 이슈로 두고 permission mutation과 canonical audit insert를 같은 UoW/transaction으로 이관한다.
  • 이 경계의 필수 audit는 실패를 삼키는 비동기 로깅으로 대체하지 않는다.
  • Log System의 eventual projection 구조 개선은 nodease/mbased#479로 분리한다.

2026-07-17 취소 및 분해 기록

이 이슈는 단일 PR로 구현하기에 범위가 지나치게 넓어 Canceled 상태를 유지한다. 취소는 audit 개선을 포기한다는 의미가 아니라, 현재 구현 가능한 독립 경계로 분해했다는 의미다.

분해된 구현 경로

PR #490에는 이 umbrella를 자동 종료하는 Linear closing reference가 없으므로 이 기록을 구현 추적의 연결점으로 사용한다. 앞으로의 변경은 위 하위 이슈에서 진행하고 nodease/mbased#306를 다시 열거나 동일 범위의 새 umbrella 구현 PR을 만들지 않는다.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Fields

    Priority

    None yet

    Projects

    Status
    Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions