Spring Security ‐ 인가 아키텍처 - dnwls16071/Backend_Summary GitHub Wiki

📚 Authorization

  • 인가 즉, 권한 부여는 특정 자원에 접근할 수 있는 사람을 결정하는 것을 의미한다.
  • Spring Security는 Granted Authority 클래스를 통해 권한 목록을 관리하고 있으며, 사용자의 Authentication 객체와 연결된다.

GrantedAuthority

  • 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가 있다.

AuthenticatedAuthorizationManager

AuthorityAuthorizationManager

  • AuthorityAuthorizationManager는 매핑된 요청 패턴과 권한 정보를 사용해 사용자 요청 정보와 Authentication 권한을 비교해서 서로 일치하는가를 검사한다.

📚 PreAuthorizeAuthorizationManager 클래스

  • Spring Security는 메서드 기반 인증된 사용자 및 특정 권한을 가진 사용자의 자원 접근 허용 여부를 결정하는 인가 관리자 클래스들을 제공한다.
  • PreAuthorizationManager, PostAuthorizeAuthorizationManager, Jsr250AuthorizationManager, SecuredAuthorizationMaanger가 있다.
  • 메서드 기반 권한 부여는 내부적으로 AOP 방식에 의해 초기화 설정이 이루어지며 메서드 호출을 MethodInterceptor가 가로채어 처리하고 있다.
  • 스프링 컨테이너가 초기화 시, 생성되는 전체 빈을 검사하면서 빈이 가진 메서드 중에서 보안이 설정된 메서드가 있는지를 탐색한다.
  • 보안이 설정된 메서드가 있다면 스프링은 그 빈의 프록시 객체를 자동으로 생성해준다.
  • 보안이 설정된 메서드에는 인가 처리 기능을 하는 Advice를 등록한다.
  • 스프링은 기본적으로 빈 참조시 실제 빈이 아닌 프록시 객체를 참조하도록 한다.
  • 초기화 과정이 종료된다.
  • 사용자는 프록시 객체를 통해 메서드를 호출하고 프록시 객체는 Advice로 등록된 메서드가 있다면 호출해 작동시킨다. 이 때, 호출 시점에 실제 빈 객체의 메서드가 호출된다.
  • Advice는 메서드 진입 전 인가 처리를 하게 되고 인가 처리가 승인되면 실제 객체 메서드를 호출하게 되고 인가 처리가 거부되면 예외가 발생하고 메서드 진입에 실패하게 된다.

[Method Interceptor 구조]

📚 @PreAuthorize 처리 구조

📚 @PostAuthorize 처리 구조