Spring Security에서 ROLE_ 접두사는 권한(Authority)과 역할(Role)을 구분하는 중요한 규약입니다.
ROLE_ 접두사의 의미:
Spring Security에서의 사용:
사용 예시:
a. 설정 클래스에서:
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").hasRole("USER");
여기서 hasRole("ADMIN")
은 내부적으로 "ROLE_ADMIN" 권한을 체크합니다.
b. 메소드 레벨 보안:
@PreAuthorize("hasRole('ADMIN')")
public void adminOnlyMethod() {
// 관리자만 접근 가능한 메소드
}
이 어노테이션도 "ROLE_ADMIN" 권한을 체크합니다.
hasRole vs hasAuthority:
hasRole("ADMIN")
은 내부적으로 "ROLE_" 접두사를 추가하여 "ROLE_ADMIN"을 체크합니다.hasAuthority("ROLE_ADMIN")
은 정확히 "ROLE_ADMIN"이라는 권한을 체크합니다.UserDetailsService 구현:
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findByUsername(username)
.orElseThrow(() -> new UsernameNotFoundException("User not found"));
return new org.springframework.security.core.userdetails.User(
user.getUsername(),
user.getPassword(),
Collections.singletonList(new SimpleGrantedAuthority(user.getRole().getKey()))
);
}
여기서 user.getRole().getKey()
는 "ROLE_ADMIN" 또는 "ROLE_USER"를 반환합니다.
주의사항:
WebSecurityConfigurerAdapter
가 deprecated되었습니다. 대신 SecurityFilterChain
빈을 사용하는 것이 권장됩니다.새로운 설정 방식 (Spring Security 5.7+):
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(authz -> authz
.requestMatchers("/admin/**").hasRole("ADMIN")
.requestMatchers("/user/**").hasRole("USER")
.anyRequest().authenticated()
);
return http.build();
}
ROLE_ 접두사를 사용함으로써, Spring Security는 역할 기반의 접근 제어를 쉽게 구현할 수 있게 해줍니다. 이를 통해 애플리케이션의 보안을 더 체계적이고 직관적으로 관리할 수 있습니다.