Spring Security는 Spring 생태계에서 인증(Authentication)과 권한(Authorization)을 처리하는 핵심 보안 프레임워크입니다.
Spring Security의 작동 원리와 핵심 개념을 실무 중심으로 알려드리겠습니다.
Spring Security란?
Spring Security는 서블릿 필터 기반의 보안 프레임워크로, 스프링 기반 애플리케이션에서 사용자 인증과 인가를 위한 기능을 제공합니다.
특히 로그인, 로그아웃, 세션 관리, CSRF 방어, 패스워드 암호화 등 보안 기능이 기본 탑재되어 있어, 직접 구현할 필요 없이 손쉽게 보안을 확보할 수 있습니다.
인증(Authentication)과 인가(Authorization)
- 인증 (Authentication): 사용자가 누구인지 확인 (ex. 로그인)
- 인가 (Authorization): 인증된 사용자가 무엇을 할 수 있는지 확인 (ex. ROLE_ADMIN만 관리자 페이지 접근 가능)
Spring Security는 위 두 단계를 Security Filter Chain을 통해 처리하며, 커스터마이징도 가능합니다.
Security Filter Chain
Spring Security의 핵심 구조는 여러 개의 Filter들이 모여있는 SecurityFilterChain입니다.
대표적인 필터는 다음과 같습니다.
UsernamePasswordAuthenticationFilter: 로그인 인증 처리BasicAuthenticationFilter: HTTP Basic 인증 처리ExceptionTranslationFilter: 예외 처리FilterSecurityInterceptor: 인가(권한 검사)
이 필터 체인은 DispatcherServlet 이전에 실행되어, 모든 요청에 대해 보안 검사를 수행합니다.
기본 설정 흐름
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/admin/**").hasRole("ADMIN")
.requestMatchers("/user/**").authenticated()
.anyRequest().permitAll()
)
.formLogin(Customizer.withDefaults())
.logout(Customizer.withDefaults());
return http.build();
}
}
위 설정은 "/admin/**" 경로는 관리자만, "/user/**"는 로그인한 사용자만 접근 가능하도록 구성합니다.
그 외 경로는 모두 허용됩니다.
인증 흐름 이해
기본 로그인 처리 과정은 다음과 같은 흐름을 따릅니다:
- 사용자가 로그인 폼에 아이디/비밀번호 입력
UsernamePasswordAuthenticationFilter가 요청을 가로채 인증 시도AuthenticationManager가 인증 처리UserDetailsService를 통해 사용자 정보 조회- 비밀번호 검증 후
SecurityContextHolder에 사용자 정보 저장
주요 인터페이스
| 인터페이스 | 역할 |
|---|---|
UserDetails |
사용자 정보를 담는 객체 |
UserDetailsService |
사용자 정보 조회 로직 |
Authentication |
인증 객체, SecurityContext에 저장됨 |
SecurityContextHolder |
인증된 사용자 정보를 담고 있는 ThreadLocal 저장소 |
비밀번호 암호화
Spring Security에서는 BCrypt 기반 해시 함수를 기본 제공하여 비밀번호를 안전하게 저장할 수 있습니다.
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
DB에 저장된 비밀번호는 반드시 암호화되어야 하며, UserDetailsService에서 검증 시 자동으로 매칭됩니다.
실무 팁
- 스프링 시큐리티는 default deny 전략: 설정하지 않으면 모든 요청이 차단됩니다.
- CSRF는 API 서버에서는 비활성화하는 경우 많습니다 (예:
http.csrf().disable()) - 권한 체크는
@PreAuthorize같은 애너테이션 기반도 활용 가능합니다 - 로그인/로그아웃 커스터마이징, JWT 인증 방식은 별도 설정이 필요합니다
Spring Security는 처음 진입장벽이 높지만, 한 번 이해하면 매우 강력한 보안 프레임워크입니다.
기본 개념부터 필터 흐름, 커스터마이징까지 확장성이 뛰어나며, 특히 엔터프라이즈 보안 요구사항에도 대응할 수 있도록 설계되어 있습니다.
실무에서는 프로젝트 초기부터 Spring Security를 적용해 보안 구조를 선제적으로 설계하는 것이 중요합니다.
'개발 > JAVA' 카테고리의 다른 글
| [JAVA] Spring Boot에서 OAuth2 소셜 로그인 구현하기 (kakao) (0) | 2025.10.26 |
|---|---|
| [JAVA] JWT 기반 인증/인가 구현하기 (Spring Boot 실전 가이드) (0) | 2025.10.25 |
| [JAVA] Spring Boot에서 이메일 발송 기능 구현하기 (JavaMailSender) (0) | 2025.10.23 |
| [JAVA] Spring Boot로 파일 업로드 및 다운로드 API 구현하기 (0) | 2025.10.22 |
| [JAVA] Spring Boot와 Kafka 연동하기 - 실무 개발자를 위한 가이드 (0) | 2025.10.21 |
