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 처리'웹개발 > SpringBoot' 카테고리의 다른 글
| 보안과 권한 시스템의 핵심 - 7. Provider/JwtProvider (1) | 2025.06.08 |
|---|---|
| 보안과 권한 시스템 핵심 - 5. filter/JwtAuthenticationFilter (1) | 2025.06.06 |
| 보안과 권한 시스템 - 4. Service/ServiceImpl (0) | 2025.06.05 |
| 보안과 권한 시스템 - 3. Controller (1) | 2025.06.04 |
| 보안 인증과 권한 시스템 - 2. Repository (2) | 2025.06.03 |