FilterSecurityInterceptor는 사용자가 권한이 있는 페이지에 접속할 때 접속 가능 여부를 판단하는 Filter이며, Filter중 제일 마지막에 위치하고 있습니다.
FilterSecurityInterceptor에서는 요청정보, 권한정보, 인증정보가 필요하며 이것을 획득하면 AccessDecisionManager에게 보내서 이곳에서 인가처리를 하게 됩니다.
이번 글에서는 요청정보, 권한정보, 인증정보를 알아보겠습니다.
요청정보
요청정보는 사용자가 어떤 URL을 입력했는지 알아내는 것 입니다.
이것은 FilterInvocation 을 통해 알아낼 수 있습니다.
만약 제가 www.localhost:8080/login 을 입려했다고 가정한다면 request, response, chain을 FilterInvocation의 생성자에 넘겨 저장하고 입력했던 요청정보를 알아낼 수 있습니다.
권한정보
권한정보는 사용자가 접속하려는 요청정보의 권한을 알아내는 것이며, 이 권한정보는 FilterInvocationMetadataSource와 연관이 있습니다.
우선, 권한정보를 초기화 하는 과정을 살펴보겠습니다.
예를 들어, Spring Security 설정 파일에서 위의 사진과 같이 URL과 그에 맞는 권한 정보를 설정해주었다면 이것은 ExpressBasedFilterInvocationSecurityMetadataSource의 requsetToExpressionAttributesMap에 저장됩니다.
반환타입은 LinkedHashMap<RequestMatcher, Collection<ConfigAttribute>>으로 되어있습니다.
그리고 이것은 부모 클래스인 DefaultFilterInvocationSecurityMetadataSource으로 넘겨 requsetMap이라는 변수에 저장하고 요청이 들어왔을 때 이 클래스의 getAttributes라는 메서드를 이용하여 권한정보를 반환하게 됩니다.
DefaultFilterInvocationSecurityMetadataSource
이 클래스의 쓰임을 알아보기 위해 www.localhost:8080/mypage에 접속한다는 과정을 해봅니다.
FilterSecurityInterceptor에서는 요청정보를 얻고, 권한정보를 얻는 과정에서 이 클래스의 getAttributes라는 메서드를 호출할 것입니다.
FilterInvocation을 이용하여 요청 정보를 획득하고 초기화된 권한정보가 들어가 있는 requestMap을 반복하면서 요청정보와 매칭이 되는 권한정보를 찾고 찾게되면 이 데이터의 Value인 권한 목록을 반환합니다.
인증정보
인증정보는 SecurityContectHolder에서 현재 인증정보를 찾습니다.
FilterSecurityInterceptor 시나리오
사용자가 로그인하여 페이지에 접속할 때까지의 과정을 살펴보겠습니다.
우선,
- 로그인한 사용자는 ROLE_USER라는 권한이 있습니다.
- 사용자는 www.localhost:8080/mypage라는 URL에 접속합니다.
- /mypage는 ROLE_USER의 권한만 접근할 수 있습니다.
여러 Filter들을 거쳐 FilterSecurityInterceptor로 들어오면, FilterInvocation에서 요청정보(/mypage)를 가져옵니다.
그리고 invoke메서드에 FilterInvocation객체를 넘겨줍니다.
FilterInvocation객체를 super.beforeInvocation으로 넘겨줍니다.
여기서 super는 AbstractSecurityInterceptor로 FilterSecurityInterceptor의 부모 클래스입니다.
Object형태로 넘어온 FilterInvocaton객체를 this.obtainSecurityMetadataSource().getAttributes로 넘겨줍니다.
여기서 권한정보를 가져오는 것이며, 메서드는 기본 값인 DefaultFilterInvocationSecurityMetadataSource를 이용합니다.
위에서 설명했듯이 요청정보와 requestMap에 존재하는 값이 일치한다면 권한정보를 리턴합니다.
마지막으로 SecurityContextHolder에 있는 인증객체를 찾고 AccessDecisionManager에게 요청정보, 권한정보, 인증정보를 넘겨줍니다.
AccessDecisionManager에서는 넘겨받은 정보를 이용해 허용 여부를 판단하게 합니다.
출처 및 참고
https://www.inflearn.com/course/spring-security
'SPRING SECURITY' 카테고리의 다른 글
CSRF란? (0) | 2021.11.09 |
---|---|
[SpringSecurity] 인증성공, 실패 핸들러 (0) | 2021.11.05 |
[SpringSecurity] 인증부가기능(WebAuthenticationDetails, WebAuthenticationDetailsSource) (1) | 2021.11.04 |
[Spring Security] UsernamePasswordAuthenticationFilter에 대해서 (0) | 2021.02.27 |
[Spring Security] Form Login 인증에 대해서 (0) | 2021.02.27 |