[java] 스프링 시큐리티를 사용한 인증과 권한 관리

인증(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
}

CustomUserDetailsUserDetails 인터페이스를 구현하는 사용자 정의 클래스이며, CustomUserDetailsServiceUserDetailsService 인터페이스를 구현하여 사용자 정보를 로드하는 데 사용됩니다.

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();
}

마무리

스프링 시큐리티를 사용하여 인증과 권한 부여를 구현하는 방법을 살펴보았습니다. 이를 통해 안전하고 보안된 웹 애플리케이션을 구축하는 데 도움이 되기를 바랍니다.

참고문헌: