
대장장이 프로젝트를 진행하면서 인가 관련 로직을 구현하기 위해 이전에 알게되었던 Method Security 에 대해서 학습 및 정리 후 프로젝트 내 도입해볼 예정입니다.
Method Security :: Spring Security
스프링 시큐리티는 Request Level 뿐만 아니라 method level에서도 인가 관련 처리를 지원합니다.
이는 기본적으로 활성화되어 있지 않으며, 이를 활성화 시키기 위해서는 아무 @Configuration 클래스에 @EnableMethodSecurity 어노테이션을 추가해주면 됩니다.
@EnableMethodSecurity
method level 에서의 Security 동작을 예를 들어서 설명하겠습니다.
다음과 같이 Method Security를 사용하고 있는 서비스가 있다고 가정하겠습니다.
@Service
public class MyCustomerService {
@PreAuthorize("hasAuthority('permission:read')")
@PostAuthorize("returnObject.owner == authentication.name")
public Customer readCustomer(String id) { ... }
}
위 코드의 동작을 자세하게 보면, 다음과 같습니다.
PostAuthorizeAuthorizationManager 에 의해 메서드가 호출된다는 점이 다릅니다.@PreAuthorize("hasAuthority('permission:read') || hasAuthority('ADMIN')")permission:read 권한이 있거나 ADMIN role을 가진 회원은 해당 자원에 접근이 가능합니다.
하지만, 이를 RoleHierachy를 활용하게 되면 간단하게 표현할 수 있습니다.
@Bean
static RoleHierarchy roleHierarchy() {
return RoleHierarchyImpl.fromHierarchy("ROLE_ADMIN > permission:read");
}
위 설정을 통해서 다음과 같이 설정할 수 있습니다.
@PreAuthorize("hasAuthority('permission:read')")

둘을 비교한 간단한 표가 공식 문서에 명시되어 있습니다. request-level에서의 권한 처리가 조금 더 러프하게 처리하고, method-level이 조금 더 세밀하게 권한 부여가 가능합니다. config 위치는 request-level은 config 클래스 내부에 정의하고, method-level은 메서드 상단에 정의합니다. request-level은 DSL을 사용하고, method-level은 어노테이션을 사용하고, 정의는 request는 programmatic, method는 Spring Expression Language를 사용합니다.
ROLE_ 을 자동으로 붙여줍니다.ROLE_ 을 자동으로 붙여줍니다.위처럼 간단하게 구현에 필요한 일부 내용들만 공식문서에서 찾아서 정리해보았습니다. 관련해서 조금 더 Deep 하게 학습이 필요하다면, 공식문서를 참고하여 차차 추가해 나갈 예정입니다.