이번 포스팅은 인가에 대해 정리해보았습니다. 인가는 스프링 시큐리티에서 요청을 심사하는데 마지막 관문입니다.
만약 스프링 시큐리티의 인증 아키텍쳐/프로세스에 대해 모르신다면, 앞선 포스팅을 먼저 보고 오시면 더 좋습니다.
인가 (Authorization)
스프링 시큐리티가 지원하는 권한 계층
- 웹 계층 : URL 요청에 따른 메뉴 혹은 화면 단위의 레벨 보안
- 서비스 계층 : 화면 단위가 아닌 메소드 같은 기능 단위의 레벨 보안
- 도메인 계층 : 객체 단위의 레벨 보안
인가 프로세스
- 요청 시 앞선 FilterChainProxy 에서 인증 처리가 완료되고, FilterSecurityInterceptor 로 전달됩니다.
- 만약, 인증 객체 없이 보호된 자원에 접근을 시도하게 되면 AuthenticationException 을 throw 합니다.
- 인증 객체가 존재할 때 SecurityMetadataSource 로부터 접근하려는 자원이 필요로하는 권한 정보를 조회합니다.
이 때, 필요로하는 권한 정보가 없다면 자원으로의 접근을 허용합니다. - 필요로하는 권한 정보가 존재한다면 AccessDecisionManager 는 AccessDecisionVoter 들에게 심의 요청을 하고, 결과를 집계합니다.
- 접근 결정 전략에 따라 접근을 승인할 지 여부가 결정되고, 접근이 거부되면 AccessDeniedException 을 throw 합니다.
접근이 승인되면 자원으로의 접근을 허용합니다.
AccessDecisionManager
- 인증 정보, 요청 정보, 권한 정보를 이용해서 사용자의 자원 접근을 허용할 지 여부를 결정합니다.
- 여러 개의 Voter 들을 가질 수 있으며, Voter 들로부터 접근 허용/거부/보류를 리턴받고 집계해 최종 결정을 합니다.
- 최종 접근 거부 시 AccessDeniedException 이 발생합니다.
접근 결정 유형
- AffirmativeBased
- 여러개의 Voter 클래스 중 하나라도 접근 허가로 결론을 내면 접근 허가
- ConsensusBased
- 다수결에 의해 최종 결정
- 동률일 경우 기본적으로 접근 허가
- allowIfEqualGrantedDeniedDecisions 를 false 로 설정할 경우 동률이더라도 접근 거부
- UnanimousBased
- 모든 Voter 가 만장일치로 승인해야 접근 허가
AccessDecisionVoter
- 권한 부여 과정에서 판단하는 데이터
- 인증 정보 (Authentication)
- 요청 정보 (FilterInvocation) : antMatcher("/user/1")
- 권한 정보 (ConfigAttributes) : hasRole("USER")
- 결정 방식
- ACCESS_GRANTED : 접근 허용
- ACCESS_DENIED : 접근 거부
- ACCESS_ABSTAIN : 접근 보류
Reference
반응형
'🌱 SPRING' 카테고리의 다른 글
[Spring Security] 스프링 시큐리티 주요 아키텍쳐 2 - 인증(Authentication) (0) | 2021.12.10 |
---|---|
[Spring Security] 스프링 시큐리티 주요 아키텍쳐 1 - DelegatingFilterProxy, FilterChainProxy (0) | 2021.12.06 |
[Spring Cloud Config] 설정값을 외부에서 관리하자! - 실습 (4) | 2021.10.10 |
[Spring Cloud Config] 설정값을 외부에서 관리하자! - 기본 (0) | 2021.10.10 |
[SpringCloud] Resilience4j와 Spring Cloud Circuit Breaker (0) | 2021.05.16 |