Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,6 @@ out/

### Mac OS ###
.DS_Store

### log ###
logs/
4 changes: 3 additions & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,6 @@ services:
- AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
- AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
- SERVICE_KEY=${SERVICE_KEY}
- TZ=Asia/Seoul
- TZ=Asia/Seoul
volumes:
- ${LOG_DIRECTORY}:/logs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.kuit.findyou.global.config;

import com.kuit.findyou.global.jwt.filter.JsonLoginFilter;
import com.kuit.findyou.global.logging.MDCLoggingFilter;
import com.kuit.findyou.global.security.JwtAuthenticationEntryPoint;
import com.kuit.findyou.global.jwt.filter.JwtFilter;
import com.kuit.findyou.global.jwt.util.JwtUtil;
Expand All @@ -25,6 +26,8 @@ public class SecurityConfig {
private final AuthenticationConfiguration authenticationConfiguration;
private final JwtAuthenticationEntryPoint entryPoint;
private final JwtUtil jwtUtil;
private final MDCLoggingFilter mdcLoggingFilter;

private static final String[] PERMIT_URL = {
LOGIN_ENDPOINT.getValue(), "api/v1/auth/signup", "/swagger-ui/**", "/api-docs", "/swagger-ui-custom.html",
"/v3/api-docs/**", "/api-docs/**", "/swagger-ui.html", "/swagger-ui/index.html"
Expand Down Expand Up @@ -64,6 +67,10 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
// .requestMatchers(PERMIT_URL).permitAll()
// .anyRequest().authenticated());

// MDC 필터 등록
http
.addFilterBefore(mdcLoggingFilter, UsernamePasswordAuthenticationFilter.class);

// 토큰 검증 필터 추가
http
.addFilterBefore(new JwtFilter(jwtUtil), UsernamePasswordAuthenticationFilter.class);
Expand Down
12 changes: 11 additions & 1 deletion src/main/java/com/kuit/findyou/global/jwt/filter/JwtFilter.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
Expand Down Expand Up @@ -49,6 +50,12 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse

// UserDetails 생성
String username = jwtUtil.getUsername(token);

// jwt 인증 시 user_id 를 MDC에 삽입
Long userId = jwtUtil.getUserId(token);
MDC.put("user_id", String.valueOf(userId));


User user = User.builder()
.email(username)
.password("password")
Expand All @@ -63,7 +70,10 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse
log.info("token authentication failure");
request.setAttribute("exception", e);
}
filterChain.doFilter(request, response);
finally {
filterChain.doFilter(request, response);
MDC.clear();
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이부분에 MDC.clear()를 넣은 이유가 따로 있을까요? 기능적으로 문제는 없어 보이지만, MDCLoggingFilter에서 이미 finally 블록으로 MDC.clear()를 처리하고 있기 떄문에 JwtFilter의 clear() 호출은 중복되어 불필요하다는 생각이 듭니다!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

주연님 말씀이 맞는 것 같습니다 사실상 중복 코드인 것 같아요. 처음에는 필터단에서의 동작 방식 자체에 대해 약간 부족하게 알고있기도 했고, 혹시나하는 마음에 MDC 를 put 하는 위치마다 모두 clear 를 해주도록 했었는데 그럴 필요가 없을 것 같네용 좋은 지적 감사합니다!
다만 이 브랜치를 베이스 삼아 다음 PR을 열어두어었다보니 잘못하면 커밋 내역이 꼬여버릴 것 같아서 이 부분은 추후에 고쳐둘게요!

}

private static String extractToken(HttpServletRequest request) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.kuit.findyou.global.logging;

import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import org.slf4j.MDC;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.Objects;
import java.util.UUID;


@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class MDCLoggingFilter implements Filter {

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
try {
String requestId = ((HttpServletRequest)servletRequest).getHeader("X-Request-ID");
MDC.put("request_id", Objects.toString(requestId, UUID.randomUUID().toString()));

filterChain.doFilter(servletRequest, servletResponse);
} finally {
MDC.clear(); // 메모리 누수 방지
}
}
}
2 changes: 1 addition & 1 deletion src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ spring:
redis:
host: localhost
port: 6379

---
# 개발용 DB
spring:
Expand Down Expand Up @@ -125,3 +124,4 @@ api:
logging:
level:
org.springframework.cache: trace # Redis 사용에 대한 로그가 조회되도록 설정
root: info
85 changes: 85 additions & 0 deletions src/main/resources/logback-spring.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 색상 변환기 등록(콘솔용) -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />

<property name="LOG_PATH" value="logs"/>

<!-- 콘솔 로그 패턴(컬러) -->
<property name="console.format"
value="[%clr(%d{yyyy-MM-dd HH:mm:ss}){green}:%clr(%-3relative){faint}] [%clr(%thread){magenta}] %highlight(%-5level) %clr(%logger{35}){cyan} - %clr(%msg){yellow}%n"/>

<!-- 파일 로그 패턴 (텍스트, key=value 형태) -->
<property name="file.format"
value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%level] [%thread] [%logger] [request_id:%X{request_id}] [user_id:%X{user_id}] %msg%n"/>

<!-- 콘솔 로그 Appender(컬러) -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${console.format}</pattern>
</encoder>
</appender>

<!-- INFO 로그 파일 (텍스트) -->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/info.log</file>
<encoder>
<pattern>${file.format}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/info.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>

<!-- WARN 로그 파일 (텍스트) -->
<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/warn.log</file>
<encoder>
<pattern>${file.format}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/warn.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>

<!-- ERROR 로그 파일 (텍스트) -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/error.log</file>
<encoder>
<pattern>${file.format}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>

<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
</configuration>
Loading