Post

[Spring Security] DelegatingFilterProxy์™€ FilterChainProxy

[Spring Security] DelegatingFilterProxy์™€ FilterChainProxy

๐Ÿ“Œ Filter

Spring Security๋Š” Filter ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. Filter ๋ž€ ๋ฌด์—‡์ผ๊นŒ?

image.png

ํด๋ผ์ด์–ธํŠธ๊ฐ€ WAS, Web Application Server์— ์š”์ฒญ(HttpServletRequest)์„ ๋ณด๋‚ด๋ฉด ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋Š” URI์™€ Servlet ์„ ๋ณด๊ณ  FilterChain ์„ ์ƒ์„ฑํ•œ๋‹ค.

์š”์ฒญ์€ ์ตœ์ข…์ ์œผ๋กœ Servlet ์— ๋„์ฐฉํ•˜๋Š”๋ฐ, ์ด ๊ณผ์ •์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Filter ๋ฅผ ๊ฑฐ์น˜๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ์ผ๋ จ์˜ ๋‹จ๊ณ„๋“ค์„ FilterChain ์ด๋ผ๊ณ  ํ•œ๋‹ค.

Servlet ์€ ์‹ค์งˆ์ ์ธ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์ž์ด๋ฉฐ, Spring MVC์—์„œ๋Š” ๋Œ€๋ถ€๋ถ„์ด DispatcherServlet ์ด ๋‹ด๋‹นํ•œ๋‹ค. ํ•˜๋‚˜์˜ ์š”์ฒญ์€ ๋‹จ ํ•˜๋‚˜์˜ Servlet ์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋œ๋‹ค.

Filter ๋Š” ์ค‘๊ฐ„ ์ž‘์—…์ž๋กœ, ์ง„์งœ ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ Servlet ์— ๋„๋‹ฌํ•˜๊ธฐ๊นŒ์ง€ โ€˜ํ•„ํ„ฐโ€™ ์—ญํ• ์„ ํ•œ๋‹ค. ๋ฐ›์€ ์š”์ฒญ์„ ๊ฑฐ์ ˆํ•˜๊ฑฐ๋‚˜ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

1
2
3
4
5
6
@Override
public void doFilter(ServletRequest request, ServletResponse response,
		FilterChain chain) throws IOException, ServletException {
		
	chain.doFilter(request, response);
}

์ˆ˜ํ–‰ํ•œ ์ž‘์—…์˜ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์Œ ํ•„ํ„ฐ์— ๋„˜๊ธฐ๊ธฐ ์œ„ํ•ด doFilter ๋ฉ”์„œ๋“œ๋Š” FilterChain ์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋Š”๋‹ค. chain.doFilter(request, response) ์€ ํ˜„์žฌ ์ž‘์—…์˜ ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ๋‹ค์Œ ํ•„ํ„ฐ๋กœ ๋„˜๊ธฐ๋Š” ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ด๋Š” ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ doFilter ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „ํ›„๋กœ ์ž‘์—…์„ ์ •์˜ํ•˜์—ฌ ์ „/ํ›„์ฒ˜๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

ํ•„ํ„ฐ๋Š” ์ž์‹  ๋’ค์— ์žˆ๋Š” ํ•„ํ„ฐ์™€ ์„œ๋ธ”๋ฆฟ์—๋งŒ ์˜ํ–ฅ์„ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, ์‹คํ–‰ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค.

๐Ÿ“Œ DelegatingFilterProxy

์•ž์„œ ์‚ดํŽด ๋ณธ ํ•„ํ„ฐ๋Š” ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค. ๋ฐ˜๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•œ ๊ฐ์ฒด๋‚˜ ์„ค์ •์€ ์Šคํ”„๋ง์˜ IoC ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋นˆ์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. ์ด๋Š” ๋‘ ์ปจํ…Œ์ด๋„ˆ์˜ ์ƒ๋ช… ์ฃผ๊ธฐ๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ํ•„ํ„ฐ์—์„œ @Autowired ๋ฅผ ํ†ตํ•ด ์Šคํ”„๋ง ๋นˆ์„ ์ฃผ์ž…๋ฐ›์„ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

image.png

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ํ•„ํ„ฐ๊ฐ€ DelegatingFilterProxy ์ด๋‹ค. DelegatingFilterProxy ์—๋Š” ์–ด๋– ํ•œ ๋ณด์•ˆ ๋กœ์ง๋„ ์—†์œผ๋ฉฐ, ์œ ์ผํ•˜๊ฒŒ ํ•˜๋Š” ๋™์ž‘์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—์„œ โ€˜ํŠน๋ณ„ํ•œ ๋นˆโ€™์„ ์ฐพ์•„ ํ•ด๋‹น ๋นˆ์—๊ฒŒ ๋ชจ๋“  ์ฒ˜๋ฆฌ๋ฅผ ์œ„์ž„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿ“Œ FilterChainProxy

image.png

๋ณด์•ˆ ์ฒ˜๋ฆฌ๋ฅผ ์œ„์ž„๋ฐ›๋Š” ํŠน๋ณ„ํ•œ ๋นˆ์ด ๋ฌด์—‡์ผ๊นŒ? ๋ฐ”๋กœ FilterChainProxy ์ด๋‹ค. FilterChainProxy ๋Š” ์Šคํ”„๋ง IoC ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋ก๋˜์–ด ์žˆ๋‹ค.

1
2
3
4
5
6
public class FilterChainProxy extends GenericFilterBean {

	// ...

	private List<SecurityFilterChain> filterChains;
}

FilterChainProxy ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ List<SecurityFilterChain> ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. DelegatingFilterProxy ๋กœ๋ถ€ํ„ฐ ์š”์ฒญ์„ ์ „๋‹ฌ๋ฐ›์œผ๋ฉด ์š”์ฒญ์˜ URI, HTTP ๋ฉ”์„œ๋“œ ๋“ฑ์„ ๋ณด๊ณ  filterChains ์—์„œ ํ•ด๋‹น ์š”์ฒญ์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ SecurityFilterChain ์„ ํ•˜๋‚˜ ์„ ํƒํ•œ๋‹ค. ์ดํ›„ ์„ ํƒํ•œ SecurityFilterChain ์— ๋“ฑ๋ก๋œ ๋ณด์•ˆ ํ•„ํ„ฐ๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰์‹œํ‚ค๊ณ , ์„ฑ๊ณต์ ์œผ๋กœ ํ†ต๊ณผ๋˜๋ฉด ์š”์ฒญ์„ DispatcherServlet ์œผ๋กœ ์ „๋‹ฌํ•œ๋‹ค.

๐Ÿ“Œ ์ฐธ๊ณ 

https://docs.spring.io/spring-security/reference/servlet/architecture.html

This post is licensed under CC BY 4.0 by the author.