[java] 스프링 시큐리티에서의 권한 계층 구조

스프링 시큐리티는 인증과 권한 부여를 관리하기 위한 프레임워크입니다. 권한은 보안을 강화하고 애플리케이션의 데이터나 기능에 접근하는 제한을 설정하는데 사용됩니다. 스프링 시큐리티에서는 권한을 계층 구조로 구성할 수 있습니다.

권한 계층 구조의 필요성

권한 계층 구조는 다양한 권한을 정의하고 이를 조직적으로 관리하기 위해 사용됩니다. 예를 들어, “관리자”와 “사용자”라는 두 가지 기본 권한이 있다면, 보다 세부적인 권한인 “관리자”는 “사용자”보다 더 높은 수준의 접근 권한을 가질 수 있습니다.

이렇게 권한을 계층 구조로 구성하면 관리 및 유지보수를 용이하게 할 수 있습니다. 새로운 권한을 추가할 때마다 일일히 모든 권한을 수정하는 대신 계층 구조에 따라 상위 권한을 할당하고 하위 권한을 상속할 수 있기 때문입니다.

스프링 시큐리티에서의 권한 계층 구조 구현

스프링 시큐리티에서는 GrantedAuthority 인터페이스를 통해 권한을 정의하고 관리할 수 있습니다. 이 인터페이스를 구현하는 클래스는 사용자의 권한을 나타내며, 계층 구조를 표현하기 위해 상위 권한을 갖는 권한을 할당할 수 있습니다.

아래는 스프링 시큐리티에서 권한 계층 구조를 구현하는 예제 코드입니다.

import org.springframework.security.core.GrantedAuthority;

public class CustomAuthority implements GrantedAuthority {

    private String authority;
    private CustomAuthority parent;

    public CustomAuthority(String authority) {
        this.authority = authority;
    }

    public void setParent(CustomAuthority parent) {
        this.parent = parent;
    }

    @Override
    public String getAuthority() {
        return authority;
    }

    public boolean hasParent() {
        return parent != null;
    }

    public CustomAuthority getParent() {
        return parent;
    }
}

위 코드에서 CustomAuthority 클래스는 GrantedAuthority 인터페이스를 구현하고, 권한 계층 구조를 표현하기 위해 parent 속성을 추가했습니다. setParent 메서드를 통해 상위 권한을 할당할 수 있으며, hasParent 메서드와 getParent 메서드를 사용하여 상위 권한을 확인하고 가져올 수 있습니다.

권한 계층 구조의 사용

권한 계층 구조를 사용하는 방법은 상황에 따라 다를 수 있습니다. 예를 들어, 스프링 시큐리티의 RoleHierarchy 클래스를 사용하여 권한 계층 구조를 정의하고 관리할 수 있습니다.

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // ...
        RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
        roleHierarchy.setHierarchy("ROLE_ADMIN > ROLE_USER");

        http.authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .antMatchers("/user/**").hasRole("USER")
            .anyRequest().authenticated()
            .and()
            .logout()
            .and()
            .formLogin();

        http.hierarchicalRoleNames()
            .roleHierarchy(roleHierarchy);
    }
}

위의 예제에서는 RoleHierarchyImpl 클래스를 생성하여 “ROLE_ADMIN” 권한이 “ROLE_USER”보다 더 높은 계층 구조를 정의했습니다. 이를 통해 “/admin/” 경로는 “ROLE_ADMIN” 권한을 가진 사용자에게만 접근이 허용되고, “/user/” 경로는 “ROLE_USER” 권한을 가진 사용자에게만 접근이 허용됩니다.

결론

스프링 시큐리티에서의 권한 계층 구조는 권한을 조직적으로 관리하고 유지보수를 용이하게 할 수 있는 강력한 도구입니다. GrantedAuthority 인터페이스를 구현하여 권한 계층 구조를 표현하고, RoleHierarchy 클래스를 사용하여 권한 계층 구조를 설정할 수 있습니다. 이를 통해 보다 유연하고 안전한 애플리케이션을 구축할 수 있습니다.


참고 자료: