From db2c191dd692a234f8b6c368e906309f514d6abb Mon Sep 17 00:00:00 2001 From: "gayoun.park" Date: Thu, 22 Jan 2026 20:57:47 +0900 Subject: [PATCH] =?UTF-8?q?=EB=A1=9C=EA=B7=B8=20=EC=A0=81=EC=9E=AC=20?= =?UTF-8?q?=EB=B0=A9=EC=8B=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/FileDownloadInteceptor.java | 5 +++- .../config/api/ApiResponseAdvice.java | 30 ++++++++++++++----- .../postgres/entity/AuditLogEntity.java | 24 +++++++++++++-- 3 files changed, 48 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/kamco/cd/kamcoback/config/FileDownloadInteceptor.java b/src/main/java/com/kamco/cd/kamcoback/config/FileDownloadInteceptor.java index 506d6477..c800c690 100644 --- a/src/main/java/com/kamco/cd/kamcoback/config/FileDownloadInteceptor.java +++ b/src/main/java/com/kamco/cd/kamcoback/config/FileDownloadInteceptor.java @@ -2,6 +2,7 @@ package com.kamco.cd.kamcoback.config; import com.fasterxml.jackson.databind.ObjectMapper; import com.kamco.cd.kamcoback.auth.CustomUserDetails; +import com.kamco.cd.kamcoback.common.utils.HeaderUtil; import com.kamco.cd.kamcoback.config.api.ApiLogFunction; import com.kamco.cd.kamcoback.menu.dto.MenuDto; import com.kamco.cd.kamcoback.menu.service.MenuService; @@ -13,6 +14,7 @@ import java.util.Comparator; import java.util.LinkedHashMap; import java.util.List; import java.util.Objects; +import java.util.UUID; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -74,7 +76,8 @@ public class FileDownloadInteceptor implements HandlerInterceptor { request.getRequestURI(), Objects.requireNonNull(basic).getMenuUid(), ip, - response.getStatus()); + response.getStatus(), + UUID.fromString(HeaderUtil.get(request, "kamco-download-uuid"))); auditLogRepository.save(log); } diff --git a/src/main/java/com/kamco/cd/kamcoback/config/api/ApiResponseAdvice.java b/src/main/java/com/kamco/cd/kamcoback/config/api/ApiResponseAdvice.java index 41076e3f..1dfb2669 100644 --- a/src/main/java/com/kamco/cd/kamcoback/config/api/ApiResponseAdvice.java +++ b/src/main/java/com/kamco/cd/kamcoback/config/api/ApiResponseAdvice.java @@ -2,6 +2,8 @@ package com.kamco.cd.kamcoback.config.api; import com.fasterxml.jackson.databind.ObjectMapper; import com.kamco.cd.kamcoback.auth.CustomUserDetails; +import com.kamco.cd.kamcoback.common.utils.HeaderUtil; +import com.kamco.cd.kamcoback.log.dto.EventType; import com.kamco.cd.kamcoback.menu.dto.MenuDto; import com.kamco.cd.kamcoback.menu.service.MenuService; import com.kamco.cd.kamcoback.postgres.entity.AuditLogEntity; @@ -66,12 +68,24 @@ public class ApiResponseAdvice implements ResponseBodyAdvice { if (body instanceof ApiResponseDto apiResponse) { response.setStatusCode(apiResponse.getHttpStatus()); - String ip = ApiLogFunction.getXFowardedForIp(servletRequest); - Long userid = null; + String actionType = HeaderUtil.get(servletRequest, "kamco-action-type"); + if (actionType == null) { // actionType 이 없으면 로그 저장하지 않기 + return body; + } - if (servletRequest.getUserPrincipal() instanceof UsernamePasswordAuthenticationToken auth - && auth.getPrincipal() instanceof CustomUserDetails customUserDetails) { - userid = customUserDetails.getMember().getId(); + String ip = ApiLogFunction.getXFowardedForIp(servletRequest); + // String ip = HeaderUtil.get(servletRequest, "kamco-user-ip"); + Long userid = null; + String loginAttemptId = null; + + // 로그인 시도할 때 + if (servletRequest.getRequestURI().contains("/api/auth/signin")) { + loginAttemptId = HeaderUtil.get(servletRequest, "kamco-login-attempt-id"); + } else { + if (servletRequest.getUserPrincipal() instanceof UsernamePasswordAuthenticationToken auth + && auth.getPrincipal() instanceof CustomUserDetails customUserDetails) { + userid = customUserDetails.getMember().getId(); + } } String requestBody; @@ -107,13 +121,15 @@ public class ApiResponseAdvice implements ResponseBodyAdvice { AuditLogEntity log = new AuditLogEntity( userid, - ApiLogFunction.getEventType(servletRequest), + EventType.fromName(actionType), ApiLogFunction.isSuccessFail(apiResponse), ApiLogFunction.getUriMenuInfo(result, servletRequest.getRequestURI()), ip, servletRequest.getRequestURI(), ApiLogFunction.cutRequestBody(requestBody), - apiResponse.getErrorLogUid()); + apiResponse.getErrorLogUid(), + null, + loginAttemptId); auditLogRepository.save(log); } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/entity/AuditLogEntity.java b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/AuditLogEntity.java index c786d59c..d6c56934 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/entity/AuditLogEntity.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/AuditLogEntity.java @@ -12,6 +12,7 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.Table; +import java.util.UUID; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; @@ -51,6 +52,12 @@ public class AuditLogEntity extends CommonCreateEntity { @Column(name = "error_log_uid") private Long errorLogUid; + @Column(name = "download_uuid") + private UUID downloadUuid; + + @Column(name = "login_attempt_id") + private String loginAttemptId; + public AuditLogEntity( Long userUid, EventType eventType, @@ -59,7 +66,9 @@ public class AuditLogEntity extends CommonCreateEntity { String ipAddress, String requestUri, String requestBody, - Long errorLogUid) { + Long errorLogUid, + UUID downloadUuid, + String loginAttemptId) { this.userUid = userUid; this.eventType = eventType; this.eventStatus = eventStatus; @@ -68,11 +77,18 @@ public class AuditLogEntity extends CommonCreateEntity { this.requestUri = requestUri; this.requestBody = requestBody; this.errorLogUid = errorLogUid; + this.downloadUuid = downloadUuid; + this.loginAttemptId = loginAttemptId; } /** 파일 다운로드 이력 생성 */ public static AuditLogEntity forFileDownload( - Long userId, String requestUri, String menuUid, String ip, int httpStatus) { + Long userId, + String requestUri, + String menuUid, + String ip, + int httpStatus, + UUID downloadUuid) { return new AuditLogEntity( userId, @@ -82,7 +98,9 @@ public class AuditLogEntity extends CommonCreateEntity { ip, requestUri, null, // requestBody 없음 - null // errorLogUid 없음 + null, // errorLogUid 없음 + downloadUuid, + null // loginAttemptId 없음 ); }