Backend/๐ŸŒฑ Spring

[Spring]Filter

HS0601 2025. 7. 29. 16:36

 

 

 

Filter๋Š” ์™œ ํ•„์š”ํ• ๊นŒ?

 

์šฐ๋ฆฌ๊ฐ€ ์›น ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๋ฉด ์ˆ˜๋งŽ์€ ์š”์ฒญ๋“ค์ด ๋“ค์–ด์˜ค๋Š”๋ฐ, ์ด๋•Œ ๋ชจ๋“  ์š”์ฒญ์— ๊ณตํ†ต์ ์œผ๋กœ ํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…๋“ค์ด ์žˆ๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด
๋กœ๊ทธ์ธํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€
๋กœ๊ทธ ๋‚จ๊ธฐ๊ธฐ(๋ˆ„๊ฐ€ ์–ธ์ œ ๋ญ˜ ์š”์ฒญํ–ˆ๋Š”์ง€)
์š”์ฒญ์— ์ธ์ฝ”๋”ฉ ์ ์šฉ

๊ทผ๋ฐ ์ด๊ฑธ ๋งค๋ฒˆ ์ปจํŠธ๋กค๋Ÿฌ๋งˆ๋‹ค ๋ฐ˜๋ณตํ•ด์„œ ์“ฐ๋ฉด ๋„ˆ๋ฌด ๋น„ํšจ์œจ์ ์ž„
๊ทธ๋ž˜์„œ ์ค‘๊ฐ„์—์„œ ๊ฐ€๋กœ์ฑ„์„œ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ๊ณตํ†ต์ž‘์—…์ž๊ฐ€ ํ•„์š”ํ•จ -> Filter

 

 

Filter๋Š” ์–ด๋””์„œ ๋™์ž‘ํ•˜๋Š”๊ฐ€?
 [์‚ฌ์šฉ์ž ๋ธŒ๋ผ์šฐ์ €] → [Filter] → [์„œ๋ธ”๋ฆฟ(Servlet)] → [Controller]

 

- ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์ด ์˜ค๋ฉด ๋จผ์ € Filter๊ฐ€ ๊ฐ€๋กœ์ฑ”
- ์—ฌ๊ธฐ์„œ ๋กœ๊ทธ์ธ ์—ฌ๋ถ€ ๊ฒ€์‚ฌ, ๋กœ๊ทธ ์ถœ๋ ฅ ๊ฐ™์€ ๊ฑธ ํ•˜๊ณ 
- ํ†ต๊ณผ๋˜๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„(์„œ๋ธ”๋ฆฟ)๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ๊ฑฐ์ž„

 

Filter์˜ ์—ญํ• 

 

1. ์ธ์ฆ๊ฒ€์‚ฌ -> ๋กœ๊ทธ์ธํ•œ ์‚ฌ๋žŒ๋งŒ ์š”์ฒญ ๊ฐ€๋Šฅํ•˜๊ฒŒ
2. ๋กœ๊น…-> ๋ˆ„๊ฐ€ ์–ธ์ œ ์–ด๋””์„œ ์š”์ฒญํ–ˆ๋Š”์ง€ ์ถœ๋ ฅ
3. ์‘๋‹ต์กฐ์ž‘-> ์š”์ฒญ๊ฒฐ๊ณผ๋ฅผ ์ˆ˜์ •ํ•ด์„œ ๋ฐ˜ํ™˜
4. ์š”์ฒญ์ฐจ๋‹จ-> ์กฐ๊ฑด์— ๋งž์ง€ ์•Š์œผ๋ฉด ์š”์ฒญ ์ž์ฒด๋ฅผ ๋ง‰์Œ

 

 

Servlet Filter vs Controller

 

 

๊ตฌ๋ถ„ Servlet Filter Controller
์œ„์น˜ ๋งจ ์•ž๋‹จ์—์„œ ๋™์ž‘ ํ•ต์‹ฌ ๋กœ์ง ์ฒ˜๋ฆฌ
์šฉ๋„ ๊ณตํ†ต ๊ธฐ๋Šฅ(๋ณด์•ˆ, ์ธ์ฆ, ๋กœ๊น… ๋“ฑ) ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(ํšŒ์›๊ฐ€์ž…, ๊ธ€์“ฐ๊ธฐ ๋“ฑ)
ํ˜ธ์ถœ์‹œ์  ์š”์ฒญ์ด ๋“ค์–ด์˜ค์ž๋งˆ์ž Filter๋ฅผ ๋ชจ๋‘ ํ†ต๊ณผํ•œ ํ›„

 

 


 

์ฝ”๋“œ ํ๋ฆ„ ํ•œ๋ˆˆ์— ๋ณด๊ธฐ

 

1) Filter๋งŒ๋“ค๊ธฐ

