Spring Security 인가

귀찮Lee·2022년 7월 26일
0

Spring Security

목록 보기
5/13
post-thumbnail

◎ Spring Security에서 Authorization 처리 절차

◎ Authorities

  • GrantedAuthority

    • principal에게 부여한 권한을 나타내는 객체
    • 메서드가 1개만 있는 인터페이스 ( String getAuthority(); )
  • 인증

    • AuthenticationManager가 Authentication 객체에 설정
  • 인가

    • AccessDecisionManager가 해당 Authentication 객체에서 GrantedAuthority를 꺼내서 접근 권한을 결정
    • String으로 쉽게 GrantedAuthority를 조회
    • 복잡한 케이스로 간주하는 경우엔 getAuthority()에선 null 리턴
      • AccessDecisionManager에 구체적인 코드가 있어야 한다는 뜻이다.

◎ Authorization Architecture

  • SimpleGrantedAuthority

    • String 형태의 사용자의 권한에 해당하는 문자열을 GrantedAuthority 로 반환
  • Pre-Invocation Handling

    • 보안 객체에 대한 접근을 제어하는 인터셉터 (method invocation, 웹 요청)
    • 호출을 허용할지 말지를 결정하는 pre-invocation 을 함
  • AccessDecisionManager

    • AbstractSecurityInterceptor에서 호출되며 최종적인 접근 제어를 결정
    • 메서드
      • decide
        • 권한 부여하기 위한 결정을 내리는 데 필요한 모든 정보가 메서드에 전달
        • secureObject를 전달하면 실제 보안 객체를 실행할 때 인자를 검사할 수 있다.
      • supports(ConfigAttribute)
        • 기동 시점에 AbstractSecurityInterceptor가 호출하며 AccessDecisionManager가 전달된 ConfigAttribute의 처리 가능 여부를 결정
      • supports(Class)
        • 시큐리티 인터셉터 구현체가 호출하며 설정해둔 AccessDecisionManager에서 시큐리티 인터셉터가 제출할 보안 객체 타입을 지원하는지 확인
  • After Invocation Handling

    • 보안 객체를 실행하기 전에는 AbstractSecurityInterceptor가 AccessDecisionManager를 호출
    • 실제로 보안 객체가 리턴하는 객체를 바꿔야 하는 애플리케이션도 있다.

◎ 서블릿 아키텍처와 구현체를 기반으로 권한 부여

  • 스프링 시큐리티에서 권한을 인가하려면 기본적으로 모든 요청을 인증해야 한다.
  1. FilterSecurityInterceptor가 SecurityContextHolder에서 Authenticaion 객체를 얻는다.

  2. FilterSecurityInterceptor가 넘겨받은 HttpServletRequest, HttpServletResponse, FilterChain으로 FilterInvocation을 생성한다

  3. ConfigAttributes를 얻기 위해 FilterInvocation을 SecurityMetadataSource에 전달한다.

  4. Authentication, FilterInvocation, ConfigAttribute를 AccessDecisionManager로 전달한다.

    • 인가 거절 → AccessDeniedException 예외를 던진다. (ExceptionTranslationFilter가 처리한다.)

    • 인가 승인 → FilterSecurityInterceptor는 일반적인 애플리케이션 프로세스를 실행할 수 있도록 FilterCahin을 이어간다.

◎ 관련 자료

profile
배운 것은 기록하자! / 오류 지적은 언제나 환영!

0개의 댓글