Spring Security는 Authentication 객체에 GrantedAuthority 권한 목록을 저장하며 이를 통해 인증 주체에게 부여된 권한을 사용하도록 한다.
GrantedAuthority 객체는 AuthenticationManager에 의해 Authentication 객체에 삽압되며 Spring Security는 인가 결정을 내릴 때, AuthenticationManager를 사용해 Authentication 즉, 인증 주체로부터 GrantedAuthority 객체를 읽어들여 처리한다.
구현체는 하나로 SimpleGrantedAuthority가 있다.
[사용자 정의 역할 접두사 - ROLE_]
The ROLE_ prefix is a marker that indicates that a simple comparison with the user’s authorities should be made. In other words, a normal role-based check should be used.
기본적으로 역할 기반 인가 규칙은 역할 앞에 ROLE_를 접두사로 사용한다. 즉, "USER" 역할을 가진 보안 컨텍스트가 필요한 인가 규칙이 있다면 Spring Security는 기본적으로 "ROLE_USER"를 반환하는 GrantedAuthority를 찾게 된다.
GrantedAuthorityDefaults로 사용자 지정할 수 있으며 GrantedAuthorityDefaults는 역할 기반 인가 규칙에 사용할 접두사를 사용자 정의하는데 사용된다.
📚 AuthorizationManager
AuthorizationManager는 인증된 사용자가 요청 자원에 접근할 수 있는가를 결정할 수 있는 인터페이스로서 인증된 사용자의 권한 정보와 요청 자원 보안 요구사항 기반으로 권한 부여 결정을 내린다.
AuthorizationManager는 Spring Security 요청 기반, 메서드 기반 인가 구성 요소에서 호출되며 최종 액세스 제어 결정을 수행한다.
AuthorizationManager는 Spring Security 필수 구성 요소로 권한 부여 처리는 AuthorizationFilter를 통해 이루어지며 AuthorizationFilter는 AuthorizationManager를 호출해 권한 부여 결정을 내리게 된다.
check() : 권한 부여 결정을 내릴 때 필요한 모든 관련 정보가 전달된다. 액세스가 허용되면 true를 포함하는 AuthorizationDecision, 거부되면 false를 포함하는 AuthorizationDecision, 결정을 내릴 수 없는 경우에는 null을 반환한다.
verify() : check를 호출해서 반환된 값이 false를 가진 AuthorizationDecision인 경우 AccessDeniedException을 던진다.
📚 AuthorityAuthorizationManager 클래스
Spring Security는 요청 기반의 인증된 사용자 및 특정 권한을 가진 사용자의 자원접근 허용 여부를 결정하는 인가 관리자 클래스들을 제공한다.
대표적으로 AuthorityAuthorizationManager, AuthenticatedAuthorizationManager, 그리고 요청을 위임하는 RequestMatcherDelegatingAuthorizationManager가 있다.