본문 바로가기

Spring/Spring Security

AnonymousAuthenticationFilter

spring security는 웹 요청이 들어오면, 요청을 가로챈 후 사용자를 인증하고, 인증된 사용자가 적절한 권한을 지니고 있는 확인한다.

웹 요청은 filterChainProxy를 통해 여러개의 Security Filter가 실행되는데, 그 중 하나인 AnonymousAuthenticationFilter에 대해서 정리해보았다.

AnonymousAuthenticationFilter란?

이름으로 역할을 유추해보면 접속한 사용자가 인증이 되어있지 않은 사용자일 때 어떤 행동을 취할것인지를 설정해주는 필터인 것 같다.

AnonymousAuthenticationFilter는 이름에서 유추되는 역할을 하는 필터가 맞다. 현재 사용자가 인증을 받지 않았으면 익명 사용자라고 판단해서 익명 사용자용 토큰을 만들어서 인증 사용자와와 구분하기 위한 필터이다.

수행하는 일은 다음과 같다

  • 익명/인증 사용자를 구분하여 처리하기 위한 용도
  • 인증객체( Authentication )의 유무에 따라서 처리
  • 인증객체가 없을때 임의의 사용자로 인증객체를 생성 (AnonymousAuthenticationToken)
  • 인증여부 구현시 isAnonymous(), isAuthenticated()로 구분하여 사용
  • 인증객체를 세션에 저장하지 않는다.

* isAnonymous() = true면 익명 사용자
* isAuthenticated() = true면 인증을 받은 사용자

인증을 담당하는 필터인데, 이런 역할은 가진 필터는 한가지 더 있다. AuthenticationFilter와 비슷한 역할을 할 것 같다.

AuthenticationFilter는 익명사용자일 때 사용자를 null로 처리하지만, 이 필터는 익명사용자용 객체를 만들어 처리한다는 점에서 차이가 있다.

그렇다면 AuthenticationFilter만 가지고 사용자 세션 정보를 확인할 수 있을거같은데 어째서 다른 필터가 있을까???

굳이 AnonymousAuthenticationFilter를 사용하는 이유

다음 예시는 AuthenticationFilter를 이용해 익명사용자인지 확인하는 구문이다.

if(SecurityContextHolder.getContext().getAuthentication() == null){
    ....
}

언뜻 봐서는 문제가 없어보이지만, 익명 사용자가 아니지만 사용자의 세션이 무효화되어 해당 값이 null인 경우가 존재하게 된다.
익명 사용자는 Authentication이 null이 아니고 문자열의 "anonymousUser"가 저장되어 있는 principal과 ROLE_ANONYMOUS 권한 정보를 가지고 있는 객체다. 그렇기 때문에 AnonymousAuthenticationFilter를 통해 별도의 익명사용자 객체를 할당해서 구분해줄 필요가 있다.

Reference

https://fenderist.tistory.com/339

https://anjoliena.tistory.com/8

https://study6-6.tistory.com/461

'Spring > Spring Security' 카테고리의 다른 글

http 에서 https로 전환하기  (0) 2022.01.11
ExceptionTranslationFilter  (0) 2021.11.15