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 |