diff --git a/build.gradle b/build.gradle index bab46ea..dcf2ba6 100644 --- a/build.gradle +++ b/build.gradle @@ -171,7 +171,7 @@ asciidoctor { } -def querydslDir = "src/main/generated" +def querydslDir = "$buildDir/main/generated" sourceSets { main.java.srcDirs += [ querydslDir ] diff --git a/src/main/java/site/billingwise/api/serverapi/global/log/HttpLogMessage.java b/src/main/java/site/billingwise/api/serverapi/global/log/ApiLogMessage.java similarity index 77% rename from src/main/java/site/billingwise/api/serverapi/global/log/HttpLogMessage.java rename to src/main/java/site/billingwise/api/serverapi/global/log/ApiLogMessage.java index 079e066..1a3db48 100644 --- a/src/main/java/site/billingwise/api/serverapi/global/log/HttpLogMessage.java +++ b/src/main/java/site/billingwise/api/serverapi/global/log/ApiLogMessage.java @@ -1,7 +1,9 @@ package site.billingwise.api.serverapi.global.log; import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; import lombok.Value; import org.springframework.http.HttpStatus; import org.springframework.web.util.ContentCachingRequestWrapper; @@ -13,7 +15,7 @@ @Value @JsonInclude(JsonInclude.Include.NON_NULL) -public class HttpLogMessage { +public class ApiLogMessage { String httpMethod; String requestUri; String httpStatus; @@ -26,7 +28,7 @@ public class HttpLogMessage { private static final ObjectMapper objectMapper = new ObjectMapper(); - public static HttpLogMessage createFrom( + public static ApiLogMessage createFrom( ContentCachingRequestWrapper requestWrapper, ContentCachingResponseWrapper responseWrapper, Double elapsedTime @@ -38,10 +40,10 @@ public static HttpLogMessage createFrom( String headers = getRequestHeaders(requestWrapper); String requestParam = getRequestParams(requestWrapper); - String requestBody = getRequestBody(requestWrapper); + String requestBody = maskSensitiveInfo(getRequestBody(requestWrapper)); String responseBody = getResponseBody(responseWrapper); - return new HttpLogMessage( + return new ApiLogMessage( httpMethod, requestUri, httpStatus, @@ -74,6 +76,19 @@ private static String getResponseBody(ContentCachingResponseWrapper response) { return new String(response.getContentAsByteArray(), StandardCharsets.UTF_8); } + private static String maskSensitiveInfo(String content) { + try { + JsonNode jsonNode = objectMapper.readTree(content); + if (jsonNode.has("password")) { + ((ObjectNode) jsonNode).put("password", "*****"); + } + return objectMapper.writeValueAsString(jsonNode); + } catch (Exception e) { + // JSON 파싱에 실패한 경우, 간단한 문자열 치환 + return content.replaceAll("\"password\"\\s*:\\s*\"[^\"]*\"", "\"password\":\"*****\""); + } + } + public String toJsonLog() { try { return objectMapper.writeValueAsString(this); diff --git a/src/main/java/site/billingwise/api/serverapi/global/log/ReqResLoggingFilter.java b/src/main/java/site/billingwise/api/serverapi/global/log/ApiLoggingFilter.java similarity index 82% rename from src/main/java/site/billingwise/api/serverapi/global/log/ReqResLoggingFilter.java rename to src/main/java/site/billingwise/api/serverapi/global/log/ApiLoggingFilter.java index cf165c1..9a1357f 100644 --- a/src/main/java/site/billingwise/api/serverapi/global/log/ReqResLoggingFilter.java +++ b/src/main/java/site/billingwise/api/serverapi/global/log/ApiLoggingFilter.java @@ -19,10 +19,10 @@ @Component @Order(Ordered.HIGHEST_PRECEDENCE) -public class ReqResLoggingFilter extends OncePerRequestFilter { - private static final Logger log = LoggerFactory.getLogger(ReqResLoggingFilter.class); +public class ApiLoggingFilter extends OncePerRequestFilter { + private static final Logger log = LoggerFactory.getLogger(ApiLoggingFilter.class); private static final String REQUEST_ID = "request_id"; - private static final String ACTUATOR_PATH = "/actuator"; + private static final String API_PATH = "/api"; @Override protected void doFilterInternal( @@ -30,7 +30,7 @@ protected void doFilterInternal( HttpServletResponse response, FilterChain filterChain ) throws ServletException, IOException { - if (isActuatorRequest(request)) { + if (!isApiRequest(request)) { filterChain.doFilter(request, response); return; } @@ -51,8 +51,8 @@ protected void doFilterInternal( } } - private boolean isActuatorRequest(HttpServletRequest request) { - return request.getRequestURI().startsWith(ACTUATOR_PATH); + private boolean isApiRequest(HttpServletRequest request) { + return request.getRequestURI().startsWith(API_PATH); } private String generateRequestId() { @@ -64,7 +64,7 @@ private void logRequest(ContentCachingRequestWrapper requestWrapper, long startTime, long endTime) { try { double elapsedTime = (endTime - startTime) / 1000.0; - HttpLogMessage logMessage = HttpLogMessage.createFrom(requestWrapper, responseWrapper, elapsedTime); + ApiLogMessage logMessage = ApiLogMessage.createFrom(requestWrapper, responseWrapper, elapsedTime); log.info("REQUEST_LOG: " + logMessage.toJsonLog()); responseWrapper.copyBodyToResponse(); } catch (Exception e) { diff --git a/src/test/java/site/billingwise/api/serverapi/domain/stats/controller/InvoiceStatsControllerTest.java b/src/test/java/site/billingwise/api/serverapi/domain/stats/controller/InvoiceStatsControllerTest.java index 0d4e469..10b5cda 100644 --- a/src/test/java/site/billingwise/api/serverapi/domain/stats/controller/InvoiceStatsControllerTest.java +++ b/src/test/java/site/billingwise/api/serverapi/domain/stats/controller/InvoiceStatsControllerTest.java @@ -68,7 +68,7 @@ void getInvoiceStats() throws Exception { // then result.andExpect(status().isOk()) - .andDo(document("stats/get-invoice-stats", + .andDo(document("stats/get", requestCookies( cookieWithName("access").description("엑세스 토큰")), pathParameters(