[스프링] 스프링 시큐리티

스프링 프레임워크는 다양한 보안 기능을 제공하는데, 그 중에서도 스프링 시큐리티(Spring Security) 는 웹 애플리케이션의 보안을 강화하는 데 도움을 주는 핵심적인 기능이다. 이를 통해 웹 애플리케이션의 접근 제어, 사용자 인증, 권한 부여 등을 쉽게 구현할 수 있다. 이제 스프링 시큐리티를 사용하여 안전한 웹 애플리케이션을 구축하는 방법에 대해 알아보겠다.

스프링 시큐리티 설정하기

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/home").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                .withUser("user").password("password").roles("USER");
    }
}

WebSecurityConfig 클래스를 작성하여 WebSecurityConfigurerAdapter 를 확장한 후에, configure 메서드를 오버라이딩하여 HTTP 보안을 구성할 수 있다. 이를 통해 URL 별 접근 제어 및 사용자 인증 처리 등을 설정할 수 있다.

사용자 인증 및 권한 부여

스프링 시큐리티를 사용하면 손쉽게 사용자를 인증하고 권한을 부여할 수 있다. 인증은 사용자의 자격 증명(아이디, 비밀번호)을 확인하는 과정을 말하며, 권한 부여는 특정 리소스에 접근할 수 있는 권한을 부여하는 것을 말한다.

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/", "/home").permitAll()
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .loginPage("/login")
            .permitAll()
            .and()
        .logout()
            .permitAll();
}

위 코드는 “/”와 “/home” 경로에 대해 모든 사용자에게 접근을 허용하고, 나머지 모든 요청에 대해 인증을 요구한다는 설정을 하고 있다.

커스텀한 인증 및 권한 부여 로직 구현

스프링 시큐리티를 사용할 때, 커스텀한 인증 및 권한 부여 로직을 구현할 수도 있다. 예를 들어, DB에 저장된 사용자 정보를 이용하여 로그인 인증을 처리하거나, 동적으로 권한을 부여할 수 있다.

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth
        .jdbcAuthentication()
            .dataSource(dataSource)
            .usersByUsernameQuery("select username, password, enabled from users where username=?")
            .authoritiesByUsernameQuery("select username, authority from authorities where username=?");
}

위 코드에서는 jdbcAuthentication 메서드를 사용하여 데이터베이스를 통한 사용자 인증을 구성하고 있다.

스프링 시큐리티는 다양한 방식으로 보안 설정을 구성할 수 있으며, 풍부한 확장성과 커스터마이징 기능을 제공한다.

이상으로 스프링 시큐리티를 사용하여 안전한 웹 애플리케이션을 구축하는 방법에 대해 알아보았다.

참고문헌: