ํํฐ(Filter)๋ ๋์คํจ์ฒ ์๋ธ๋ฆฟ(Dispatcher Servlet)์ผ๋ก ์์ฒญ์ด ์ ๋ฌ๋๊ธฐ ์ / ํ์, ํน์ URL ํจํด์ ๋ง๋ ๋ชจ๋ ์์ฒญ์ ๋ํด ๋ถ๊ฐ์ ์ธ ์์ ์ ์ํํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.

๊ทธ๋ฆผ์์ ๋ณผ ์ ์๋ฏ์ด, ํํฐ๋ ์คํ๋ง ์ปจํ ์ด๋์ ๊ด๋ฆฌ ๋ฒ์ ๋ฐ์์ ๋์ํ๋ฉฐ, ํฐ์บฃ(Tomcat)๊ณผ ๊ฐ์ ์น ์ปจํ ์ด๋์ ์ํด ๊ด๋ฆฌ๋๋ค.
์ฆ, ์์ฒญ์ด ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ๋๋ฌํ๊ธฐ ์ ์ด๋ ์๋ต์ด ๋ฐํ๋ ํ์ ์ฒ๋ฆฌ๋๋ ์ญํ ์ ์ํํ๋ค.
| ๋ฉ์๋ | ํธ์ถ ์์ | ์ฃผ์ ์ญํ |
|---|---|---|
init(FilterConfig filterConfig) | ํํฐ๊ฐ ์ด๊ธฐํ๋ ๋ ํ ๋ฒ ํธ์ถ | ๋ฆฌ์์ค ๋ก๋, ์ค์ ๊ฐ ์ด๊ธฐํ ๋ฑ |
doFilter(ServletRequest request, ServletResponse response, FilterChain chain) | ์์ฒญ์ด ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ผ๋ก ์ ๋ฌ๋๊ธฐ ์ ๊ณผ ์๋ต์ด ๋์๊ฐ๊ธฐ ์ | ์์ฒญ ์ /ํ ์ฒ๋ฆฌ, ๋ค์ ํํฐ ๋๋ ์๋ธ๋ฆฟ ํธ์ถ (chain.doFilter) |
destroy() | ํํฐ๊ฐ ์ข ๋ฃ๋ ๋ ํ ๋ฒ ํธ์ถ | ๋ฆฌ์์ค ์ ๋ฆฌ, ์ข ๋ฃ ์์ ๋ฑ |
์๋ฐ์์ ํํฐ ์ฌ์ฉ ์์
import javax.servlet.*;
import java.io.IOException;
public class CustomFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// ํํฐ๊ฐ ์ด๊ธฐํ๋ ๋ ํ ๋ฒ ํธ์ถ๋จ (์: ๋ฆฌ์์ค ๋ก๋)
System.out.println("CustomFilter ์ด๊ธฐํ");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// ์์ฒญ์ด ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ผ๋ก ์ ๋ฌ๋๊ธฐ ์ ์ํํ ์์
System.out.println("์์ฒญ ์ ์ ์คํ๋๋ ํํฐ ๋ก์ง");
// ๋ค์ ํํฐ ๋๋ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ผ๋ก ์์ฒญ์ ์ ๋ฌ
chain.doFilter(request, response);
// ์๋ต์ด ํด๋ผ์ด์ธํธ๋ก ๋์๊ฐ๊ธฐ ์ ์ํํ ์์
System.out.println("์๋ต ํ์ ์คํ๋๋ ํํฐ ๋ก์ง");
}
@Override
public void destroy() {
// ํํฐ๊ฐ ์ข
๋ฃ๋ ๋ ํธ์ถ๋จ (์: ๋ฆฌ์์ค ์ ๋ฆฌ)
System.out.println("CustomFilter ์ข
๋ฃ");
}
}
์ธํฐ์ ํฐ(Interceptor)๋ ์คํ๋ง(Spring)์ด ์ ๊ณตํ๋ ๊ธฐ์ ๋ก, ๋์คํจ์ฒ ์๋ธ๋ฆฟ(Dispatcher Servlet)์ด ์ปจํธ๋กค๋ฌ๋ฅผ ํธ์ถํ๊ธฐ ์ ๊ณผ ํ์ ์์ฒญ๊ณผ ์๋ต์ ์ฐธ์กฐํ๊ฑฐ๋ ๊ฐ๊ณตํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
์ฆ, ์ธํฐ์ ํฐ๋ ์คํ๋ง ์ปจํ ์คํธ ๋ด๋ถ์์ ๋์ํ๋ฉฐ, ์คํ๋ง์ด ๊ด๋ฆฌํ๋ ๋น(Bean)์ผ๋ก์ ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง๊ณผ ๋ฐ์ ํ๊ฒ ์ฐ๋๋๋ค.

๋์คํจ์ฒ ์๋ธ๋ฆฟ(Dispatcher Servlet)์ ํธ๋ค๋ฌ ๋งคํ(Handler Mapping)์ ํตํด ์์ฒญ์ ์๋ง์ ์ปจํธ๋กค๋ฌ๋ฅผ ํ์ํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ก ์คํ ์ฒด์ธ(HandlerExecutionChain)์ ๋ฐํํ๋ค.
์ด ์คํ ์ฒด์ธ์๋ ํ๋ ์ด์์ ์ธํฐ์
ํฐ(Interceptor)๊ฐ ํฌํจ๋ ์ ์์ผ๋ฉฐ,
๋ฑ๋ก๋ ์ธํฐ์
ํฐ๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ ์์ฐจ์ ์ผ๋ก ์ธํฐ์
ํฐ๋ฅผ ๊ฑฐ์น ํ ์ปจํธ๋กค๋ฌ๊ฐ ์คํ๋๋ค.
๋ฐ๋๋ก ์ธํฐ์
ํฐ๊ฐ ์๋ค๋ฉด, ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ๊ณง๋ฐ๋ก ํด๋น ์ปจํธ๋กค๋ฌ๋ฅผ ํธ์ถํ๋ค.
| ๋ฉ์๋ | ์คํ ์์ | ์ฃผ์ ์ญํ |
|---|---|---|
preHandle() | ์ปจํธ๋กค๋ฌ ์คํ ์ (before) | ์์ฒญ ์ ์ฒ๋ฆฌ (๋ก๊ทธ, ์ธ์ฆ, ๊ถํ ๊ฒ์ฌ ๋ฑ) |
postHandle() | ์ปจํธ๋กค๋ฌ ์คํ ํ, View ๋ ๋๋ง ์ | ์ปจํธ๋กค๋ฌ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ ๊ฐ๊ณต, ๋ชจ๋ธ ๋ฐ์ดํฐ ์ถ๊ฐ ๋ฑ |
afterCompletion() | View ๋ ๋๋ง ์๋ฃ ํ | ๋ฆฌ์์ค ์ ๋ฆฌ, ์์ธ ์ฒ๋ฆฌ ๋ก๊น ๋ฑ |
์๋ฐ์์ ์ธํฐ์ ํฐ ์ฌ์ฉ ์์
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CustomInterceptor implements HandlerInterceptor {
// ์ปจํธ๋กค๋ฌ ์คํ ์
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("preHandle: ์ปจํธ๋กค๋ฌ ์คํ ์ ๋ก์ง");
return true; // false๋ฅผ ๋ฐํํ๋ฉด ์ดํ ์ฒด์ธ(๋ค์ ์ธํฐ์
ํฐ/์ปจํธ๋กค๋ฌ)์ผ๋ก ์งํ๋์ง ์์
}
// ์ปจํธ๋กค๋ฌ ์คํ ํ, View ๋ ๋๋ง ์
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle: ์ปจํธ๋กค๋ฌ ์คํ ํ ๋ก์ง");
}
// View ๋ ๋๋ง ์๋ฃ ํ (์์ธ ๋ฐ์ ์์๋ ํธ์ถ)
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion: ์์ฒญ ์ฒ๋ฆฌ ์๋ฃ ํ ๋ก์ง");
}
}
๋ด๊ฐ ์ด๊ฑธ ํํฐ์ ์ธํฐ์ ํฐ๋ฅผ ์ ๋ฆฌํด์ผ๊ฒ ๋ค๊ณ ๋ง์ ๋จน์ ์ด์ ๋ค. ํํฐ์ ์ธํฐ์ ํฐ์ ์ฐจ์ด์ ์ ์ด๋์ ๋ ์๊ณ ์์์ง๋ง ๋ณดํต ์ด๋ค ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋์ง ํท๊ฐ๋ฆฌ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ค.
ํํฐ(Filter)๋ ์คํ๋ง๊ณผ ๋ฌด๊ดํ๊ฒ ์ ์ญ์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ ์์
์ ์ ํฉํ๋ค.
๋ํ์ ์ผ๋ก ๋ณด์ ๊ณตํต ์์
์ด ์์ผ๋ฉฐ, ์ธํฐ์
ํฐ๋ณด๋ค ์๋จ์์ ๋์ํ๋ฏ๋ก XSS ๋ฐฉ์ด ๋ฑ ์ฌ๋ฐ๋ฅด์ง ์์ ์์ฒญ์ ์ฐจ๋จํ ์ ์๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์คํ๋ง ์ปจํ
์ด๋๊น์ง ์์ฒญ์ด ์ ๋ฌ๋์ง ์์ ์์ ์ฑ์ ๋์ผ ์ ์๋ค.
๋ํ ์ด๋ฏธ์ง๋ ๋ฐ์ดํฐ ์์ถ, ๋ฌธ์์ด ์ธ์ฝ๋ฉ ๋ฑ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐ์ ๊ฑธ์น ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ์๋ ์ ํฉํ๋ค.
Filter๋ ๋ค์ ์ฒด์ธ์ผ๋ก ๋๊ธฐ๋ ServletRequest์ ServletResponse ๊ฐ์ฒด๋ฅผ ์ง์ ์กฐ์ ๊ฐ๋ฅํ๋ฏ๋ก, Interceptor๋ณด๋ค ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
ํํฐ(Filter)๋ฅผ ์ธ์ฆ, ์ธ๊ฐ์ ์ฌ์ฉํ๋ ๋๊ตฌ์๋ ์คํ๋ง ์ํ๋ฆฌํฐ(Spring Security)๊ฐ ์๋ค. ์คํ๋ง ์ํ๋ฆฌํฐ(Spring Security)๋ Spring MVC์ ์ข ์์ ์ด์ง ์๋ค.
์ธํฐ์ ํฐ๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ๊ณผ ๊ด๋ จ๋ ์ ์ญ์ ์ธ ์์ ์ ์ฒ๋ฆฌํ ๋ ์ ํฉํ๋ค. ์๋ฅผ ๋ค์ด, ํน์ ๊ทธ๋ฃน์ ์ฌ์ฉ์๊ฐ ์ ๊ทผํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ํํ๋ ์ธ์ฆ์ด๋ ์ธ๊ฐ ์์ ์ ์ปจํธ๋กค๋ฌ๋ก ์์ฒญ์ด ์ ๋ฌ๋๊ธฐ ์ ์ ๊ฒ์ฌํด์ผ ํ๋ฏ๋ก ์ธํฐ์ ํฐ์์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ข๋ค.
๋ํ ์ธํฐ์ ํฐ๋ HttpServletRequest์ HttpServletResponse ๊ฐ์ฒด๋ฅผ ์ ๊ณต๋ฐ์ ์ฌ์ฉํ ์ ์๋ค. ๊ฐ์ฒด ์์ฒด๋ฅผ ๋ฐ๊พธ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ์ง๋ง, ๋ด๋ถ ๊ฐ์ ์กฐ์ ๊ฐ๋ฅํ์ฌ ์ปจํธ๋กค๋ฌ๋ก ์ ๋ฌํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ๊ธฐ์ ์ฉ์ดํ๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์์ ID๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์กฐํํ ์ ๋ณด๋ฅผ ์์ฒญ ๊ฐ์ฒด์ ๋ด์ ์ปจํธ๋กค๋ฌ์์ ํ์ฉํ ์ ์๋ค.
์ด ์ธ์๋ API ํธ์ถ์ ๋ํ ๋ก๊น ์ด๋ ํด๋ผ์ด์ธํธ ์ ๋ณด ๊ธฐ๋ก ๋ฑ ๋ค์ํ ์์ ์๋ ์ธํฐ์ ํฐ๋ฅผ ํ์ฉํ ์ ์๋ค. ํด๋ผ์ด์ธํธ์ IP, ์์ฒญ URL, ํค๋ ์ ๋ณด ๋ฑ์ ๊ธฐ๋กํ๋ ๋ฐ ๋งค์ฐ ํธ๋ฆฌํ๋ค.
์ฆ, ์ธํฐ์ ํฐ๋ ์ปจํธ๋กค๋ฌ ์คํ ์ ํ์ ์์ฒญ๊ณผ ์๋ต์ ํ์ฉํด ์ธ๋ฐํ ์ ์ด, ๋ฐ์ดํฐ ๊ฐ๊ณต, ๋ก๊น ์ ์ํํ ์ ์๋ ๋๊ตฌ๋ค.
์ฐธ๊ณ