카테고리 없음

Security Filter

인생은단짠단짠 2023. 1. 13. 14:59

 

진행중인 사이드 프로젝트에 스프링 시큐리티가 살짝 사용되는 것 같아서 가볍게 공부하고 있다.

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();