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
'Spring > Spring Security' 카테고리의 다른 글
http 에서 https로 전환하기 (0) | 2022.01.11 |
---|---|
ExceptionTranslationFilter (0) | 2021.11.15 |