SpringSecurity에서 AnonymousAuthenticationFilter는 뭘까? 뭔가 어나니머스 하니까 음모론이 생각난다 ㅋㅋ
AnonymousAuthenticationFilter는 하는일은 많치가 않다 하지만 존재하는이유는 존재 있기 때문에 공부해본다!
예시를 들자면 어떤 사용자가 인증을 받게되면 세션에 인증을 받은 유저 객체를 저장한다 그다음에 이 사용자가 서버자원에 접근할려고 하면
세션에서 저장된 유저 객체가 존재하는지 안하는지 여부를 판단한다 만약에 존재하지 않는다면 인증 받지 않은 사용자라고 인식하여
서버자원에 접근할수 없게 한다 반대로 유저 객체가 존재한다면 서버자원에 접근할수 있도록 처리한다.
이개념음 앞에서 말한 AuthenticationFilter와 AnonymousAuthenticationFilter는 개념은 동일하다
AnonymousAuthenticationFilter 요놈은 null로 처리하는게 아니라 별도에 익명사용자용 객체를 만들어서
처리한다
현재 사용자가 요청을 하고 있다.
(request)
이필터가 요청을 받게되고
요놈이 인증객체가 존재하는지 확인 한다 인증객체는 SecurityContext에 저장되어 있다.
만약 존재하지 않는다면 인증을 받지 않은 사용자로 인식한다
인증 객체가 존재한다면 이필터에서는 특별히 하는일은 없다
만약 인증객체가 존재하지 않는다면
이전 단계에서 인증을 받지 않은 사용자라
고 판단하게 되고 익명객체인 AnonymousAuthenticationToken을 생성한다
이렇게 되면 일반적으로 Null로 처리하는게 아니라 익명사용자 토큰을 생성해서 SecurityContext안에 익명 사용자
토큰을 저장한다. SpringSecurity는 여러 필터를 통해서 인증을 받지 않은 사용자인지 조건을 검색하게되는데
이때 인증객체 가 AnonymousAuthenticationToken타입이면 현재 사용자는 익명사용자라고 판단한다.
정리하자면!
AnonymousAuthenticationFilter
1. 익명 사용자 인증처리 필터
2. 익명 사용자와 인증 사용자를 구분해서 처리하기 위한 용도로 사용
3.인증객체를 세션에 저장하지 않는다
자 그러면 소스코드를 통해서 API를 훓어보자!
AnonymousAuthenticationFilter.java ,method= doFilter
여기서 요청을 받게되고
필자는 이전에 인증과정을 거치지 않아서 SecurityContext에 저장되어 있지 않다 그래서
SecurityContextHolder.getContext().setAuthentication을 호출해 저장하게 된다.
AnonymousAuthenticationFilter.java method=createAuthentication
익명사용자용 인증객체 토큰을 만들어서 기본적인 사용자의 정보와 권한정보를 담는다
그래서 SecurityContext안에 저장한다
AnonymousAuthenticationFilter.java ,method= doFilter
그리고 그다음 필터로 이동해버린다. 이필터가 주로 하는역활이다!
AbstractSecurityInterceptor.java
인터셉터는 현재 사용자가 접근하고자 하는 자원에 접근하고자 할때
접근이 가능한지 확인하는 필터이다!
아까 저장된 익명객체를 가지고 와서 널인지 확인한다
AbstractSecurityInterceptor.java
널이면 인증예외를 발생한다!
여기 까지가 인가처리를 진행하는 과정이다!
아무리 익명객체가 생성되서 SecurityContext에 저장되어 있다고 하지만
정상적인 서버 접근이 불가능하다
SpringSecurity는 곳곳에서 인증객체의 대한 존재와 여부를 판단한다.
AbstractSecurityInterceptor.java
실제로 인가처리를 하는 클래스이고 현재 사용자가 서버자원에 접근이 가능한지 확인한다
ExceptionTranslationFilter.java
현재는 널이기 때문에 자원에 접근할수 없는 상태이다.
ExceptionTranslationFilter.java
isAnonymous(authentication) 현재 사용자가 인증된 사용자인지 판단하고 있다
AuthencicationTrustResolverImpl.java
판단할때 그여부를 현재 인증객체의 타입과 anontmousClass 타입이 일치하는지 확인한다.
현재 필자는 일치하기 때문에 익명사용자로 판단되어진다.
그래서 예외를 만나더라도
ExceptionTranslationFilter.java method= handleSpringSecurityException
accessDeniedHandler를 호출하지않고 만약 호출하게 된다면 null로 처리를 하게 될것이다.
ExceptionTranslationFilter.java method= handleSpringSecurityException
여기 구문을 처리 해서 로그인 페이지로 이동할수 있게 처리한다
AnonymousAuthenticationFilter는 현재 사용자가 인증을 받지 않았으면 익명 사용자라고 판단해서 익명 사용자용 토큰을 만들어서
인증 사용자와와 구분하기 위한 필터이다!!
그러면 여기서 난 궁금증이 생겼다
어나니머스필터를 사용해야지만 객체의 존재여부를 확인해주나?
이 필터는 인증사용자와 익명사용자를 구분하기 위한 용도로 사용되고 있고 여러 영역에서 Anonymous 여부를 활용한다
인증 객체 존재여부는 이 필터 외 다른 필터에서도 체크하고 있다.
물론 용도나 목적은 다를 수 있다.
어나니머스는 따로 설정해주지 않아도 되나?
AnonymousAuthenticationFilter 는 스프링 시큐리티에서 기본적으로 설정 및 생성해주고 있어서 별도로 설정하실 필요는 없다!
근데 별로 하는일 없다고 한거 같은데 이상하게 하는일이 많은거 같다?..ㅋㅋ
'SpringSecurity' 카테고리의 다른 글
SpringSecurity(세션 고정 보호정책) (0) | 2020.10.30 |
---|---|
SpringSecurity(동시 세션 제어) (0) | 2020.10.30 |
SpringSecurity(RemeberMe) (0) | 2020.10.30 |
SpringSecurity(Logout),LogoutFilter (0) | 2020.10.30 |
SpringSecurity(LoginForm)인증 (0) | 2020.10.30 |