[java] Spring Security를 이용한 보안 기능 구현

보안은 모든 웹 응용 프로그램에서 중요한 부분입니다. 사용자 인증, 권한 부여 및 보호된 자원에 대한 접근 제어를 구현하는 것은 보안 기능을 만족시키기 위해 필요한 작업입니다. Spring Security는 이러한 보안 기능을 간편하게 구현할 수 있도록 도와주는 Java 기반의 보안 프레임워크입니다.

Spring Security 설정

Spring Security를 사용하기 위해 먼저 pom.xml에 다음 의존성을 추가해야 합니다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

그리고 다음과 같이 SecurityConfig라는 클래스를 생성하여 Spring Security 설정을 구현합니다.

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .and()
            .logout()
                .logoutUrl("/logout")
                .logoutSuccessUrl("/login?logout")
                .and()
            .csrf()
                .disable();
    }

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

위의 코드에서 configure(HttpSecurity http) 메서드는 URL 패턴과 역할에 따른 접근 제어를 설정하는 역할을 합니다. /admin/** 패턴의 URL은 “ADMIN” 역할을 가진 사용자만 접근할 수 있습니다. 이외의 모든 URL은 인증된 사용자만 접근할 수 있습니다.

configureGlobal(AuthenticationManagerBuilder auth) 메서드는 사용자를 인증하는 역할을 합니다. 위의 예시에서는 사용자를 메모리에 저장하고 있지만, 실제 애플리케이션에서는 데이터베이스를 사용하여 사용자를 관리하는 것이 일반적입니다.

커스텀 사용자 인증

Spring Security는 다양한 인증 방식을 지원합니다. 사용자 이름과 비밀번호를 데이터베이스에 저장하고 사용자를 인증하는 경우를 예로 들어보겠습니다.

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .and()
            .logout()
                .logoutUrl("/logout")
                .logoutSuccessUrl("/login?logout")
                .and()
            .csrf()
                .disable();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .userDetailsService(userDetailsService)
            .passwordEncoder(passwordEncoder());
    }
}

위의 예시에서는 UserDetailsService 인터페이스를 구현한 CustomUserDetailsService를 사용하여 사용자를 인증합니다. 데이터베이스에 저장된 사용자 정보를 이용하여 인증을 수행하고, 비밀번호는 암호화하여 저장합니다.

결론

Spring Security를 사용하여 웹 응용 프로그램의 보안 기능을 쉽게 구현할 수 있습니다. 이 글에서는 Spring Security를 설정하고 커스텀 사용자 인증 방식을 구현하는 방법을 살펴보았습니다. Spring Security를 활용하여 안전한 애플리케이션을 개발하는 데 도움이 되길 바랍니다.

참고 자료: