88import org .springframework .security .config .Customizer ;
99import org .springframework .security .config .annotation .authentication .configuration .AuthenticationConfiguration ;
1010import org .springframework .security .config .annotation .web .builders .HttpSecurity ;
11+ import org .springframework .security .config .http .SessionCreationPolicy ;
1112import org .springframework .security .web .SecurityFilterChain ;
1213import org .springframework .security .web .authentication .UsernamePasswordAuthenticationFilter ;
14+ import org .springframework .web .cors .CorsConfiguration ;
15+ import org .springframework .web .cors .UrlBasedCorsConfigurationSource ;
16+
17+ import java .util .List ;
1318
1419@ Configuration
1520@ RequiredArgsConstructor
@@ -36,6 +41,10 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti
3641 // H2 Console 설정
3742 .headers (headers -> headers .frameOptions (frame -> frame .disable ()))
3843
44+ // 세션 관리 설정 - Stateless
45+ .sessionManagement ((session ) -> session
46+ .sessionCreationPolicy (SessionCreationPolicy .STATELESS ))
47+
3948 // Authorization 설정
4049 .authorizeHttpRequests (auth -> auth
4150 .requestMatchers (
@@ -45,6 +54,13 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti
4554 "/h2-console/**" , // H2 Console
4655 "/api/v1/concerts/**" // concert 정보 조회 도메인
4756 ).permitAll ()
57+
58+ // ADMIN 전용
59+ .requestMatchers ("/api/v1/admin/**" ).hasRole ("ADMIN" )
60+
61+ // USER, ADMIN 허용
62+ .requestMatchers ("/api/v1/users/**" ).hasAnyRole ("USER" , "ADMIN" )
63+
4864 .anyRequest ().authenticated ()
4965 )
5066
@@ -60,4 +76,23 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti
6076 public AuthenticationManager authenticationManager (AuthenticationConfiguration configuration ) throws Exception {
6177 return configuration .getAuthenticationManager ();
6278 }
79+
80+ // CORS 설정(로컬 프론트 통신 허용)
81+ @ Bean
82+ public UrlBasedCorsConfigurationSource corsConfigurationSource () {
83+ CorsConfiguration configuration =new CorsConfiguration ();
84+
85+ configuration .setAllowedOrigins (List .of ("http://localhost:3000" ));
86+ configuration .setAllowedMethods (List .of ("GET" , "POST" , "PUT" , "DELETE" , "PATCH" , "OPTIONS" ));
87+
88+ configuration .setAllowedHeaders (List .of ("*" ));
89+
90+ //쿠키 자동으로 넘어가게 설정
91+ configuration .setAllowCredentials (true );
92+
93+ UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource ();
94+ source .registerCorsConfiguration ("/api/**" , configuration );
95+
96+ return source ;
97+ }
6398}
0 commit comments