Spring Security
spring security에서 authority와 role의 차이점
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를 통해 처리한다는 것을 알고, 요구사항에 따라 권한 및 역할을 잘 정의하고 유저마다 알맞은 메소드를 사용해야 한다.
반응형