https://docs.spring.io/spring-security/reference/servlet/architecture.html#servlet-filterchainproxy
Architecture :: Spring Security
The Security Filters are inserted into the FilterChainProxy with the SecurityFilterChain API. Those filters can be used for a number of different purposes, like authentication, authorization, exploit protection, and more. The filters are executed in a spec
docs.spring.io
일단 스프링 시큐리에 구조에 대해서 알아보려 합니다.
사실상 기존에 사용만 해봤지 실제 구조가 어떻게 굴러가는지에 대해서는 정확하게 공부하지 않았습니다.(반성중..사실 좀 바빳다는게 핑계... ㅎㅎ)
좋은 기회여서 일단 원서를 보면서 구조를 파악 해보려 합니다 ㅎㅎ
최대한 자세히 설명하거여서 쉬운 용어들 조차 설명을 할거라 내용이 조금 길어질수도 있습니다. 고수님들께서는 다른거 참조하셔도 됩니다. (저같은 초보를 위한 초보자들을 위해서... ㅎㅎ)
필터(filter)에 대해서
스프링 시큐리티의 서블릿 제공은 서블릿 필터에서 합니다!
여기서 서블릿이란? (모르는 분들을 위해서)
서블릿(Servlet)이란 동적 웹 페이지를 만들 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술이다. 서블릿은 웹 요청과 응답의 흐름을 간단한 메서드 호출만으로 체계적으로 다룰 수 있게 해준다.(일단 spring mvc servlet에서는 DispatcherServlet 이어서 그건 아래에 설명하겠습니다.)
https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EC%84%9C%EB%B8%94%EB%A6%BF
자바 서블릿 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 서블릿은 여기로 연결됩니다. 다른 뜻에 대해서는 서블렛 문서를 참고하십시오. JSP 파일의 수명. 자바 서블릿(Java Servlet)은 자바를 사용하여 웹페이지를 동적으
ko.wikipedia.org
자 그렇다면 이제 저희는 서블릿을 알고간거죠.
서블릿 필터는 일반적으로 필터의 역할을 보여주는데 도움을 준다고합니다.
아래 이미지는 single http request 다루는 일반적인 레이어입니다.
클라이언트에서 -> appliaciton으로 request를 보내면, URI Request 경로를 기반으로, HttpServletRequest 처리해야하는 filter 인스턴스와 서블릿을 포함하는 filterChain을 컨테이너에 생성합니다.
여기서 컨테이너란? (모르는 분들을 위해서)
https://ittrue.tistory.com/220
[Spring] 스프링 컨테이너(Spring Container)란 무엇인가?
본 내용은 온라인 강의 사이트 인프런의 김영한 님의 강의 내용이 포함되어 있습니다. '스프링 핵심 원리 - 기본편' 스프링 핵심 원리 - 기본편 - 인프런 | 강의 스프링 입문자가 예제를 만들어가
ittrue.tistory.com
스프링 컨테이너는 스프링 프레임워크의 핵심 컴포넌트이다.
스프링 컨테이너는 자바 객체의 생명 주기를 관리하며, 생성된 자바 객체들에게 추가적인 기능을 제공한다.
스프링에서는 자바 객체를 빈(Bean)이라 한다.
즉, 스프링 컨테이너는 내부에 존재하는 빈의 생명주기를 관리(빈의 생성, 관리, 제거 등)하며, 생성된 빈에게 추가적인 기능을 제공하는 것이다.
스프링 컨테이너는 XML, 어노테이션 기반의 자바 설정 클래스로 만들 수 있다.
스프링 부트(Spring Boot)를 사용하기 이전에는 xml을 통해 직접적으로 설정해 주어야 했지만, 스프링 부트가 등장하면서 대부분 사용하지 않게 되었다.
출처: https://ittrue.tistory.com/220 [IT is True:티스토리]
블로그 글을 빌리자면 스프링 자바 객체를 자동적으로 생명주기를 관리해주는곳이 컨테이너입니다.
그러니까 굳이 new 객체 생성하지 않아도 된다!! 이런 느낌입니다.
말그대로 filterChain도 스프링 컨테이너에 관리되는셈이죠!
여기서 또하나 URI와 URL이란? (모르는 분들을 위해서..저도 가끔 헷갈림 ㅎㅎ)
https://grape-blog.tistory.com/10
URI, URL 이란?
URI란 ? URI(Uniform Resource Identifier) 인터넷 자원을 나타내는 고유 식별자 이다. URI 에 "I" 가 Identifier인 것은 인터넷에 있는 자료의 ID를 뜻하는 것이다. 즉, 다른 자료가 똑같은 이름을 가지고 있으면
grape-blog.tistory.com
위에 이미지를 보시면 확실하게 아시겠죠?
쉽게 설명해서 url은 도메인만 있는거, uri는 쿼리파라미터,패스,페이지 모든걸 포함하고 있다고 생각하면 편합니다.
이 filterchain은 spring mvc application에
당연아시겠지만 spring mvc 에서의 servlet은 DispatcherServlet입니다.
DispatcherServlet이란?
https://mangkyu.tistory.com/18
[Spring] Dispatcher-Servlet(디스패처 서블릿)이란? 디스패처 서블릿의 개념과 동작 과정
이번에는 servlet의 심화 또는 대표주자인 dispatcher-servlet에 대해서 알아보도록 하겠습니다. 1. Dispatcher-Servlet(디스패처 서블릿)의 개념 [ Dispatcher-Servlet(디스패처 서블릿) 이란? ] 디스패처 서블릿의
mangkyu.tistory.com
이블로그 글을 빌리자면
디스패처 서블릿의 dispatch는 "보내다"라는 뜻을 가지고 있습니다. 그리고 이러한 단어를 포함하는 디스패처 서블릿은 HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해주는 프론트 컨트롤러(Front Controller)라고 정의할 수 있습니다.
이것을 보다 자세히 설명하자면, 클라이언트로부터 어떠한 요청이 오면 Tomcat(톰캣)과 같은 서블릿 컨테이너가 요청을 받게 됩니다. 그리고 이 모든 요청을 프론트 컨트롤러인 디스패처 서블릿이 가장 먼저 받게 됩니다. 그러면 디스패처 서블릿은 공통적인 작업을 먼저 처리한 후에 해당 요청을 처리해야 하는 컨트롤러를 찾아서 작업을 위임합니다.
여기서 Front Controller(프론트 컨트롤러)라는 용어가 사용되는데, Front Controller는 주로 서블릿 컨테이너의 제일 앞에서 서버로 들어오는 클라이언트의 모든 요청을 받아서 처리해주는 컨트롤러로써, MVC 구조에서 함께 사용되는 디자인 패턴입니다.
출처: https://mangkyu.tistory.com/18 [MangKyu's Diary:티스토리]
말그대로 http 요청이 오면 가장 먼저 받는 위치에 존재하는 컨트롤러라고 생각하시면 편합니다.
당연히 아시겟지만 하나의 서블릿은 HttpServletRequest 및 HttpServletResponse를 처리할 수 있습니다.
하지만!! 하나 이상의 filter는 아래 다음과 같은 목적으로 이용할수 있습니다.
DownStream Filter 인스턴스 또는 서블릿이 호출되는 것을 방지합니다. 이 경우 필터는 일반적으로 HttpServletResponse를 작성합니다.
DownStream Filter 와 서블릿이 사용하는 HttpServletRequest나 HttpServletResponse를 수정합니다
DownStream Filter란?(저도 몰랐네요 ..)
말그대로 특정 필터 이후에 위치하는 필터들을 DownStream Filter라고 합니다.
결국 여기서 말하자고 하는것은요.
원문을보면
The power of the Filter comes from the FilterChain that is passed into it.
저도 이해한느낌이 filter의 강력한 힘은 filterchain을 통함으로라는건데 filter의 강력한점이 filterchain덕분이다 라는뜻 같네요. (혹시나 저도 이부분좀 이해가 안가서 이런느낌인가 합니다.)
간단히 filter chain의 코드를 보겟습니다.
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
// do something before the rest of the application
chain.doFilter(request, response); // invoke the rest of the application
// do something after the rest of the application
}
오늘은 여기까지하고 내일은 DelegatingFilterProxy에 대해서 알아보겠습니다.
'웹 > Spring' 카테고리의 다른 글
InvalidDataAccessApiUsageException: org.hibernate.QueryException: could not instantiate class (0) | 2023.12.06 |
---|---|
Spring Security 구조에 대해서 - DelegatingFilterProxy (0) | 2023.11.24 |
Post Fix 메일 (smtp 서버)/ spring 메일 전송 (1) | 2023.10.31 |
AOP에 대하여 (0) | 2023.10.21 |
FetchType.EAGER vs FetchType.LAZY (0) | 2023.10.09 |