Spring/security

[시큐리티] 필터

라임온조 2023. 3. 23. 18:35

1. 개념

요청을 수신하고 요청에서 요구하는 논리를 실행하며 실행을 모두 마치고 난 이후에는 체인의 다음 필터로 요청을 넘긴다.

 

예를 들어 숟가락을 쥔다, 숟가락으로 밥을 푼다, 푼 받을 입에 가져다가 넣는다, 씹는다 이런 과정이 있을 때 숟가락을 쥐는 것 부터 씹는 것까지의 전체 과정을 체인이라고 본다. 그리고 각 행위를 필터라고 본다.

 

2. 특징

  • 스프링 시큐리티는 기본 필터도 제공하고, 맞춤형으로 필터를 새로 정의하는 것도 가능하게 함. 그리고 새롭게 정의한 필터를 체인에 추가할 수 있음
  • 필터는 책임을 관리자에게 위임함
  • 스프링 시큐리티 아키텍처의 필터는 일반적인 HTTP 필터
  • 여러 필터가 같은 순서값을 가질 수 있는데, 스프링 시큐리티는 같은 순서값일 경우 어떤 걸 먼저 호출할 지 딱히 정해놓지 않는다. 어쩔 때는 A가 먼저 될 수도 있고, 어쩔 때는 B가 먼저 될 수도 있음

 

3. 만드는 법

1) Filter 인터페이스 사용

javax.servlet 패키지의 Filter 인터페이스를 구현하며 doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) 메서드를 재정의

ServletRequest

  • HTTP 요청
  • 요청에 대한 세부 정보를 얻음

ServletResponse

  • HTTP 응답
  • 클라이언트에게 보내기 전에 응답을 변경 가능

FilterChain

  • 체인의 다음 필터로 요청을 보냄

2) OncePerRequestFilter 클래스 사용

필터 체인에 추가한 필터를 요청당 한 번만 실행하도록 보장하고 싶을 때 이 클래스를 확장해서 doFilterInternal메서드를 재정의하면 됨

특징

  • HttpServletRequest 및 HttpServletResponse로 직접 요청을 수신해서 Filter 인터페이스와 달리 형 변환이 필요 없음
  • 추가한 필터가 특정 요청에는 적용되지 않도록 설정할 수 있음. 이때는 shouldNotFilter(HttpServletRequest) 메서드를 재정의하면 됨
  • 기본적으로 비동기 요청이나 오류 발송 요청에는 적용되지 않음. 이걸 변경하고 싶으면 shouldNotFilterAsyncdisplatch() 및 shouldNotFilterErrorDispatch() 메서드를 재정의하면 됨

 

4. 등록하는 법

시큐리티 config 파일에서 http의 각종 메서드를 이용하여 등록

1) 메소드명(필터 체인에 추가할 맞춤형 필터의 인스턴스, 새 인스턴스를 추가할 위치), addFilterAfter(필터 체인에 추가할 맞춤형 필터의 인스턴스, 새 인스턴스를 추가할 위치)

필터 체인에 추가할 맞춤형 필터의 인스턴스

  • 새로 만든 필터의 인스턴스를 생성

새 인스턴스를 추가할 위치

  • 추가할 필터가 여기에 적은 위치 전에 수행됨(addFilterBefore의 경우)
  • 추가할 필터가 여기에 적은 위치 후에 수행됨(addFilterAfter의 경우)
  • 추가할 필터가 여기에 적은 위치와 같은 순서로 수행됨(addFilterAt의 경우)

2) 메소드 종류

  • addFilterBefore
  • addFilterAfter
  • addFilterAt

 

5. 종류

1) BasicAuthenticationFilter

HTTP Basic 인증을 처리

2) CsrfFIlter

CSRF(사이트 간 요청 위조)를 처리

3) CorsFilter

CORS(교차 출처 리소스 공유) 권한 부여 규칙을 처리

 

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

[시큐리티] CORS  (0) 2023.03.28
[시큐리티] CSRF  (0) 2023.03.27
[시큐리티] 권한과 역할제어  (0) 2023.03.21
[시큐리티] SecurityContext  (0) 2023.03.16
[시큐리티] AuthenticationProvider  (0) 2023.03.15