From 329fbf159280dfc2f704a4ba21ee87d30d8d623d Mon Sep 17 00:00:00 2001 From: taekyoungc Date: Mon, 29 Jun 2026 19:11:38 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8/=EC=84=B8?= =?UTF-8?q?=EC=85=98=20=EA=B0=B1=EC=8B=A0=EB=A7=8C=20=EC=9E=88=EB=8A=94=20?= =?UTF-8?q?member=20=EC=88=98=EC=A0=95=EC=9D=80=20=ED=99=9C=EB=8F=99=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=20=EC=A0=9C=EC=99=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 페이지 접속·로그인 시 세션토큰/접속시각 갱신이 '로그인'으로 잔뜩 기록되던 노이즈 제거. Auditable에 auditSkipUpdateOnlyFields 추가, MemberModel에서 세션/로그인 필드 지정. (로그인 자체는 '로그인 이력'에서 별도 확인) Co-Authored-By: Claude Opus 4.8 --- app/Models/MemberModel.php | 3 +++ app/Models/Traits/Auditable.php | 17 +++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/app/Models/MemberModel.php b/app/Models/MemberModel.php index aef5ad0..73242c5 100644 --- a/app/Models/MemberModel.php +++ b/app/Models/MemberModel.php @@ -8,6 +8,9 @@ class MemberModel extends Model { use \App\Models\Traits\Auditable; + /** 로그인/세션 갱신만 있는 update는 활동 로그에 남기지 않음(로그인 이력은 별도 기록) */ + protected array $auditSkipUpdateOnlyFields = ['mb_latestdate', 'mb_login_fail_count', 'mb_locked_until', 'mb_session_token']; + protected $table = 'member'; protected $primaryKey = 'mb_idx'; protected $returnType = 'object'; diff --git a/app/Models/Traits/Auditable.php b/app/Models/Traits/Auditable.php index 9fc9e57..3c4800b 100644 --- a/app/Models/Traits/Auditable.php +++ b/app/Models/Traits/Auditable.php @@ -38,6 +38,13 @@ trait Auditable /** 마스킹 대상 필드명 */ protected array $auditMaskFields = ['mb_passwd', 'mb_totp_secret', 'mb_session_token', 'mb_email', 'mb_phone']; + /** + * 이 필드들'만' 변경된 update는 활동 로그를 남기지 않는다. + * (예: 로그인/세션 갱신 같은 시스템 내부 변경 — 노이즈 제거) + * 모델에서 재정의해 사용. + */ + protected array $auditSkipUpdateOnlyFields = []; + private function auditMask(?array $row): ?array { if ($row === null) { @@ -98,6 +105,16 @@ trait Auditable $ids = $eventData['id'] ?? null; $changes = is_array($eventData['data'] ?? null) ? $eventData['data'] : []; + // 지정 필드만 변경된 경우(로그인/세션 갱신 등) → 기록 생략 + if ($this->auditSkipUpdateOnlyFields !== [] && $changes !== []) { + $changedKeys = array_values(array_diff(array_keys($changes), [$this->primaryKey])); + if ($changedKeys !== [] && array_diff($changedKeys, $this->auditSkipUpdateOnlyFields) === []) { + $this->auditBeforeRows = []; + + return $eventData; + } + } + if ($ids !== null) { foreach ((array) $ids as $one) { $before = $this->auditBeforeRows[(string) $one] ?? null;