웹개발/SpringBoot

보안과 권한 시스템의 핵심 - 6. Config/WevSecurityConfig

bergerac 2025. 6. 7. 09:11

https://github.com/seoyoonchoi/Korea_sleep_Tech_springBoot/tree/main/src/main/java/com/example/korea_sleepTech_springboot

 

Korea_sleep_Tech_springBoot/src/main/java/com/example/korea_sleepTech_springboot at main · seoyoonchoi/Korea_sleep_Tech_springB

Contribute to seoyoonchoi/Korea_sleep_Tech_springBoot development by creating an account on GitHub.

github.com

실제 코드를 더 확인하고 싶다면 위 링크를 통해서 확인할 수 있다. 이 글에서는 간략하게 코드의 중요한 부분만 발췌하였다.

 

📁 프로젝트 구조(보안설정 기준)

com.example.korea_sleepTech_springboot
├── config
│   └── WebSecurityConfig.java       // 보안 설정 클래스
├── filter
│   └── JwtAuthenticationFilter.java // JWT 인증 필터
├── provider
│   └── JwtProvider.java             // JWT 생성/검증 유틸

 

WebSercurityConfig 클래스의 역할

Spring Security를 기반으로 애플리케이션의 인증 및 인가 전략을 설정하는 클래스

구체적으로는 다음을 담당함:

  • JWT 필터 등록 및 실행 시점 지정
  • CSRF 비활성화
  • CORS 정책 적용
  • URL별 권한 설정
  • 비밀번호 암호화 전략 정의
  • 인증 관리자 등록

주요 구성 요소

1. @EnableWebSecurity와 SecurityFilterChain

 

  • @Configuration: 설정 클래스임을 명시
  • @EnableWebSecurity: Spring Security 설정 활성화
  • Security 5.7 이후 WebSecurityConfigurerAdapter는 deprecated → SecurityFilterChain 사용

 

@Configuration
@EnableWebSecurity
public class WebSecurityConfig {

 

2. JWT 인증 필터 등록

@Lazy를 쓰는 이유 -> JwtProvider, UserDetailsService 등과 순환 참조 문제를 피하기 위해 지연 주입

@Autowired
@Lazy
private JwtAuthenticationFilter jwtAuthenticationFilter;

 

3. CORS 정책 설정(Cross-Origin Resource Sharing)

@Bean
public CorsFilter corsFilter() {
    ...
}

 

4. filterChain() - 보안 정책 핵심 설정부

인증/인가 정책

  • 퍼블릭 API: /auth/**, /post-datas/** → 로그인 없이 접근 허용
  • 회원 전용 API: /user/** → USER 권한 필요
  • 관리자 전용 API: /admin/** → ADMIN 권한 필요
  • 공통 API: /common/** → USER, ADMIN 모두 접근 가능
.authorizeHttpRequests(auth -> auth
        .requestMatchers("/api/v1/auth/**", "/api/v1/post-datas/**").permitAll()
        .requestMatchers("/api/v1/user/**").hasRole("USER")
        .requestMatchers("/api/v1/admin/**").hasRole("ADMIN")
        .requestMatchers("/api/v1/common/**").hasAnyRole("USER", "ADMIN")
        .anyRequest().authenticated()
)

 

 

CSRF 비활성화 

 

  • CSRF는 세션/폼 기반 공격을 방지하기 위한 기능
  • REST API에서는 세션이 아닌 JWT 기반 stateless 방식이므로 불필요
.csrf(AbstractHttpConfigurer::disable)

 

CORS 활성화

->corsFilter()을 적용

.cors(withDefaults())

 

JWT 필터를 UsernamePasswordAuthenticationFilter 이전에 등록

 

  • JWT 인증 필터는 사용자가 이미 로그인된 상태인지 검증
  • 폼 로그인 기반 인증보다 먼저 실행되어야 사용자 인증 정보가 SecurityContext에 등록됨
.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)

 

 

5. AuthenticationManager 설정

@Bean
public AuthenticationManager authenticationManager(BCryptPasswordEncoder bCryptPasswordEncoder)

 

  • 사용자가 로그인할 때 입력한 ID/PW를 DB에 있는 값과 비교하기 위한 설정
  • DaoAuthenticationProvider는 UserDetailsService와 연결됨
  • ProviderManager는 여러 인증 전략을 조합할 수 있는 인증 관리자
DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
authProvider.setPasswordEncoder(bCryptPasswordEncoder);
return new ProviderManager(List.of(authProvider));

 

 

6. BCryptPasswordEncoder - 암호화 전략

@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder() {
    return new BCryptPasswordEncoder();
}

 

종합 흐름 정리

클라이언트 요청 → JwtAuthenticationFilter → 토큰 검증 성공 → SecurityContextHolder 인증 정보 등록 →
요청 경로 권한 체크 (hasRole) → 컨트롤러 → 서비스 → DB 처리