Spring Boot

[Spring Security] docs: Architecture (2) - DelegatingFilterProxy

kiritoni 2024. 8. 29. 22:48
๋ฐ˜์‘ํ˜•

๐Ÿ”ป 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. ์ž‘๋™ ๊ณผ์ •

  1. ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋Š” `FilterChain`์— ๋“ฑ๋ก๋œ ๊ฐ `Filter`๋ฅผ ์ฐจ๋ก€๋กœ ํ˜ธ์ถœํ•œ๋‹ค. 
  2. `DelegatingFilterProxy`๋Š” ์ด๋Ÿฌํ•œ `Filter`์ค‘ ํ•˜๋‚˜๋กœ, ์ž์‹ ์ด ์ฒ˜๋ฆฌํ•˜๋Š” ์ฐจ๋ก€๊ฐ€ ๋˜๋ฉด Spring์˜ `ApplicationContext`์— ์ง€์ •๋œ ์ด๋ฆ„์˜ `Filter`๋นˆ์„ ์ฐพ๋Š”๋‹ค. 
  3. ๊ทธ ํ›„, ์ฐพ์€ ๋นˆ์ด `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๊ฐ€ ์ง„์งœ ํ•„ํ„ฐ ๋นˆ์„ ๊ฐ€์ ธ์™€์„œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค. 

 

 

 

 

๋ฐ˜์‘ํ˜•