Today I Learned
Spring Boot Security
#Spring Security란?
Spring Security는 Spring 기반 애플리케이션의 보안(인증/인가)을 담당하는 프레임워크다.
로그인, 권한 제어, 세션 관리, CSRF 방어 등 다양한 보안 기능을 제공하며, Filter 기반으로 동작해 요청 흐름을 제어한다.
#Spring Security의 사용 목적
인증(Authentication): 사용자가 누구인지 확인 (ex. 로그인)
인가(Authorization): 인증된 사용자가 특정 자원에 접근 가능한지 확인
보안 강화: CSRF, 세션 고정 공격, URL 접근 제어 등 방어
유연한 커스터마이징: 로그인 페이지, 권한 처리, 예외 핸들링 등 자유롭게 설정 가능
#Spring Security 주요 기능
1. 인증 처리
기본 로그인 폼 제공 (`/login`)
사용자 정보는 `UserDetailsService`를 통해 로딩
비밀번호 암호화는 `PasswordEncoder`로 처리
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
2. 인가 처리
URL별 접근 권한 설정 가능
`hasRole("USER")`, `permitAll()`, `authenticated()` 등으로 제어
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().permitAll()
);
3. 커스텀 로그인/로그아웃
로그인 성공 시 이동할 URL 지정
로그아웃 처리 및 세션 무효화 가능
http
.formLogin(form -> form
.loginPage("/login")
.defaultSuccessUrl("/dashboard", true)
.permitAll()
)
.logout(logout -> logout
.logoutSuccessUrl("/login?logout")
);
4. CSRF 보호
기본적으로 활성화되어 있음
테스트나 H2 콘솔 접근 시 비활성화 가능
http.csrf(csrf -> csrf.disable());
5. 예외 처리
인증 실패, 권한 부족 시 커스텀 페이지로 리다이렉트 가능
http
.exceptionHandling(ex -> ex
.accessDeniedPage("/access-denied")
);
#코드 예시
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().permitAll()
)
.formLogin(form -> form
.loginPage("/login")
.defaultSuccessUrl("/home", true)
.permitAll()
)
.logout(logout -> logout
.logoutSuccessUrl("/login?logout")
)
.csrf(csrf -> csrf.disable());
return http.build();
}
}
#마치며
Spring Security는 Spring 애플리케이션의 보안 표준 도구로, 복잡한 인증/인가 로직을 간단하게 구현할 수 있게 해준다.
다만, 설정이 다양하고 버전별로 변경점이 많기 때문에 기본 구조를 이해하고 점진적으로 확장하는 방식이 가장 효과적이다.