상세 컨텐츠

본문 제목

spring security에서 authority와 role의 차이점

Spring Security

by Wanderer Kim 2025. 5. 8. 21:06

본문

728x90
반응형

spring security를 공부하면서 사용자 접근 제어를 위해 authority와 role 두 가지 개념을 제공하는 것을 알았다. 두 개념이 어떻게 다른지에 대해서 정리해보았다.

 

Authority와 Role의 차이점

  • Authority
    • Authority는 애플리케이션 내에서 사용자가 수행할 수 있는 구체적인 행동이나 작업을 정의한다
    • .세분화된 접근 제어를 위해 사용된다.
    • 특정 기능이나 리소스에 대한 접근 권한을 나타낸다.
  • Role
    • Role은 여러 권한을 그룹화한 개념이다.
    • 보다 포괄적인 접근 제어를 위해 사용된다.
    • 사용자나 사용자 그룹에 권한을 할당하는 방법을 제공한다.
    • Role은 항상 "ROLE_" prefix를 사용해야 한다.

Authority와 Role 사용방법

spring security에서는 User를 이용해 authority와 role을 쉽게 설정할 수 있다.

@Bean
    public UserDetailsService userDetailsService() {
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();

        UserDetails user1 = User.withUsername("john")
            .password("{noop}12345")
            .authorities("READ")
            .build();

        UserDetails user2 = User.withUsername("jane")
            .password("{noop}12345")
            .authorities("WRITE")
            .build();

        manager.createUser(user1);
        manager.createUser(user2);

        return manager;
    }

위 코드는 "john"에게 "READ" 권한을 주고 "jane"에게는 "WRITE" 권한 준다.

@Bean
    public UserDetailsService userDetailsService() {
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();

        UserDetails user1 = User.withUsername("john")
            .password("{noop}12345")
//            .authorities("ROLE_ADMIN")
            .roles("ADMIN") // roles() 메서드를 이용할때는 ROLE prefix를 사용하지 말아야 함
            .build();

        UserDetails user2 = User.withUsername("jane")
            .password("{noop}12345")
//            .authorities("ROLE_MANAGER")
            .roles("MANAGER")
            .build();

        manager.createUser(user1);
        manager.createUser(user2);

        return manager;
    }

위의 예제는 roles()메서드를 이용해서 "john"과 "jane" 에게 각각 "ADMIN","MANAGER" 역할을 부여한다.

역할을 정의할 때 authorieis() 메서드를 이용할 수 있지만 "ROLE_" prefix를 붙여한다는 점을 유의해야 한다.

 

authority와 role에 따른 접근 허용하는 방법

@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public SecurityFilterChain httpSecurity(HttpSecurity http) {
        http
            .authorizeRequests()
            .antMatchers("/admin/*").hasRole("ADMIN") // ROLE_ 접두사 자동 추가
            .antMatchers("/auth/**").hasAnyRole("ADMIN", "USER") // 여러 역할 중 하나
            .antMatchers("/data/**").hasAuthority("ROLE_ADMIN") // 전체 문자열 명시
            .anyRequest().authenticated();
        
        return http.build();
    }
}

위 예제 코드는 endpoint 별로 role과 authority에 따라 접근 허용 여부를 설정하는 방법을 보여준다.

  • hasAuthority(): 하나의  authority 에 대해 endpoint 접근을 허용할 때 사용한다.
  • hasAnyAuthority(): 여러개의 authorieis에 대해서 접근 허용할 때 사용한다.
  • hasRole():  하나의 role에 대해 접근 허용할 대 사용한다.
  • hasAnyRole(): 여러개의 role에 대해서 접근 허용할 때 사용한다.

 

결론

spring security에서는 권한과 역할을 SimpleGrantedAuthority를 통해 처리한다는 것을 알고, 요구사항에 따라 권한 및 역할을 잘 정의하고 유저마다 알맞은 메소드를 사용해야 한다.

728x90

'Spring Security' 카테고리의 다른 글

DelegatingPasswordEncoder 란?  (0) 2025.04.30
UserDetailsService와 UserDetailsManager  (0) 2025.04.27
Spring Security 인증 흐름  (0) 2025.04.27

관련글 더보기

댓글 영역