From 640e94bf1703c115d4c8f6a5e624fc790e47e177 Mon Sep 17 00:00:00 2001 From: wonho Date: Wed, 29 Oct 2025 18:25:09 +0900 Subject: [PATCH] =?UTF-8?q?user-service=20CORS=20=EB=B0=8F=20=EA=B2=BD?= =?UTF-8?q?=EB=A1=9C=20=EB=A7=A4=ED=95=91=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SecurityConfig: CORS 설정 개선 및 context-path 기반 경로 수정 - UserController: RequestMapping 중복 경로 제거 - SwaggerConfig: Production 서버 URL 추가 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../kt/event/user/config/SecurityConfig.java | 30 +++++++++++++------ .../kt/event/user/config/SwaggerConfig.java | 7 +++-- .../event/user/controller/UserController.java | 2 +- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/user-service/src/main/java/com/kt/event/user/config/SecurityConfig.java b/user-service/src/main/java/com/kt/event/user/config/SecurityConfig.java index 064c938..0c8e6ca 100644 --- a/user-service/src/main/java/com/kt/event/user/config/SecurityConfig.java +++ b/user-service/src/main/java/com/kt/event/user/config/SecurityConfig.java @@ -38,6 +38,18 @@ public class SecurityConfig { @Value("${cors.allowed-origins:http://localhost:*}") private String allowedOrigins; + @Value("${cors.allowed-methods:GET,POST,PUT,DELETE,OPTIONS,PATCH}") + private String allowedMethods; + + @Value("${cors.allowed-headers:*}") + private String allowedHeaders; + + @Value("${cors.allow-credentials:true}") + private boolean allowCredentials; + + @Value("${cors.max-age:3600}") + private long maxAge; + @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { return http @@ -45,8 +57,8 @@ public class SecurityConfig { .cors(cors -> cors.configurationSource(corsConfigurationSource())) .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .authorizeHttpRequests(auth -> auth - // Public endpoints - .requestMatchers("/api/v1/users/register", "/api/v1/users/login").permitAll() + // Public endpoints (context-path가 /api/v1/users이므로 상대 경로 사용) + .requestMatchers("/register", "/login").permitAll() // Actuator endpoints .requestMatchers("/actuator/**").permitAll() // Swagger UI endpoints @@ -65,23 +77,23 @@ public class SecurityConfig { public CorsConfigurationSource corsConfigurationSource() { CorsConfiguration configuration = new CorsConfiguration(); - // 모든 Origin 허용 - configuration.setAllowedOriginPatterns(Arrays.asList("*")); + // application.yml에서 설정한 Origin 목록 사용 + configuration.setAllowedOrigins(Arrays.asList(allowedOrigins.split(","))); // 허용할 HTTP 메소드 - configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS")); + configuration.setAllowedMethods(Arrays.asList(allowedMethods.split(","))); // 허용할 헤더 - configuration.setAllowedHeaders(Arrays.asList("*")); + configuration.setAllowedHeaders(Arrays.asList(allowedHeaders.split(","))); // 자격 증명 허용 - configuration.setAllowCredentials(true); + configuration.setAllowCredentials(allowCredentials); // Pre-flight 요청 캐시 시간 - configuration.setMaxAge(3600L); + configuration.setMaxAge(maxAge); // Exposed Headers 추가 - configuration.setExposedHeaders(Arrays.asList("Authorization", "Content-Type")); + configuration.setExposedHeaders(Arrays.asList("Authorization", "Content-Type", "X-Total-Count")); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", configuration); diff --git a/user-service/src/main/java/com/kt/event/user/config/SwaggerConfig.java b/user-service/src/main/java/com/kt/event/user/config/SwaggerConfig.java index 60ab414..589718f 100644 --- a/user-service/src/main/java/com/kt/event/user/config/SwaggerConfig.java +++ b/user-service/src/main/java/com/kt/event/user/config/SwaggerConfig.java @@ -26,10 +26,13 @@ public class SwaggerConfig { return new OpenAPI() .info(apiInfo()) .addServersItem(new Server() - .url("http://localhost:8081") + .url("http://kt-event-marketing-api.20.214.196.128.nip.io/api/v1/users") + .description("Production Server (AKS Ingress)")) + .addServersItem(new Server() + .url("http://localhost:8081/api/v1/users") .description("Local Development")) .addServersItem(new Server() - .url("{protocol}://{host}:{port}") + .url("{protocol}://{host}:{port}/api/v1/users") .description("Custom Server") .variables(new io.swagger.v3.oas.models.servers.ServerVariables() .addServerVariable("protocol", new io.swagger.v3.oas.models.servers.ServerVariable() diff --git a/user-service/src/main/java/com/kt/event/user/controller/UserController.java b/user-service/src/main/java/com/kt/event/user/controller/UserController.java index f8469d8..3cb54ad 100644 --- a/user-service/src/main/java/com/kt/event/user/controller/UserController.java +++ b/user-service/src/main/java/com/kt/event/user/controller/UserController.java @@ -33,7 +33,7 @@ import java.util.UUID; */ @Slf4j @RestController -@RequestMapping("/api/v1/users") +@RequestMapping("") // context-path가 /api/v1/users이므로 빈 문자열 사용 @RequiredArgsConstructor @Tag(name = "User", description = "사용자 인증 및 프로필 관리 API") public class UserController {