[그림일기 서비스 보고 공부하기] Spring Security의 ROLE_ 접두사

오젼·2024년 10월 5일
0

Spring Security에서 ROLE_ 접두사는 권한(Authority)과 역할(Role)을 구분하는 중요한 규약입니다.

  1. ROLE_ 접두사의 의미:

    • Spring Security에서 ROLE_ 접두사가 붙은 권한은 '역할'로 취급됩니다.
    • ROLE_ 없이 정의된 권한은 '권한'으로 취급됩니다.
  2. Spring Security에서의 사용:

    • 설정: SecurityConfig나 WebSecurityConfigurerAdapter를 상속한 클래스에서 권한 설정 시 사용됩니다.
    • 어노테이션: @Secured, @PreAuthorize 등의 어노테이션에서 사용됩니다.
  3. 사용 예시:

    a. 설정 클래스에서:

    http.authorizeRequests()
        .antMatchers("/admin/**").hasRole("ADMIN")
        .antMatchers("/user/**").hasRole("USER");

    여기서 hasRole("ADMIN")은 내부적으로 "ROLE_ADMIN" 권한을 체크합니다.

    b. 메소드 레벨 보안:

    @PreAuthorize("hasRole('ADMIN')")
    public void adminOnlyMethod() {
        // 관리자만 접근 가능한 메소드
    }

    이 어노테이션도 "ROLE_ADMIN" 권한을 체크합니다.

  4. hasRole vs hasAuthority:

    • hasRole("ADMIN")은 내부적으로 "ROLE_" 접두사를 추가하여 "ROLE_ADMIN"을 체크합니다.
    • hasAuthority("ROLE_ADMIN")은 정확히 "ROLE_ADMIN"이라는 권한을 체크합니다.
  5. 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"를 반환합니다.

  6. 주의사항:

    • Spring Security 5.7 이상 버전에서는 WebSecurityConfigurerAdapter가 deprecated되었습니다. 대신 SecurityFilterChain 빈을 사용하는 것이 권장됩니다.
  7. 새로운 설정 방식 (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는 역할 기반의 접근 제어를 쉽게 구현할 수 있게 해줍니다. 이를 통해 애플리케이션의 보안을 더 체계적이고 직관적으로 관리할 수 있습니다.

0개의 댓글