728x90
Method Security 동작방식
Method Security동작 방식
- 스프링 시큐리티에서 제공하는 Method Security는 다음과 같은 상황에서 유용할 수 있습니다.
- 세분화된 Authorization 로직 추출 : 예를 들자면, 메서드 파라미터나 반환 값이 Authorization에 영향을 미치는 경우
- 서비스 레이어에서 보안을 강제하고자 하는 경우
- HttpSecurity기반 설정대신 애노테이션 기반으로 처리하고자 하는 경우
- Method Security는 스프링 AOP를 사용해 만들어졌기 때문에 필요한 경우 스프링 시큐리티 기본값을 재정의(Override) 하여 사용할 수 있습니다.
💡 `@EnableMethodSecurity`는 Deprecated된 `@EnableGloablMethodSecurity`를 대체하는데 다음과 같은 개선점을 가지고 있습니다. 1. `Metadata sources`, `config attributes`, `decision managers`, 그리고 `voters`를 사용하는 대신 단순화된 `AuthorizationManager`를 사용합니다. 이는 재사용과 커스터마이징을 좀 더 간편하게 할 수 있도록 해줍니다. 2. Bean을 커스터마이징 하기 위해 `GlobalMethodSecurityConfiguration`을 extend할 필요 없이 직접적인 빈 기반 구성을 제공합니다. 3. 스프링 AOP를 사용해 만들어졌습니다. 추상화를 제거하고 Spring AOP building block을 사용하여 커스터마이징이 가능합니다. 4. JSR-250을 준수합니다. 5. 기본적으로 `@PreAuthorize`, `@PostAuthorize`, `@PreFilter`,`@PostFilter` 를 사용할 수 있습니다.
- Method Security는 메소드 전-후 authorization의 조합입니다.
@Service
public class MyCustomerService {
@PreAuthorize("hasAuthority('permission:read')")
@PostAuthorize("returnObject.owner == authentication.name")
public Customer readCustomer(String id) { ... }
}
- Method Security가 설정 된 MyCustomerService의 readCustomer 메소드를 호출했을때 내부적으로 발생하는 흐름은 다음과 같습니다.
Spring Aop
가 우선readCustomer
의 프록시 메서드를 호출합니다. 프록시의 어드바이저들 중에 @PreAuthorize의 포인트컷과 매치되는AuthorizationManagerBeforeMethodInterceptor
를 호출합니다.AuthorizationManagerBeforeMethodInterceptor
는PreAuthorizeAuthorizationManager
의check
를 호출합니다.PreAuthorizeAuthorizationManager
는MethodSecurityExpressionHandler
를 사용하여 @PreAuthorize 애노테이션의 SpEL을 분석하고, MethodSecurityExpressionRoot를 사용해 Supplier과 MethodInvocation을 포함하고 있는 EvaluationContext를 생성한다.AuthorizationManagerBeforeMethodInterceptor
는EvaluationContext
를 사용하여Expression
을 체크합니다.. 구체적으로는,Supplier
에서Authentication
을 읽어온 뒤, authorities에permission:read
를 포함하고 있는지 확인합니다.- 체크가 통과되면
Spring AOP
가 메소드 호출을 진행합니다. - 만약 통과하지 못했다면,
AuthorizationManagerBeforeMethodInterceptor
는AuthorizationDeniedEvent
를 발생시키고AccessDeniedException
을 throw 합니다. 이 Exception은ExceptionTranslationFilter
에서 잡히고, 403 상태코드를 응답으로 반환합니다. readCustomer
메서드가 값을 반환한 뒤, Spring AOP는@PostAuthorize
의 포인트컷과 매치되는AuthorizationManagerAfterMethodInterceptor
를 호출합니다. 위에서 설명한 방식과 동일하게 진행되지만PreAuthorizeAuthorizationManager
대신PostAuthorizationManager
를 사용합니다.- 만약 체크가 통과하면(예시 코드의 경우 반환 값이 logged-in-user의 값이라면) 정상적으로 나머지 프로세스를 진행합니다.
- 만약 통과하지 못했다면,
AuthorizationDeniedEvent
를 발생시키고,AccessDeniedException
을 throw 합니다. 이 역시ExceptionTranlsationFilter
에서 잡혀, 403 상태코드를 응답으로 반환합니다.
728x90
'Spring' 카테고리의 다른 글
Container Overview - 스프링 공식문서가 말하는 컨테이너 (0) | 2024.01.22 |
---|---|
Introduction to the Spring IoC Container and Beans - 스프링 IoC 컨테이너와 Beans 소개 (0) | 2024.01.21 |
토비의 스프링 부트 (0) | 2023.11.28 |
토비의 스프링 5일차 (0) | 2023.07.26 |
토비의 스프링 4일차 (0) | 2023.07.19 |