Audit 모듈
이 문서는 검토 중입니다. 내용이 변경될 수 있습니다.
관리 표면의 권한·모델 변경·커스텀 액션을 정책에 따라 자동 기록하고 준수 상태를 점검하는 감사 로그 Core 모듈입니다.
개요
Audit 모듈은 모델의 CRUD 작업을 자동으로 추적하여 감사 로그를 생성합니다. 관리 Resource에 등록된 모델은 기본적으로 자동 편입되며, 관리 표면 밖의 모델은 Auditable Trait으로 명시 편입할 수 있습니다.
┌─────────────────────────────────────────────────────────────┐
│ Audit 모듈 │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Model (관리 Resource 자동 편입 / Auditable Trait) │ │
│ │ │ │
│ │ create() ──┐ │ │
│ │ update() ──┼──► AuditObserver ──► AuditLog │ │
│ │ delete() ──┘ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 기록 정보: │
│ • 이벤트 (created, updated, deleted) │
│ • 변경 전/후 값 │
│ • 실행 사용자, 테넌트, IP, URL │
└─────────────────────────────────────────────────────────────┘
핵심 컴포넌트
| 컴포넌트 | 역할 |
|---|---|
Auditable | 모델에 적용하는 Trait |
AuditableInterface | Auditable 모델 계약 |
AuditObserver | 모델 이벤트 감지 및 로그 생성 |
AuditLog | 감사 로그 저장 모델 |
AdminSurfaceRegistry | 등록된 관리 Resource·모델·권한 게이트 인벤토리 |
AutoAuditRegistrar | 관리 표면 모델 자동 감사 편입, 이중 기록 방지 |
AuditPolicyResolver | 프로젝트·독립사이트별 기록 강도 해석 |
관리 표면 자동 거버넌스
Filament 관리 Resource를 등록하면 모델은 CORE_AUDIT_AUTO_ENROLL=true(기본값)에서 자동으로 감사 대상이 됩니다. 이미 Auditable 또 는 플러그인 전용 이력으로 기록하는 모델은 한 번만 기록합니다.
관리 Resource의 권한 계약도 같은 인벤토리에서 확인합니다.
- 표준:
BaseAdminResource상속 또는HasFeaturePermissionCheck사용 - 프로젝트 고유 복합 게이트: 비어 있지 않은
adminSurfaceGateExceptionReason()으로 사유 명시 - 모델 감사 제외:
auditExempt(): ?string으로 사유 명시 - 액션 감사 제외:
->auditExempt('사유')
빈 사유나 사람만 읽을 수 있는 주석은 예외 계약으로 인정하지 않습니다. 모델 제외 사유가 비어 있거나 호출에 실패하면 진단은 실패하되 감사 기록은 계속합니다.
기록 정책
| 정책 | 모델 CUD | 커스텀 액션 | 단건 열람 |
|---|---|---|---|
minimal | ✅ | — | — |
standard(기본) | ✅ | ✅ | 기본 Platform 패널 |
strict | ✅ | ✅ | 모든 관리 패널 |
독립사이트의 settings.security.audit.level이 프로젝트의 CORE_AUDIT_POLICY보다 우선하며, 미설정이면 상위 SaaS 설정과 프로젝트 기본값을 차례로 상속합니 다. 표준 CRUD Action은 모델 이벤트와 중복되므로 액션 자동 기록에서 제외합니다. 관리 커스텀 액션은 정상 실행이 끝난 뒤에만 기록됩니다.
배포 전 준수 점검
php artisan admin-surface:audit
| 종료 코드 | 의미 |
|---|---|
0 | 권한 게이트·감사 편입 준수 |
1 | 무가드 Resource, 미편입 모델 또는 사유 없는 opt-out 발견 |
2 | Filament 관리 표면 인벤토리 미가용 |
이 명령은 읽기 전용입니다. 별도 파일 캐시를 만들지 않으며 admin-surface:cache 명령도 없습니다. 기존 프로젝트가 비표준 Resource의 사유를 주석으로만 남겼다면 adminSurfaceGateExceptionReason()으로 이관할 때까지 1이 나올 수 있습니다.
감사 저장 실패는 관리 업무를 막지 않습니다. 대신 동일 원인을 기본 10분 동안 묶어 Platform 임계 알림으로 전송하며, 알림 경로의 재귀 실패도 차단합니다.
Auditable Trait 적용
기본 사용법
<?php
namespace App\Models;
use App\Core\Base\Audit\Contracts\AuditableInterface;
use App\Core\Base\Audit\Traits\Auditable;
use Illuminate\Database\Eloquent\Model;
class Product extends Model implements AuditableInterface
{
use Auditable;
protected $fillable = [
'name',
'price',
'description',
];
}
적용 즉시 동작
// 생성 → created 이벤트 기록
$product = Product::create([
'name' => 'New Product',
'price' => 10000,
]);
// 수정 → updated 이벤트 기록 (변경된 필드만)
$product->update(['price' => 15000]);
// 삭제 → deleted 이벤트 기록
$product->delete();