diff --git a/src/main/java/com/eactive/apim/portal/config/InterceptorsEndpointConfig.java b/src/main/java/com/eactive/apim/portal/config/InterceptorsEndpointConfig.java
new file mode 100644
index 0000000..8c7b17b
--- /dev/null
+++ b/src/main/java/com/eactive/apim/portal/config/InterceptorsEndpointConfig.java
@@ -0,0 +1,165 @@
+package com.eactive.apim.portal.config;
+
+import java.lang.reflect.Array;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
+import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
+import org.springframework.boot.actuate.info.Info;
+import org.springframework.boot.actuate.info.InfoContributor;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.util.ReflectionUtils;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.handler.AbstractHandlerMapping;
+import org.springframework.web.servlet.handler.MappedInterceptor;
+
+/**
+ * HandlerInterceptor 목록을 Actuator 로 노출한다.
+ *
+ *
배경: Actuator 의 {@code /actuator/mappings} 는 servlet filter / servlet / handler mapping 만
+ * 보여주고 interceptor 는 항목 자체가 없다. {@code /actuator/beans} 로도 안 보이는데,
+ * {@link PortalConfigWebDispatcherServlet#addInterceptors} 가 {@code new} 로 직접 생성해 등록하므로
+ * 스프링 빈이 아니기 때문이다. 그래서 HandlerMapping 내부 목록을 직접 읽어서 노출한다.
+ *
+ *
노출 경로 2가지:
+ *
+ * - {@code GET /actuator/interceptors} — 전용 엔드포인트
+ * - {@code GET /actuator/info} 의 {@code interceptors} 항목 — Spring Boot Admin 은 커스텀
+ * 엔드포인트용 화면이 없으므로, SBA UI(Details 탭의 Info 카드)에서 보려면 이쪽이 필요하다.
+ * {@code management.info.env.enabled} 와 무관하게 InfoContributor 는 항상 동작한다.
+ *
+ *
+ * 이 설정은 actuator 가 classpath 에 있을 때만 활성화된다. actuator 는 build.gradle 에서
+ * 로컬 전용(runtimeOnly + war 산출물 제외)이므로 WebLogic 배포본(dev/stage/prod)에서는
+ * 조건이 거짓이 되어 이 클래스 자체가 로드되지 않는다.
+ */
+@Configuration
+@ConditionalOnClass(name = "org.springframework.boot.actuate.endpoint.annotation.Endpoint")
+public class InterceptorsEndpointConfig {
+
+ @Bean
+ public InterceptorsEndpoint interceptorsEndpoint(ApplicationContext applicationContext) {
+ return new InterceptorsEndpoint(applicationContext);
+ }
+
+ @Endpoint(id = "interceptors")
+ public static class InterceptorsEndpoint implements InfoContributor {
+
+ /** AbstractHandlerMapping 이 실제로 실행하는 interceptor 목록(private final). */
+ private static final Field ADAPTED_INTERCEPTORS =
+ ReflectionUtils.findField(AbstractHandlerMapping.class, "adaptedInterceptors");
+
+ /** MappedInterceptor 의 제외 패턴(private final PatternAdapter[]). include 는 public getter 가 있다. */
+ private static final Field EXCLUDE_PATTERNS =
+ ReflectionUtils.findField(MappedInterceptor.class, "excludePatterns");
+
+ static {
+ if (ADAPTED_INTERCEPTORS != null) {
+ ReflectionUtils.makeAccessible(ADAPTED_INTERCEPTORS);
+ }
+ if (EXCLUDE_PATTERNS != null) {
+ ReflectionUtils.makeAccessible(EXCLUDE_PATTERNS);
+ }
+ }
+
+ private final ApplicationContext applicationContext;
+
+ public InterceptorsEndpoint(ApplicationContext applicationContext) {
+ this.applicationContext = applicationContext;
+ }
+
+ /**
+ * HandlerMapping 빈 이름 → 등록 순서대로의 interceptor 목록.
+ * 목록 순서가 곧 preHandle 실행 순서다(afterCompletion 은 역순).
+ */
+ @ReadOperation
+ public Map>> interceptors() {
+ Map>> result = new TreeMap<>();
+ Map mappings =
+ applicationContext.getBeansOfType(AbstractHandlerMapping.class);
+ for (Map.Entry entry : mappings.entrySet()) {
+ List