# Back-End/Spring

@Secured, @PreAuthorized를 이용한 메소드 수준의 권한 적용

Spring Security의 메소드 수준의 API 권한 관리

API 경로에 권한을 적용하여 관리하다 보면, 같은 기능을 여러 권한에서 사용할 수 있게 중복으로 코드를 작성하는 문제가 발생합니다. 예를 들면 사용자가 주문정보를 조회하는 것과 어드민이 한 사용자의 게임을 조회하는 것 등이 있습니다. API 경로에 대해 권한을 관리하는 것이 아닌 메소드 수준에서 권한을 설정하는 방법을 알아봅니다.

 

 

@Secured와 @PreAuthorize 어노테이션

두 어노테이션 모두 Spring Security의 어노테이션으로, 메소드 수준의 보안을 제공하는 데 사용됩니다. 동일한 기능을 제공하지만 약간의 차이가 있습니다.

 

@PreAuthroize는 Spring EL(표현식)을 사용할 수 있고, AND나 OR 같은 표현식을 사용할 수 있습니다.

// ROLE_USER와 ROLE_ADMIN 두 개의 권한을 가져야 접근 가능
@PreAuthorize("hasRole('ROLE_USER') and hasRole('ROLE_ADMIN')")

 

@Secured는 표현식을 사용할 수 없고 OR 문만 표현할 수 있습니다.

// ROLE_USER 또는 ROLE_ADMIN 중 하나의 권한을 가지고 있다면 접근 가능
@Secured({"ROLE_USER", "ROLE_ADMIN"})

 

프로젝트 적용

/**
* MethodSecurityConfig.class
*/

@Configuration
@EnableGlobalMethodSecurity(
        prePostEnabled = true,
        securedEnabled = true,
        jsr250Enabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
}

메소드 수준의 보안 설정은 기본적으로 비활성화 되어 있기 때문에 전역 설정 클래스를 작성해서 원하는 속성을 활성화시킵니다.

GlobalMethodSecurity 사용을 활성화 하는 @EnableGlobalMethodSecurity 어노테이션을 추가

  • prePostEnabled - Spring Security의 @PreAuthorize, @PreFilter /@PostAuthorize, @PostFilter어노테이션 활성화 여부
  • securedEnabled - @Secured어노테이션 활성화 여부
  • jsr250Enabled - @RoleAllowed 어노테이션 사용 활성화 여부

 

메소드에 권한 적용하기

    @Secured({UserRole.ROLES.ADMIN})

또는

    @PreAuthorize("hasRole('" + UserRole.ROLES.ADMIN + "')")


////////////////////////


    // enum 클래스에 정의
    public static class ROLES {
        public static final String USER = "ROLE_USER";
        public static final String ADMIN = "ROLE_ADMIN";
    }

적용하려는 메소드에 어노테이션을 작성해주면 권한이 적용됩니다.

 

728x90