๐ข J2EE ํ์ค ์คํ ๊ธฐ๋ฅ์ผ๋ก ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ์์ฒญ์ด ์ ๋ฌ๋๊ธฐ ์ /ํ์ url ํจํด์ ๋ง๋ ๋ชจ๋ ์์ฒญ์ ๋ํด ๋ถ๊ฐ์์ ์ ์ฒ๋ฆฌํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณต
๊ฐ๋จํ๊ฒ ๋งํ๋ฉด ์์ฒญ๊ณผ ์๋ต์ ๊ฑฐ๋ฅธ๋ค ์ ์ ํ๋ ์ญํ ์ ํฉ๋๋ค.
์์ ์ฌ์ง์ฒ๋ผ ํํฐ๋ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์๋ ํฐ์บฃ๊ณผ ๊ฐ์ ์น ์ปจํ ์ด๋์ ์ํด ๊ด๋ฆฌ๊ฐ ๋๊ณ , ์คํ๋ง ๋ฒ์ ๋ฐ์์ ์ฒ๋ฆฌ๋ฉ๋๋ค.
javax.servlet์ Filter ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผ ๋ฉ๋๋ค.
public interface Filter {
public default void init(FilterConfig filterConfig) throws ServletException {}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException;
public default void destroy() {}
}
init()
doFilter()
destroy()
๐ข Spring MVC๊ฐ ์ ๊ณตํ๋ ๊ธฐ์ ๋ก์จ, ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ์ปจํธ๋กค๋ฌ๋ฅผ ํธ์ถํ๊ธฐ ์ ๊ณผ ํ์ ์์ฒญ๊ณผ ์๋ต์ ์ฐธ์กฐํ๊ฑฐ๋ ๊ฐ๊ณตํ ์ ์๋ ๊ธฐ๋ฅ ์ ๊ณต
์ฝ๊ฒ ๋งํ๋ฉด ์์ฒญ์ ๋ํ ์์ ์ / ํ๋ก ๊ฐ๋ก์ฑ๋๊ฒ!!!!
์ ์ฌ์ง์ฒ๋ผ ์น ์ปจํ ์ด๋์์ ๋์ํ๋ ํํฐ์ ๋ฌ๋ฆฌ ์ธํฐ์ ํฐ๋ ์คํ๋ง ์ปจํ ์คํธ์์ ๋์์ ํฉ๋๋ค. ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ํธ๋ค๋ฌ ๋งคํ์ ํตํด ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐพ๋๋ก ์์ฒญํ๋๋ฐ, ๊ทธ ๊ฒฐ๊ณผ๋ก ์คํ ์ฒด์ธ์ ๋๋ ค์ค๋๋ค. ์ฌ๊ธฐ์ 1๊ฐ ์ด์์ ์ธํฐ์ ํฐ๊ฐ ๋ฑ๋ก๋์ด ์๋ค๋ฉด ์์ฐจ์ ์ผ๋ก ์ธํฐ์ ํฐ๋ค์ ๊ฑฐ์ณ ์ปจํธ๋กค๋ฌ๊ฐ ์คํ๋๋๋ก ํ๊ณ , ์๋ค๋ฉด ๋ฐ๋ก ์ปจํธ๋กค๋ฌ๊ฐ ์คํ๋ฉ๋๋ค.
org.springframework.web.servlet์ HandlerInterceptor ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค.
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
}
preHandle()
postHandle()
afterCompletion()
ํํฐ๋ Request์ Response๋ฅผ ์กฐ์ํ ์ ์์ง๋ง, ์ธํฐ์ ํฐ๋ ์กฐ์ํ ์ ์์ต๋๋ค.
Filter
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// ๋ค๋ฅธ request์ response๋ฅผ ๋ฃ์ด์ค ์ ์์
chain.doFilter(request, response);
}
}
ํํฐ๊ฐ ๋ค์ ํํฐ๋ฅผ ํธ์ถํ๊ธฐ ์ํด์๋ ํํฐ ์ฒด์ด๋์ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
์ด๋ request, response ๊ฐ์ฒด๋ฅผ ๋๊ฒจ์ฃผ๋ฏ๋ก ์ฐ๋ฆฌ๊ฐ ์ํ๋ request, response ๊ฐ์ฒด๋ฅผ ๋ฃ์ ์ ์์ต๋๋ค.
Interceptor
public class MyInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// Request, Response๋ฅผ ๊ต์ฒดํ ์ ์๊ณ boolean ๊ฐ๋ง ๋ฐํ ๊ฐ๋ฅ
return true;
}
}
๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ์ฌ๋ฌ ์ธํฐ์ ํฐ ๋ชฉ๋ก์ ๊ฐ์ง๊ณ ์๊ณ , ์์ฐจ์ ์ผ๋ก ์คํ์ํต๋๋ค.
true์ ๋ฐํํ๋ฉด ๋ค์ ์ธํฐ์ ํฐ๊ฐ ์คํ๋๊ฑฐ๋ ์ปจํธ๋กค๋ฌ๋ก ์์ฒญ์ด ์ ๋ฌ๋๋ฉฐ, fase๊ฐ ๋ฐํ๋๋ฉด ์์ฒญ์ด ์ค๋จ๋๊ธฐ ๋๋ฌธ์ request, response ๊ฐ์ฒด๋ฅผ ๋๊ฒจ์ค ์ ์์ต๋๋ค.
Filter
Interceptor
์ ๋ฆฌ๋ฅผ ํด๋ณด์๋ฉด
ํํฐ์ ์ธํฐ์ ํฐ ๋ชจ๋ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ถ๋ฆฌ๋์ด ํน์ ์๊ตฌ์ฌํญ(๋ณด์, ์ธ์ฆ, ์ธ์ฝ๋ฉ ๋ฑ)์ ๋ง์กฑ์์ผ์ผ ํ ๋ ์ ์ฉ๋ฉ๋๋ค.
ํํฐ๋ ํน์ ์์ฒญ๊ณผ ์ปจํธ๋กค๋ฌ์ ๊ด๊ณ์์ด ์ ์ญ์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ ์์ ์ด๋ ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ์ ๊ตฌํํ ๋ ์ ์ฉํ๊ณ , ์ธํฐ์ ํฐ๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ๊ณผ ๊ด๋ จ๋ ์์ ์ ๋ํด ์ถ๊ฐ์ ์ธ ์๊ตฌ์ฌํญ์ ๋ง์กฑํด์ผ ํ ๋ ์ ์ฉํฉ๋๋ค.
๐ก Filter์ Interceptor์ ์ฐจ์ด๋ฅผ ์๋ ค์ฃผ์์ค
ํํฐ์ ์ธํฐ์ ํฐ๋ ๋ชจ๋ ๊ณตํต์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ ์ผ๋ค(ex.๋ก๊ทธ์ธ ๊ด๋ จ ์ธ์ ์ฒ๋ฆฌ, ๊ถํ ์ฒดํฌ,
XSS ๋ฐฉ์ด ๋ฑ)์ ์ฒ๋ฆฌํ๋ ์ญํ ์ ํฉ๋๋ค. ํํฐ๋ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ์์ฒญ์ด ์ ๋ฌ๋๊ธฐ ์ /ํ์ url ํจํด์ ๋ง๋ ๋ชจ๋ ์์ฒญ์ ๋ํด ๋ถ๊ฐ์์ ์ ์ฒ๋ฆฌํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํด์ค๋๋ค. ๋ฐ๋ฉด ์ธํฐ์ ํฐ๋ Spring์ด ์ ๊ณตํ๋ ๊ธฐ์ ๋ก์จ, ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ์ปจํธ๋กค๋ฌ๋ฅผ ํธ์ถํ๊ธฐ ์ ๊ณผ ํ์ ์์ฒญ๊ณผ ์๋ต์ ์ฐธ์กฐํ๊ฑฐ๋ ๊ฐ๊ณตํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ฆ ํํฐ๋ ์น ์ปจํ ์ด๋์์, ์ธํฐ์ ํฐ๋ ์คํ๋ง ์ปจํ ์ด๋์์ ๋์ํ๋ค๋ ์ฐจ์ด๊ฐ ์์ต๋๋ค.