[Spring Security] 권한 부여 처리 흐름

·2022년 11월 22일
0

SpringSecurity

목록 보기
4/13
post-thumbnail

권한 부여 처리 흐름🌊


우리는 사용자의 로그인 정보을 이용하여 저장된 크리덴셜과의 비교 검증 후, 인증된 AuthenticationSecurityContext에 저장했다. 그럼 이제 사용자가 요청한 리소스에 접근을 허용하면 될까?

NO!

만약 인증된 일반 사용자가 관리자 시스템에 접속할 수 있게된다면...😱

인증에 성공했다고 해서 리소스에 접근을 허용하면 안된다!!

보안 요소에는 인증, (Authentication) 뿐 아니라 인가(Authorization)도 있다는 것을 잊지 말자!!

1단계. AuthorizationFilter

AuthorizationFilter는 Spring Security Filter Chain에서 URL을 통해 사용자의 엑세스 권한을 제한하는 권한 부여 Filter이다.

AuthorizationFilter는 가장 먼저 SecurityContextHolder로부터 SecurityContext에 저장된 인증된 Authentication를 가져온다.

2단계. AuthorizationManager

AuthorizationFilter는 가져온 Authentication과 HttpServletRequest를 AuthorizationManager에 전달한다.

💡AuthorizationManager권한 부여 처리를 총괄하는 매니저 역할의 인터페이스이며 복잡한 처리들을 대신 해줄 구현체가 필요하다. 많은 구현체 중에 우리가 사용할 구현체는 RequestMatcherDelegatingAuthorizationManager 이다.

AuthorizationManager는 자신의 구현체인 RequestMatcherDelegatingAuthorizationManager에게 권한 부여 처리를 담당할 또 다른 구현체를 찾도록 한다.

💡RequestMatcherDelegatingAuthorizationManager는 RequestMather 평가식을 기반으로 해당 평가식에 매치되는 AuthorizationManager 의 또 다른 구현체에게 권한 부여 처리를 위임한다.

public final class RequestMatcherDelegatingAuthorizationManager implements AuthorizationManager<HttpServletRequest> {

  ...
  ...

		for (RequestMatcherEntry<AuthorizationManager<RequestAuthorizationContext>> mapping : this.mappings) {

			RequestMatcher matcher = mapping.getRequestMatcher(); 
			MatchResult matchResult = matcher.matcher(request);
			if (matchResult.isMatch()) {  //(1)
				AuthorizationManager<RequestAuthorizationContext> manager = mapping.getEntry();
				if (this.logger.isTraceEnabled()) {
					this.logger.trace(LogMessage.format("Checking authorization on %s using %s", request, manager));
				}
				return manager.check(authentication,
						new RequestAuthorizationContext(request, matchResult.getVariables()));
			}
		}
		this.logger.trace("Abstaining since did not find matching RequestMatcher");
		return null;
	}
}

RequestMatcherDelegatingAuthorizationManager 클래스의 코드 일부로 위 코드에 (1)부분 에서 보면 클래스 내에 RequestMather를 통해 매칭되는AuthorizationManager의 구현체를 생성하는 것을 볼 수 있다.

💡RequestMather는 SecurityConfiguration에서 .antMatchers("/orders/**").hasRole("ADMIN") 와 같은 메서드 체인 정보를 기반으로 생성된다.

3단계. 접근 권한 여부 확인

RequestMather를 통해 생성된 AuthorizationManager의 구현체는 사용자의 권한을 체크한다. 적절한 권한을 가졌다면 다음 요청 프로세스를 진행하고, 그렇지 않은 경우에는 AccessDeniedException이 던져진다.

던져진 Exception은 ExceptionTranslationFilter가 처리한다.

한눈에 흐름 훑어보기

profile
🧑‍💻백엔드 개발자, 조금씩 꾸준하게

0개의 댓글