Skip to content

Commit 894c63e

Browse files
authored
Merge pull request #69 from prgrms-web-devcourse-final-project/refactor/#61
[Auth] 프론트 CORS설정 및 시큐리티 설정 보완
2 parents 076e529 + 0597e07 commit 894c63e

2 files changed

Lines changed: 37 additions & 1 deletion

File tree

src/main/java/com/back/web7_9_codecrete_be/global/security/JwtAuthenticationFilter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ protected void doFilterInternal(HttpServletRequest request,
6565
SecurityContextHolder.getContext().setAuthentication(auth);
6666

6767
} catch (BusinessException ex) {
68-
// Refresh도 실패 → 익명 사용자 유지
68+
// 재발급 실패 시 SecurityContext 비우기
69+
SecurityContextHolder.clearContext();
6970
log.debug("Access Token 재발급 실패: {}", ex.getErrorCode());
7071
}
7172

src/main/java/com/back/web7_9_codecrete_be/global/security/SecurityConfig.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,13 @@
88
import org.springframework.security.config.Customizer;
99
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
1010
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
11+
import org.springframework.security.config.http.SessionCreationPolicy;
1112
import org.springframework.security.web.SecurityFilterChain;
1213
import 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

Comments
 (0)