springframework/시작하자SpringSecurity

38.인가프로세스의 아키텍쳐

Jungsoomin :) 2020. 9. 30. 04:06

인가프로세스의 아키텍쳐

  1. FilterSeucrityInterceptor 가 인증정보, 요청정보, 권한정보를 추출
  2. AccessDecisionManager 에게 정보들을 주어 인가처리를 함

 


인증, 요청, 권한 정보의 수집

 

  • 인증정보는 SecurityContextAuthentication 객체에 있다.
  • 요청정보는 FilterInvocation 객체를 생성해 요청정보를 저장한뒤 반환한다.
  • 권한정보는 List 타입ConfigAttribute 으로 반환한다.

  1. 유저의 Request
  2. SecurityInterceptor 가 작동
  3. Authentication 에서 인증정보 추출
  4. FilterInvocation 에서 요청정보 추출
  5. 권한정보를 추출할 때는 ConfigAttribute 타입의 List를 반환
  6. SecurityInterceptor 가  이를 가지고 AccessDecisionManager 에게 심사요청

**권한 정보는 SpringSecurity 초기화시 Map<요청경로, 권한> 형태로 매핑된다.

인가처리를 위한 핵심 객체

 

최상위 인터페이스는 SecurityMetaDataSource 이다

  • Collection<ConfigAttribute> getAttributes(Object object)
  • Collection<ConfigAttribute> getAllConfigAttributes()
  • boolean support(Class<?> clazz)

가장 중요한 메서드는 getAttriubutes() 이다. 


 

SecurityMataDataSource 는 2가지 객체로 나뉜다.

  • FilterInvocationSecurityMatadataSource : Url 방식의 권한 추출
  • MethodSecurityMatadataSource : 메소드 방식의 권한 추출

Url 방식의 권한추출 클래스들

  1. DefaultFilterInvocationSecurityMetadataSource
  2. ExpressionBaseFilterInvocationSecurityMetadataSource

FilterInvocationSecurityMetadataSource 를 구현하여 DefaultFilterInvocationMetadataSource의 내용을 참고한다.


메서드 방식의 권한추출 클래스들

 

메서드 방식에는 클래스를 만들지 않고 구현되어 있는 클래스들을 사용하여 어노테이션을 사용한다.

  1. Jsr250MethodSecurityMetadataSource : @RolesAllowed("USER")
  2. SecuredAnnotationSecurityMetaSource : @Secured("ROLE_USER")
  3. PrePostAnnotationSecurityMetadataSource : @PreAuthorize("hasRole("user")"), @PostAuthorize("hasRole("user")")
  4. MapBasedMethodSecurityMetadataSource : 실제 DB 연동시 사용