스프링 시큐리티는 인증과 권한 부여를 관리하기 위한 프레임워크입니다. 권한은 보안을 강화하고 애플리케이션의 데이터나 기능에 접근하는 제한을 설정하는데 사용됩니다. 스프링 시큐리티에서는 권한을 계층 구조로 구성할 수 있습니다.
권한 계층 구조의 필요성
권한 계층 구조는 다양한 권한을 정의하고 이를 조직적으로 관리하기 위해 사용됩니다. 예를 들어, “관리자”와 “사용자”라는 두 가지 기본 권한이 있다면, 보다 세부적인 권한인 “관리자”는 “사용자”보다 더 높은 수준의 접근 권한을 가질 수 있습니다.
이렇게 권한을 계층 구조로 구성하면 관리 및 유지보수를 용이하게 할 수 있습니다. 새로운 권한을 추가할 때마다 일일히 모든 권한을 수정하는 대신 계층 구조에 따라 상위 권한을 할당하고 하위 권한을 상속할 수 있기 때문입니다.
스프링 시큐리티에서의 권한 계층 구조 구현
스프링 시큐리티에서는 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
클래스를 사용하여 권한 계층 구조를 설정할 수 있습니다. 이를 통해 보다 유연하고 안전한 애플리케이션을 구축할 수 있습니다.
참고 자료: