[Spring] Spring Security 기본 이해 - (5)

2022. 7. 13. 20:49Web/Spring

목적 : Authorization, FilterSecurityInterceptor,  AccessDecisionManager, AccessDecisionVoter 이해


Authorization

 

지난 번에 확인했던 Authentication과 연결이 된다.

GrantedAuthority 객체는 AuthenticationManager를 통해 Authentication에 저장이 되는데 후에 Authorize를 할 대 AuthorizationManager에서 읽는다.

 

여기서 살펴볼 부분은 GrantedAuthority의 getAuthority 메소드다.

String getAuthority();

getAuthority 메소드는 AuthorizationManager가 특정한 String을 얻도록 한다. String을 리턴한 getAuthority는 AuthorizationManager와 AccessDecisionManager에 의해 읽혀진다.

 

 

AuthorizationManager

 

AuthrizationManager는 AccessDecisionManager와 AccessDecisionVoter 로 대체될 수 있다.

 

AuthrizationManager는 AuthorizationFilter에 의해 호출되고 최종 결정에 접근할 수 있게 한다. AuthorizationManager 인터페이스는 두 개의 메소드(check, verify)를 포함한다.

AuthorizationDecision check(Supplier<Authentication> authentication, Object secureObject);

default AuthorizationDecision verify(Supplier<Authentication> authentication, Object secureObject)
        throws AccessDeniedException {
    // ...
}

- check 매소드는 Authorization을 하는 데 필요한 관련한 정보를 넘긴다. 

- verify는 check를 호출하고, 만약 AuthroizationDecision이 실패한다면 AccessDeniedException를 발생시킨다.

 

 

AccessDecisionManager & AccessDecisionVoter

 

AccessDecisionManager는 AbstractSecurityInterceptor에 의해 호출 되고 최종 관리 결정을 만드는 데에 책임이 있다.

AccessDecisionManager 인터페이스는 세 가지 메소드가 있다.

void decide(Authentication authentication, Object secureObject,
	Collection<ConfigAttribute> attrs) throws AccessDeniedException;

boolean supports(ConfigAttribute attribute);

boolean supports(Class clazz);

- decide : Authrization에 관련한 정보를 넘긴다.

- supports(ConfigAttribute) : AbstractSecurityInterceptor가 시작할 때, ConfigAttribute를 전달하며 AccessDecisionManager가 진행할 수 있을지 결정할 때 호출된다.

- supports(Class) : security interceptor implementation 에 의해 호출되고, 설정된 AccessDecisionManager가 security interceptor가 나타내는 특정한 보안 타입을 지지하고 있는지 확인한다. 

 

 

이 두 관계는 아래 그림과 같다. 

 

 

AccessDecisionVoter 인터페이스는 세 개의 메소드가 있다. 

int vote(Authentication authentication, Object object, Collection<ConfigAttribute> attrs);

boolean supports(ConfigAttribute attribute);

boolean supports(Class clazz);

- vote : int를 반환하하는데 이는 ACCESS_ABSTAIN, ACCSS_DENIDE, ACCESS_GRANTED를 나타낸다.

(ACCESS_ABSTRAIN은 authorization 결정이 없다면, 결정권이 있다면 ACCESS_DENIED와 ACCESS_GRANTED를 리턴한다.)

 

RoleVoter

 

 

참고 

https://docs.spring.io/spring-security/reference/5.7.0-M2/servlet/authorization/architecture.html#authz-legacy-note