역할


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/** → 로그인 필요
             └─ 기타 → 허용

3. 추가 핵심 Bean

Bean 역할
PasswordEncoder BCryptPasswordEncoder → 비밀번호 해시 비교
AuthenticationManager /loginauthenticate() 수행
JwtAuthFilter JWT 검사, UserDetailsService 연동, SecurityContext 저장
CorsConfigurationSource CORS 정책 정의 및 경로 적용