[Spring Security] docs: Architecture (2) - DelegatingFilterProxy
๐ป Spring Security docs ๊ฒ์๊ธ ๋ชฉ์ฐจ
1. [Spring Security] docs : Getting Started
[Spring Security] docs : Getting Started
Spring Security๋ ์ธ์ฆ, ๊ถํ๋ถ์ฌ ๋ฐ ์ผ๋ฐ์ ์ธ ๊ณต๊ฒฉ์ ๋ํ ๋ณดํธ๋ฅผ ์ ๊ณตํ๋ ํ๋ ์์ํฌ์ด๋ค. ๊ฐ๋ฐ์๊ฐ ๋ณด์ ์ค์ ์ ์ถ๊ฐ์ ์ผ๋ก ์ ๊ฒฝ์ฐ์ง ์๋๋ผ๋ ์์ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น ๋ฅด๊ฒ ๊ตฌ์ถํ ์ ์๋
kiritoni.tistory.com
2. [Spring Security] docs : Architecture (1) - Filter
[Spring Security] docs : Architecture (1) - Filter
Spring Security docs Hello Spring Security :: Spring SecurityRunning Spring Boot Application $ ./mvnw spring-boot:run ... INFO 23689 --- [ restartedMain] .s.s.UserDetailsServiceAutoConfiguration : Using generated security password: 8e557245-73e2-4286-969a
kiritoni.tistory.com
3. [Spring Security] docs: Architecture (2) - DelegatingFilterProxy
[Spring Security] docs: Architecture (2) - DelegatingFilterProxy
Spring Security docs Hello Spring Security :: Spring SecurityRunning Spring Boot Application $ ./mvnw spring-boot:run ... INFO 23689 --- [ restartedMain] .s.s.UserDetailsServiceAutoConfiguration : Using generated security password: 8e557245-73e2-4286-969a
kiritoni.tistory.com
๐ฑ Spring Security docs ๋ฐ๋ก๊ฐ๊ธฐ
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
DelegatingFilterProxy ์์ ํํฐ ํ๋ก์
DelegatingFilterProxy๋ Spring๊ณผ ์๋ธ๋ฆฟ ์ปจํ ์ด๋ ๊ฐ์ ์ฐ๊ฒฐ์ ๋๋ Filter ๊ตฌํ์ฒด๋ก, ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ๋ผ์ดํ์ฌ์ดํด๊ณผ Spring์ ApplicationContext๊ฐ์ bridge ์ญํ ์ ํ๋ค.
`DelegatingFilterProxy`์ ์ญํ ๊ณผ ์๋ ๋ฐฉ์
1. ์์ํ๋ค.
๋จผ์ `DelegatingFilterProxy`๋ฅผ ๋น์ ๋ก ์ดํดํด๋ณด์.
`DelegatingFilterProxy`๋ฅผ ์ ํ ๊ตํ์์ด๋ผ๊ณ ํด๋ณด์.
์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์ด ์ ํ ๊ตํ์์๊ฒ ์ ํ๋ฅผ ๊ฑด๋ค. (= ํํฐ ์์ฒญ)
๊ตํ์(= `DelegatingFilterProxy`)๋ ์ค์ ๋ก ์ ํ๋ฅผ ๋ฐ๋ ์ฌ๋์ด ์๋๋ผ, ๋์ ์ ํ๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ์ญํ ์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ Spring ์ปจํ ์คํธ ์์์ "์ง์ง ํํฐ ๋น"์ ์ฐพ์ ๊ทธ ์ฌ๋ํํ ์ ํ๋ฅผ ์ฐ๊ฒฐํด์ค๋ค.
์ด๋ ๊ฒ ์ค์ ์์ (= ์ ํ ๋ฐ๊ธฐ)์ Spring์ ํํฐ ๋น์ด ์ฒ๋ฆฌํ๊ฒ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ ์์(delegate)ํ๋ ๊ฒ์ผ๊น?
์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ Spring์ด ๊ด๋ฆฌํ๋ ๋น์ ๋ํด ์์ง ๋ชปํ๋ค. ๋ฐ๋ผ์ Spring์ ํํฐ๋ฅผ ์ง์ ํธ์ถํ ์๊ฐ ์๋ค.
`DelegatingFilterProxy`๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ Spring ์ฌ์ด์ ๋ค๋ฆฌ, ์ ํ ๊ตํ์ ์ญํ ์ ํ์ฌ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ๋ง์น Spring์ ํํฐ๋ฅผ ์ง์ ํธ์ถํ๋ ๊ฒ์ฒ๋ผ ๋ง๋ค์ด์ค๋ค!
์ฆ, DelegatingFilterProxy๋ ์ค์ ๋ก Filter ์์ ์ ์ํํ์ง ์๊ณ , ๋์ Spring์ ApplicationContext์์ ๊ด๋ฆฌํ๋ ์ค์ Filter ๋น์ ์์ ์ ์์(delegate)ํ๋ ๊ฒ์ด๋ค.
2. ์๋ ๊ณผ์
- ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ `FilterChain`์ ๋ฑ๋ก๋ ๊ฐ `Filter`๋ฅผ ์ฐจ๋ก๋ก ํธ์ถํ๋ค.
- `DelegatingFilterProxy`๋ ์ด๋ฌํ `Filter`์ค ํ๋๋ก, ์์ ์ด ์ฒ๋ฆฌํ๋ ์ฐจ๋ก๊ฐ ๋๋ฉด Spring์ `ApplicationContext`์ ์ง์ ๋ ์ด๋ฆ์ `Filter`๋น์ ์ฐพ๋๋ค.
- ๊ทธ ํ, ์ฐพ์ ๋น์ด `Filter` ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ์๋ค๋ฉด ํด๋น ๋น์ `doFilter()`๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํ๋๋ก ์์ํ๋ค.
3. ์ด์
- `DelegatingFilterProxy`๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์ค์ ๊ณผ Spring์ ์ค์ ์ ์ ์ฐํ๊ฒ ์กฐํ์ํฌ ์ ์๋ค.
- Spring ๊ด๋ฆฌ ๋น์ ์ฌ์ฉํ์ฌ ํํฐ๋ฅผ ๊ตฌํํจ์ผ๋ก์จ, ์คํ๋ง์ ๋ชจ๋ ๊ธฐ๋ฅ์ ํ์ฉํ ์ ์๋ค.
Lazy loading
`DelegatingFilterProxy`์ ํต์ฌ ๊ฐ๋ ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ Spring ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ ๊ฐ์ ์ง์ฐ ๋ก๋ฉ(lazy loading)์ ํตํ ์ฐ๊ฒฐ์ด๋ค. `DelegatingFilterProxy`๋ฅผ ์ฌ์ฉํ๋ฉด Spring ์ปจํ ์คํธ๊ฐ ์ด๊ธฐํ๋๊ธฐ ์ ์ ํํฐ ์ธ์คํด์ค๋ฅผ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ๋ฑ๋กํ ์ ์๋ค. ์ด๋ฅผ ํตํด Spring์ด ๊ด๋ฆฌํ๋ bean์ ํํฐ๋ก ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
DelegatingFilterProxy ์์ฌ ์ฝ๋
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
Filter delegate = getFilterBean(someBeanName);
delegate.doFilter(request, response, chain);
}
1. ํํฐ ๋น์ lazy loading ๋ฐฉ์์ผ๋ก ๊ฐ์ ธ์จ๋ค.
`DelegatingFilterProxy`๋ ํํฐ๋ฅผ ์ฒ์๋ถํฐ ๋ฐ๋ก ๊ฐ์ ธ์ค์ง ์๊ณ ํ์ํ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค.
์๋ฅผ ๋ค์ด, ๋๊ตฐ๊ฐ๊ฐ ์ค์ ๋ก ์น ์์ฒญ์ ๋ณด๋ผ ๋๊น์ง๋ ํํฐ๊ฐ ํ์ ์์ผ๋ฏ๋ก, ํํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์์ ์ ๋ฏธ๋ฃจ๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์์คํ ๋ฆฌ์์ค๋ฅผ ์ ์ฝํ ์ ์๋ค.
2. ํํฐ ๋น์ด ํ์ํ ๋๊น ๋๋ฉด...
๋๊ตฐ๊ฐ ์น ์์ฒญ์ ๋ณด๋ด๋ฉด, `DelegatingFilterProxy`๋ ์ด์ ๋ถํฐ `ApplicationContext`์์ ํํฐ ๋น์ ์ฐพ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฐพ์ ํํฐ ๋น์ `doFilter(request, response, chain)` ๋ฉ์๋๋ฅผ ํธ์ถํด์ ์ค์ ์์ ์ ์ํํ๋ค.
๐ ์ ์ด๋ ๊ฒ ํ ๊น?
์๋ธ๋ฆฟ ์ปจํ ์ด๋์ Spring์ ์ด๊ธฐํ ์์ ๋ฌธ์ ํด๊ฒฐ์ ์ํด์์ด๋ค.
์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํ ๋ ๋ชจ๋ ํํฐ๋ฅผ ๋ฏธ๋ฆฌ ๋ฑ๋กํด์ผ ํ๋ค. ํ์ง๋ง Spring ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณดํต `ContextLoaderListener `๋ฅผ ์ฌ์ฉํ์ฌ ์ด๊ธฐํ๋๊ณ , ์ด ์ด๊ธฐํ ๊ณผ์ ์ ํํฐ๊ฐ ๋ฑ๋ก๋ ํ์์ผ ์๋ฃ๋๋ค. ๊ทธ๋์ ๋ง์ฝ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ํํฐ๋ฅผ ๋ฑ๋กํ ๋, Spring์ด ์์ง ์์ ํ ์ด๊ธฐํ๋์ง ์์๋ค๋ฉด ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ค. ๋ฐ๋ผ์ lazy loading์ ํตํด์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๋ Spring์ด ์์ง ์ด๊ธฐํ๋์ง ์์๋๋ผ๋ ํํฐ๋ฅผ ๋ฑ๋กํ ์ ์๋ค. ๊ทธ๋ฐ ๋ค์, Spring์ด ๋ค ์ค๋น๋์์ ๋, ์ค์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด DelegatingFilterProxy๊ฐ ์ง์ง ํํฐ ๋น์ ๊ฐ์ ธ์์ ์์ ์ ์ฒ๋ฆฌํด์ค๋ค.