역할
- Spring Security 전반적 보안 설정 담당
- JWT 기반 인증 + REST API 보안 적용
- SecurityFilterChain을 통해 요청별 권한/인증 규칙 설정
- CORS, CSRF, 세션 정책, 인증/인가 예외 처리 구성
- JWT 인증 필터(
JwtAuthFilter) 등록 및 순서 지정
1. 핵심 설정: SecurityFilterChain
@Bean
public SecurityFilterChain filterChain(HttpSecurity http, JwtAuthFilter jwtAuthFilter) throws Exception {
return http
// JWT 기반이므로 CSRF 비활성화
.csrf(csrf -> csrf.disable())
// CORS 적용
.cors(cors -> {})
// Stateless 세션 사용 (세션 비사용)
.sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
// 폼 로그인 / 기본 인증 비활성화 (리다이렉트 방지)
.formLogin(form -> form.disable())
.httpBasic(basic -> basic.disable())
// 인증 실패 / 권한 부족 처리
.exceptionHandling(ex -> ex
.authenticationEntryPoint((req, res, e) -> res.sendError(401))
.accessDeniedHandler((req, res, e) -> res.sendError(403))
)
// 요청별 권한 설정
.authorizeHttpRequests(auth -> auth
.requestMatchers(HttpMethod.POST, "/api/login").permitAll()
.requestMatchers(HttpMethod.POST, "/api/logout").permitAll()
.requestMatchers(HttpMethod.POST, "/api/refresh").permitAll()
.requestMatchers("/uploads/**").permitAll()
.requestMatchers("/api/admin/**").hasRole("ADMIN")
.requestMatchers("/api/**").authenticated()
.anyRequest().permitAll()
)
// JWT 필터를 UsernamePasswordAuthenticationFilter 앞에 삽입
.addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class)
.build();
}
2. 설명
인증/인가 흐름
클라이언트 요청
│
▼
SecurityFilterChain
│
├─ JWT 인증 필터(JwtAuthFilter)
│ └─ JWT 유효성 검증 → UserDetailsService 호출 → SecurityContext 저장
│
└─ HttpSecurity 요청 권한 검사
├─ /api/admin/** → ROLE_ADMIN 필요
├─ /api/** → 로그인 필요
└─ 기타 → 허용
- JWT 기반 REST API: 세션 미사용 →
SessionCreationPolicy.STATELESS
- CORS 설정: 특정 도메인 허용, 인증/다운로드 헤더 노출
- 예외 처리: 인증 실패 → 401, 권한 부족 → 403
- 폼 로그인/HTTP 기본 인증: React 프론트 연동 위해 비활성화
3. 추가 핵심 Bean
| Bean |
역할 |
PasswordEncoder |
BCryptPasswordEncoder → 비밀번호 해시 비교 |
AuthenticationManager |
/login 시 authenticate() 수행 |
JwtAuthFilter |
JWT 검사, UserDetailsService 연동, SecurityContext 저장 |
CorsConfigurationSource |
CORS 정책 정의 및 경로 적용 |