From 116f483e52ca57fda3314ccc73503dcacca8a11b Mon Sep 17 00:00:00 2001 From: JONGHAN Date: Mon, 1 Jun 2026 21:14:46 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20Rate=20Limit=EC=9D=84=20YAML=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=EC=9C=BC=EB=A1=9C=20ON/OFF=20=ED=86=A0?= =?UTF-8?q?=EA=B8=80=20=EA=B0=80=EB=8A=A5=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 대상: GlobalRateLimitFilter, RateLimitAspect, RateLimitManager, RateLimitKeyGenerator, RateLimitConfiguration - @EnableAspectJAutoProxy를 ShoppingApplication으로 이동 (조건부 비활성화 시에도 AOP 유지) - SecurityConfiguration에서 GlobalRateLimitFilter를 Optional 주입으로 변경 - application.yml에 ratelimit.enabled: true 기본값 추가 --- src/main/java/com/kt/ShoppingApplication.java | 2 ++ .../ratelimit/aspect/RateLimitAspect.java | 2 ++ .../ratelimit/filter/GlobalRateLimitFilter.java | 2 ++ .../ratelimit/key/RateLimitKeyGenerator.java | 2 ++ .../ratelimit/manager/RateLimitManager.java | 2 ++ .../com/kt/config/RateLimitConfiguration.java | 4 ++-- .../com/kt/config/SecurityConfiguration.java | 17 ++++++++++++++--- src/main/resources/application.yml | 5 ++++- 8 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/kt/ShoppingApplication.java b/src/main/java/com/kt/ShoppingApplication.java index 69b7ddc1..68367222 100644 --- a/src/main/java/com/kt/ShoppingApplication.java +++ b/src/main/java/com/kt/ShoppingApplication.java @@ -3,11 +3,13 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.ConfigurationPropertiesScan; +import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @SpringBootApplication @ConfigurationPropertiesScan @EnableJpaAuditing +@EnableAspectJAutoProxy public class ShoppingApplication { public static void main(String[] args) { diff --git a/src/main/java/com/kt/common/ratelimit/aspect/RateLimitAspect.java b/src/main/java/com/kt/common/ratelimit/aspect/RateLimitAspect.java index 364d193c..4b26b1ba 100644 --- a/src/main/java/com/kt/common/ratelimit/aspect/RateLimitAspect.java +++ b/src/main/java/com/kt/common/ratelimit/aspect/RateLimitAspect.java @@ -19,11 +19,13 @@ import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @Aspect @Component @RequiredArgsConstructor @Slf4j +@ConditionalOnProperty(name = "ratelimit.enabled", havingValue = "true", matchIfMissing = true) public class RateLimitAspect { private final RateLimitManager rateLimitManager; diff --git a/src/main/java/com/kt/common/ratelimit/filter/GlobalRateLimitFilter.java b/src/main/java/com/kt/common/ratelimit/filter/GlobalRateLimitFilter.java index 47393e2e..24544b75 100644 --- a/src/main/java/com/kt/common/ratelimit/filter/GlobalRateLimitFilter.java +++ b/src/main/java/com/kt/common/ratelimit/filter/GlobalRateLimitFilter.java @@ -19,9 +19,11 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @Slf4j @Component +@ConditionalOnProperty(name = "ratelimit.enabled", havingValue = "true", matchIfMissing = true) public class GlobalRateLimitFilter extends OncePerRequestFilter { private static final int MAX_REQUEST_SECONDS = 100; diff --git a/src/main/java/com/kt/common/ratelimit/key/RateLimitKeyGenerator.java b/src/main/java/com/kt/common/ratelimit/key/RateLimitKeyGenerator.java index 7108df77..eea89eac 100644 --- a/src/main/java/com/kt/common/ratelimit/key/RateLimitKeyGenerator.java +++ b/src/main/java/com/kt/common/ratelimit/key/RateLimitKeyGenerator.java @@ -12,9 +12,11 @@ import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @Component @Slf4j +@ConditionalOnProperty(name = "ratelimit.enabled", havingValue = "true", matchIfMissing = true) public class RateLimitKeyGenerator { public String generateKey(KeyType keyType, HttpServletRequest request, String httpMethod, String path) { diff --git a/src/main/java/com/kt/common/ratelimit/manager/RateLimitManager.java b/src/main/java/com/kt/common/ratelimit/manager/RateLimitManager.java index 624e4924..f987c7fa 100644 --- a/src/main/java/com/kt/common/ratelimit/manager/RateLimitManager.java +++ b/src/main/java/com/kt/common/ratelimit/manager/RateLimitManager.java @@ -12,10 +12,12 @@ import io.github.bucket4j.distributed.proxy.ProxyManager; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @Component @RequiredArgsConstructor @Slf4j +@ConditionalOnProperty(name = "ratelimit.enabled", havingValue = "true", matchIfMissing = true) public class RateLimitManager { private final ProxyManager proxyManager; diff --git a/src/main/java/com/kt/config/RateLimitConfiguration.java b/src/main/java/com/kt/config/RateLimitConfiguration.java index ffd93957..c6380f5f 100644 --- a/src/main/java/com/kt/config/RateLimitConfiguration.java +++ b/src/main/java/com/kt/config/RateLimitConfiguration.java @@ -3,9 +3,9 @@ import java.time.Duration; import java.util.concurrent.TimeUnit; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.EnableAspectJAutoProxy; import com.github.benmanes.caffeine.cache.Caffeine; @@ -13,7 +13,7 @@ import io.github.bucket4j.distributed.proxy.ProxyManager; @Configuration -@EnableAspectJAutoProxy +@ConditionalOnProperty(name = "ratelimit.enabled", havingValue = "true", matchIfMissing = true) public class RateLimitConfiguration { private static final int CACHE_MAX_SIZE = 100000; diff --git a/src/main/java/com/kt/config/SecurityConfiguration.java b/src/main/java/com/kt/config/SecurityConfiguration.java index a6a03a07..188feb07 100644 --- a/src/main/java/com/kt/config/SecurityConfiguration.java +++ b/src/main/java/com/kt/config/SecurityConfiguration.java @@ -18,13 +18,12 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; -import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; @Configuration @EnableWebSecurity @EnableMethodSecurity -@RequiredArgsConstructor public class SecurityConfiguration { private static final String[] GET_PERMIT_ALL = {"/api/health/**", "/swagger-ui.html","/swagger-ui/**", "/v3/api-docs/**", "/actuator/**", "/payment-*.html", "/api/payments/client-key", "/*.css", "/api/chats", "/api/chats/**"}; @@ -36,6 +35,16 @@ public class SecurityConfiguration { private final ObjectMapper objectMapper; private final GlobalRateLimitFilter globalRateLimitFilter; + public SecurityConfiguration( + JwtTokenProvider jwtTokenProvider, + ObjectMapper objectMapper, + @Autowired(required = false) GlobalRateLimitFilter globalRateLimitFilter + ) { + this.jwtTokenProvider = jwtTokenProvider; + this.objectMapper = objectMapper; + this.globalRateLimitFilter = globalRateLimitFilter; + } + @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); @@ -69,7 +78,9 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { .logout(logout -> logout.disable()) .csrf(AbstractHttpConfigurer::disable); - http.addFilterBefore(globalRateLimitFilter, UsernamePasswordAuthenticationFilter.class); + if (globalRateLimitFilter != null) { + http.addFilterBefore(globalRateLimitFilter, UsernamePasswordAuthenticationFilter.class); + } http.addFilterBefore(new JwtAuthenticationFilter(jwtTokenProvider,objectMapper), UsernamePasswordAuthenticationFilter.class); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 4dc09b47..bb08686d 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -20,4 +20,7 @@ slack: log-channel: ${slack.channel} server: - port: 8080 \ No newline at end of file + port: 8080 + +ratelimit: + enabled: true \ No newline at end of file