인증(Authentication)과 권한부여(Authorization)은 웹 애플리케이션의 중요한 부분입니다. 스프링 시큐리티는 이러한 보안 요구를 처리하기 위한 강력한 도구입니다. 이 포스트에서는 스프링 부트를 사용하여 스프링 시큐리티를 구성하고, 사용자의 인증 및 권한 관리를 수행하는 방법에 대해 알아보겠습니다.
1. 스프링 부트 프로젝트 설정
우선, 스프링 부트 프로젝트에 스프링 시큐리티를 추가합니다. pom.xml
파일에 다음 의존성을 추가합니다:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2. 사용자 및 권한 관리
사용자와 권한 정보는 일반적으로 데이터베이스에 저장됩니다. 스프링 시큐리티는 사용자와 권한을 관리하기 위한 다양한 기능을 제공합니다. 사용자 정보는 기본적으로 UserDetails
인터페이스를 구현하여 표현되며, 사용자 이름, 비밀번호, 권한 등의 정보를 포함합니다.
public class CustomUserDetails implements UserDetails {
private String username;
private String password;
private List<GrantedAuthority> authorities;
// ... constructor and methods
}
public class CustomUserDetailsService implements UserDetailsService {
// ... loadUserByUsername method
}
CustomUserDetails
는 UserDetails
인터페이스를 구현하는 사용자 정의 클래스이며, CustomUserDetailsService
는 UserDetailsService
인터페이스를 구현하여 사용자 정보를 로드하는 데 사용됩니다.
3. 인증 프로세스
사용자의 로그인 인증은 AuthenticationManager
를 통해 처리됩니다. 스프링 시큐리티는 자체적으로 AuthenticationManager
를 가지고 있지만, 사용자 정의 인증 로직이 필요한 경우 UserDetailsService
를 구현하여 커스터마이징할 수 있습니다.
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private CustomUserDetailsService userDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
}
// ... other security configurations
}
SecurityConfig
클래스는 WebSecurityConfigurerAdapter
를 확장하여 보다 세부적인 보안 구성을 제공합니다. configure
메서드를 오버라이드하여 UserDetailsService
를 제공하는 방식으로 사용자 정의 인증을 구성합니다.
4. 권한 관리
스프링 시큐리티는 사용자의 권한을 GrantedAuthority
객체로 표현합니다. GrantedAuthority
는 사용자가 가질 수 있는 권한을 나타내는 인터페이스이며, ROLE_USER
, ROLE_ADMIN
등과 같은 역할을 표현할 수 있습니다.
public enum Role implements GrantedAuthority {
ROLE_USER, ROLE_ADMIN;
@Override
public String getAuthority() {
return name();
}
}
사용자에게 권한을 부여하기 위해 configure
메서드에서 HttpSecurity
객체를 사용하여 URL별 권한 설정을 할 수 있습니다.
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole(Role.ROLE_ADMIN.name())
.antMatchers("/user/**").hasRole(Role.ROLE_USER.name())
.and()
.formLogin();
}
마무리
스프링 시큐리티를 사용하여 인증과 권한 부여를 구현하는 방법을 살펴보았습니다. 이를 통해 안전하고 보안된 웹 애플리케이션을 구축하는 데 도움이 되기를 바랍니다.
참고문헌: