
Spring Security 인증과 인가 기초 완벽 가이드
Spring Security는 Spring 기반 애플리케이션에서 인증(Authentication)과 인가(Authorization)를 처리하는 보안 프레임워크입니다. 이 글에서는 Spring Security의 기본 개념과 작동 방식, 실무 적용 방법을 중심으로 설명합니다.
1. 인증과 인가란?
- 인증 (Authentication): 사용자의 신원을 확인하는 절차 (로그인)
- 인가 (Authorization): 인증된 사용자가 특정 리소스에 접근할 수 있는 권한이 있는지를 검사
2. Spring Security의 기본 작동 흐름
- 사용자가 로그인 폼을 통해 아이디/비밀번호 제출
UsernamePasswordAuthenticationFilter가 인증 시도AuthenticationManager가 사용자 정보 확인SecurityContext에 인증된 사용자 정보 저장- 인가 단계에서 접근 권한 확인
3. 기본 설정 예제 (SecurityConfig)
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/", "/login", "/signup").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/home")
.and()
.logout()
.logoutSuccessUrl("/login?logout");
}
}
4. 사용자 정보 처리 (UserDetailsService)
Spring Security는 사용자 정보를 커스터마이징할 수 있도록 UserDetailsService 인터페이스를 제공합니다.
@Service
public class CustomUserDetailsService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) {
// DB에서 사용자 조회
return new User(username, password, List.of(new SimpleGrantedAuthority("ROLE_USER")));
}
}
5. 패스워드 암호화 (PasswordEncoder)
실무에서는 비밀번호를 반드시 암호화하여 저장하고 검증해야 합니다.
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
6. 권한 기반 접근 제어
hasRole("ROLE_ADMIN"): ROLE 기반 접근 제어hasAuthority("READ_PRIVILEGE"): 세분화된 권한 기반 제어- 메서드 보안:
@PreAuthorize("hasRole('ADMIN')")사용 가능
7. SecurityContext의 구조
- SecurityContextHolder: 현재 사용자 인증 정보 저장
- Authentication: 인증 객체
- Principal: 실제 사용자 정보 (UserDetails)
8. 실무 적용 팁
- 사용자 테이블: username, password, role 필드는 필수
- 권한은 "ROLE_" prefix가 필수 (예: ROLE_USER)
- 세션 타임아웃 및 CSRF 설정 확인
- REST API 개발 시 JWT + Stateless 방식 고려
9. 결론
Spring Security는 스프링 애플리케이션에서 인증과 인가를 체계적으로 구현할 수 있는 보안 프레임워크입니다. 기본 구조와 흐름을 이해하고 UserDetailsService, PasswordEncoder, SecurityContext 등을 정확히 설정하면 실무에서도 안전한 로그인 및 권한 관리를 구현할 수 있습니다.