System.out.println(...)//<= ๋‹จ์ˆœ ์ถœ๋ ฅ
log.info(...)//<= ๋กœ๊น… ์ „์šฉ ๋„๊ตฌ
public class CustomFilter implements Filter {
    @Override <= ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์„œ doFilter๊ฐ€์ ธ์˜ด
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
        // ์š”์ฒญ ๊ฐ€๋กœ์ฑ„๊ธฐ
        HttpServletRequest httpRequest = (HttpServletRequest) request;// <=ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €, ์•ฑ, Postman ๋“ฑ)๊ฐ€ ๋ณด๋‚ธ HTTP ์š”์ฒญ
        System.out.println("์š”์ฒญ URI = " + httpRequest.getRequestURI()); 
//request๋Š” ServletRequest๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…
//httpRequest์•ˆ์—๋Š” ๋ธŒ๋ผ์šฐ์ €๋‚˜ Postman ๊ฐ™์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ ์š”์ฒญ ์ •๋ณด๊ฐ€๋“ค์–ด์žˆ์Œ

        // ๋‹ค์Œ์œผ๋กœ ๋„˜๊น€ (ํ•„ํ„ฐ or ์„œ๋ธ”๋ฆฟ)
        chain.doFilter(request, response);
        // ํ•„ํ„ฐ๋Š” ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„์„œ ๊ฒ€์‚ฌํ•˜๊ฑฐ๋‚˜ ๋กœ๊น…ํ•˜๊ฑฐ๋‚˜ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• .
        //์ตœ์ข…๋ชฉ์ ์ง€๋Š” Controller.
        // ๊ทธ๋ž˜์„œ ์—ฌ๊ธฐ์„œ doFilter()๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์š”์ฒญ์„ ๋„˜๊น€.
        //๋งŒ์•ฝ, chain.doFilter()ํ˜ธ์ถœ ์•ˆ ํ•˜๋ฉด , ์š”์ฒญ์„ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ ˆ๋Œ€ ์•ˆ ๋„˜์–ด๊ฐ.
    }
}

 

2) ๋“ฑ๋กํ•˜๊ธฐ(์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ๊ฐ์ฒดFilter์„ Spring์—๊ฒŒ ์•Œ๋ ค์ฃผ๋Š” ์ž‘์—…)

@Configuration
public class WebConfig {
    @Bean
    public FilterRegistrationBean customFilter() {
        FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();//<=bean์— ์žฌ๋ฃŒ ๋‹ด๊ธฐ
        bean.setFilter(new CustomFilter()); // ํ•„ํ„ฐ ๋“ฑ๋ก <= ํ•„ํ„ฐ๋Š” HTTP ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„์„œ ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋„์šฐ๋ฏธ
        bean.setOrder(1); // ์ˆœ์„œ ์ง€์ • <=ํ•„ํ„ฐ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์„ ์ˆ˜ ์žˆ์Œ
        // ์ธ์ฆ, ๋กœ๊น…, XSSํ•„ํ„ฐ <= ๋ˆ„๊ฐ€ ๋จผ์ € ์‹คํ–‰๋˜๋ฉด ์ข‹์„์ง€ ์ˆœ์„œ๋ฅผ ์ •ํ•ด์•ผ ํ•จ.
        // ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•œ ์ด์œ : ์ธ์ฆ์„ ๋จผ์ € ํ•˜๊ณ , ๊ทธ๋‹ค์Œ ๋กœ๊น…ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ๊น.
        bean.addUrlPatterns("/*"); // ๋ชจ๋“  ์š”์ฒญ์— ํ•„ํ„ฐ ์ ์šฉ 
        // /*๋Š” ๋ชจ๋“  URL์š”์ฒญ์„ ์˜๋ฏธํ•จ.
        //์ฆ‰, ์–ด๋–ค URL๋กœ ์š”์ฒญ์ด ์™€๋„ ์ด ํ•„ํ„ฐ๋ฅผ ๋ฌด์กฐ๊ฑด ๊ฑฐ์ณ๊ฐ€๊ฒŒ ํ•˜๊ฒ ๋‹ค
        
    
        return bean;//<= ๋งˆ์ง€๋ง‰์œผ๋กœ ์žฌ๋ฃŒ ๋ฐ˜ํ™˜
    }
}

 

 

Filter vs Interceptor vs AOP (์–ธ์ œ ๋ญ ์จ์•ผ ๋ผ?)

 

๊ตฌ๋ถ„ ์„ค๋ช… ์‚ฌ์šฉ ์‹œ๊ธฐ
Filter ๊ฐ€์žฅ ๋ฐ”๊นฅ์ชฝ, HTTP ์ˆ˜์ค€์˜ ์š”์ฒญ์„ ๋‹ค๋ฃธ ์š”์ฒญ URL๊ฒ€์‚ฌ, ๋กœ๊ทธ์ธ ์—ฌ๋ถ€ ํ™•์ธ
Intercepter Spring์—์„œ Controller ์ „์— ๋ผ์–ด๋“ฌ ์ปจํŠธ๋กค๋Ÿฌ ์•ž๋’ค๋กœ ๋กœ์ง ์‚ฝ์ž…ํ•  ๋•Œ
AOP ์ฝ”๋“œ ์‹คํ–‰ ์ „/ํ›„๋ฅผ ๊ฐ์‹ธ๋Š” ๊ตฌ์กฐ ๋กœ๊น…, ํŠธ๋žœ์žญ์…˜, ๊ณตํ†ต ๋กœ์ง ์ ์šฉ ๋“ฑ