What we have to do is to be forever curiously
testing new opinions and courting new impressions

우리가 해야 할 일은 끊임없이 호기심을 갖고
새로운 생각을 시험해보고 새로운 인상을 받는 것

Spring Security: (3)Authorization

  • 정의
  • 사전 호출 처리
  • 계층적 역할


정의

Authorization(인가)은 특정 리소스에 접근하려는 사용자의 권한을 확인하는 방법

스프링 시큐리티에서는 GrantedAuthority 객체를 통해 보안 주체에게 부여된 권한을 확인

사전 호출 처리

스프링 시큐리티는 웹 요청이나 메소드 호출과 같은 보안 객체에 대한 접근 통제를 할 수 있는 인터셉터를 AccessDecisoinManager에 의해 제공

AuthorizationManager

AuthorizationManager는 AccessDecisoinManager과 AccessDecisionVoter 모두를 대체

AccessDecisoinManager이나 AccessDecisionVoter를 사용자 정의하는 어플리케이션들은 AuthorizationManager를 사용

AuthorizationManager는 최종 접속 권한 결정을 책임지는 AuthorizationFilter에 의해 호출되며, 두가지 메소드를 포함

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

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

check 메소드는 인증 결정을 내리기 위해 필요한 모든 관련 정보를 전달 특히 보안 객체를 전달하여 실제 보안 개체 호출에 포함된 인수를 검사

verify 메소드는 check 메소드를 호출 후 AuthorizationDecision이 부정일 경우, AccessDeniedException 던짐

대리자 기반 AuthorizationManager 구현

사용자는 자신의 AuthorizationManager를 구현하여 권한 부여의 모든 측면을 제어할 수 있지만, 스프링 보안은 개별 AuthorizationManager와 협업할 수 있는 AuthorizationManager 위임 제공

RequestMatcherDelegatingAuthorizationManager는 요청을 가장 적절한 AuthorizationManager와 매칭

메소드 보안을 위해 AuthorizationManagerBeforeMethodInterceptor와 AuthorizationManagerAfterMethodInterceptor 사용 가능

authorizationhierarchy

이 접근 방식을 통해 AuthorizationManager 구현의 구성을 인가 결정에 반영

AuthorityAuthorizationManager

스프링 시큐리티에서 제공하는 가장 일반적인 AuthorizationManager이며, 현재 Authentication의 권한들로 구성

AuthenticatedAuthorizationManager

익명이거나 완전히 인증되었거나 기억된 사용자를 구별하는 데 사용되는 AuthorizationManager

많은 사이트에서 remember-me설정에 따라 특정 제한된 접속을 허용하지만 전체 접속을 하기 위해 사용자는 자신의 신원을 확인하기 위해 로그인 필요

Custom Authorization Managers

어플리케이션에 따라 자체 인증 데이터베이스나 오픈 정책을 따로 사용하여 특정한 보안 관리 로직을 구현할 수 있는 AuthorizationManager


계층적 역할

일반적으로 어플리케이션에서 특정 역할은 자동으로 다른 역할을 포함하기 때문에 스프링 시큐리티에서는 RoleVoter에서 확장된, RoleHierarchyVoter라는 기능을 제공하여 사용자에게 도달할 수 있는 권한을 할당함으로써 역할 계층 구분

@Bean
AccessDecisionVoter hierarchyVoter() {
    RoleHierarchy hierarchy = new RoleHierarchyImpl();
    hierarchy.setHierarchy("ROLE_ADMIN > ROLE_STAFF\n" +
            "ROLE_STAFF > ROLE_USER\n" +
            "ROLE_USER > ROLE_GUEST");
    return new RoleHierarchyVoter(hierarchy);
}

역할 계층 순서는 ROLE_ADMIN → ROLE_STAFF → ROLE_USER → ROLE_GUEST

화살표 기호(→)는 포함을 의미

ROLE_ADMIN으로 인증된 사용자는 네 역할을 모두 권한을 모두 소유


댓글남기기