
진행중인 사이드 프로젝트에 스프링 시큐리티가 살짝 사용되는 것 같아서 가볍게 공부하고 있다.
SecurityConfig 파일에 여러가지 처음 보는 단어와 설정들이 많았는데 이게 여러 종류의 필터들인 것 같아 Security Filter에 대해 찾아보았다.
Spring Security의 동작은 사실상 Filter로 동작한다고 해도 무방하다고 한다.
다양한 필터들이 존재하고, 이 필터들은 각자 다른 기능을 하고 있다.
원하는 필터는 추가할 수 있고, 원치 않는 필터는 제외 가능하며, 동작하는 순서를 정해줘서 원하는 대로 동작시킬 수 있다.
Filter들
필터의 종류는 매우 많지만, 자주 사용되는 필터는 아래와 같다.
SecurityContextPersistenceFilter
( 찾아보니 현재는 사용되지 않고 SecurityContextHolderFilter를 사용하는 듯하다)
- 세션에 저장된 SecurityContext가 있다면 그것을 가져와서 SecurityContextHolder에 넣어주고 없으면 새로 만들어주는 필터이다.
- SecurityContext를 찾았은데 없다면면 새로 만들어준다.
BaseAuthenticationFilter
- 우리가 로그인이라고 부르는 과정이 없어도 username : user123 / password : pass123 라는 로그인 데이터를
Base64로 인코딩해서 모든 요청에 포함해서 보내면 BasicAuthenticationFilter는 이걸 인증한다. - 세션이 필요없고, 매번 요청마다 인증이 새롭게 이루어 진다. (stateless함)
- 아이디, 비밀번호 노출이 많이 이루어져 보안에 취약, https사용을 권장한다.
UsernamePasswordAuthenticationFilter
- form 데이터로 user, password기반의 인증을 담당하고 있는 필터이다.
- 로그인 버튼을 누를 때 동작한다.
Csrf Filter
- Csrf attack을 방어하는 필터이다.
- Csrf attack이란 공격자가, 유저(즉 희생자)가 사용하고 있는 Web Browser를 통해서, 공격자가 조작한 HTTP request를, Web Server에게 보내는 attack(공격) 이다.
- 위조된 페이지인지 아닌지를 csrf 토큰으로 검사한다.
- 정상적인 페이지는 Csrf Token이 있을 것이고, 위조된 페이지는 Csrf Token이 없거나 잘못된 토큰을 가지고 있다.
- Csrf 토큰이 없으면 우리가 만들 페이지가 보낸 요청이 아니라고 생각하고 공격을 방지할 수 있다.
RememberMeAuthenticationFilter
- 일반적인 세션보다 훨씬 오랫동안 로그인 사실을 기억할 수 있게 해준다.
- Session의 세션 만료시간은 기본설정이 30분이지만 RememberMefilter는 기본설정이 2이다.
- 세션은 크롬창 끄면 로그아웃이 되지만, remember-me는 그렇지 않다. 그러나 서버 자체를 끄면 로그아웃되는건 마찬가지
AnonymousAuthenticationFilter
- 인증이 안된 유저가 요청을 하면 Anonymous(익명) 유저로 만들어 Authentication에 넣어주는 필터다.
- 인증되지 않았다고 하더라도 null로 냅두지 않고 기본 Authentication을 만들어주는 개념이라고 생각하면 된다.
- 다른 Filter에서 Anonymous유저인지 정상적으로 인증된 유저인지 분기 처리를 할 수 있다.
FilterSecurityInterceptor
- 인터셉터라고 적혀있지만 Filter중에 하나이다.
- 앞에서 넘어온 authentication내용을 기반으로 최종 인가판단을 내린다.
- 그렇기 때문에 대부분의 경우, 필터중에 뒤쪽에 위치한다.
- 먼저, 인증(Authenticaion)을 가져오고 만약에 인증에 문제가 있다면 AuthenticationException을 발생시킨다.
- 그리고 인증에 문제가 없다면, 해당 인증으로 인가를 판단한다.
- 이때 인가가 거절되면 AccessDeniedException이 발생하고, 승인되면 정상적으로 필터가 종료된다.
ExceptionTranslationFilter
- AuthenticationException - 인증에 실패할때 발생
- AccessDeniedException - 인가에 실패할때 발
앞서본 FSI에서 발생할 수 있는 두가지 Exception을 처리해주는 필터이다.
즉 인증이나 인가에 실패했을 때, 어떤 행동을 취해야하는지를 결정해주는 Filter이다.
필터 사용하는 방법
- 설정에 필터를 활성화 하고 싶을 때는 http.필터();
- 필터를 비활성화 하고 싶을 때는 http.필터.disable();