

javax.servlet์ Filter ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค.

๊ตฌํ ๋ฉ์๋๋ init, doFilter, destroy 3๊ฐ ์ด์ง๋ง init๊ณผ destroy๋ defaultํค์๋๊ฐ ๋ถ์ด์์ผ๋ฏ๋ก ํ์ ๊ตฌํ์ ์๋๋๋ค.
์ง๊ธ ์์ ์์๋ ์ฌ์ (init), ์ฌํ(destroy) ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ doFilter ๋ฉ์๋๋ง ์ค๋ฒ๋ผ์ด๋ฉ ํด์ค๋๋ค.
๊ฐ์ฅ ๋จผ์ ๋ก๊ทธ์ธํ์ง ์์ ์ฌ์ฉ์(๊ถํ์ด ์๋ ์ฌ์ฉ์)๊ฐ ์ ๊ทผ ๊ฐ๋ฅํ ํ์ด์ง ๋ฐ ์ ์ ๋ฆฌ์์ค๋ฅผ ๋ช ์ํด์ค๋๋ค.
private static final String[] unAuthList = {"/", "/members/add", "/login", "/css/*"};
doFilter ๋ฉ์๋ ๊ตฌํHttpServletRequest์ HttpServletResponse๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๋ค์ด์บ์คํ
ํด์ค๋๋ค.
๋ก๊ทธ์ธ ์ฑ๊ณต์ ์ง์ ์์ฒญ url๋ก redirect๋ฅผ ์ํด ํ์ฌ ์์ฒญ์ URI๋ฅผ ํ์ฑํฉ๋๋ค.
๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ session์ ์ป์ด์ต๋๋ค.
null์ผ์ session์ ์๋ก ์์ฑํ์ง ์๊ธฐ ์ํด getSession๋ฉ์๋๋ false๋ก ์ค์ ํฉ๋๋ค.
PatternMatchUtils ์ ํธ ํด๋์ค์ simpleMatch ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ๊ถํ ์์ด ์ ๊ทผ ๊ฐ๋ฅํ ๋ชฉ๋ก(unAuthList)์ ์์ฒญ๋ URI๊ฐ ์๋์ง ํ์ธํฉ๋๋ค. ์ธ์ฆ์ด ํ์ํ ์์ฒญ์ธ์ง ํ์ธ
์ ๊ทผ ๊ฐ๋ฅ ๋ชฉ๋ก์ ์๋ค๋ฉด ์ธ์ฆ์ ์ํํฉ๋๋ค. (์์ฒญ๋ ์ธ์
์ฟ ํค๋ฅผ ํ์ธ)
๋ง์ฝ ์ธ์ฆ์ ์คํจํ๋ค๋ฉด HttpServletResponse์ sendRedirect ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ๋ก๊ทธ์ธ ํ์ด์ง๋ก redirect ์์ผ์ค๋๋ค.
redirect ํ์ ๋ฐ๋์ return์ ํด์ค์ผ ํฉ๋๋ค. return์ ์๋ฏธ๋ ๋ ์ด์ ๋ค์ ํํฐ๋ก๋ ์๋ธ๋ฆฟ์ผ๋ก๋ ์งํํ์ง ์๊ฒ ๋ค๋ ๊ฒ ์
๋๋ค.
redirect๋ก ์์ฒญ์ ๋ณด๋ด๊ณ ํํฐ์ ์ญํ ์ ๋๋ด๋ ๊ฒ์ด์ง์.
๋ง์ฝ ์ธ์ฆ์ ์ฑ๊ณตํ ์ฌ์ฉ์๋ผ๋ฉด chain.doFilter(request, response)๋ฅผ ์ด์ฉํด ๋ค์ ํํฐ ํน์ ์๋ธ๋ฆฟ์ผ๋ก ์ญ ์งํํฉ๋๋ค.
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
String requestURI = httpRequest.getRequestURI();
HttpSession session = httpRequest.getSession(false);
try {
if (!PatternMatchUtils.simpleMatch(unAuthList, requestURI)) {
if (session == null || session.getAttribute("SESSION-KEY") == null) {
httpResponse.sendRedirect("/login?redirectURL=" + requestURI);
return;
}
}
chain.doFilter(request, response);
} catch (Exception e) {
throw e;
} finally {
log.info("LoginValidFilter ์ข
๋ฃ");
}
}
sendRedirect์ reqeustURI๋ฅผ ํจ๊ป ๋๊ธฐ๋ ์ด์
๋ก๊ทธ์ธ์ ํ์๋ก ํ๋ ์น ์ฌ์ดํธ๋ฅผ ๋์๋ค๋๋ค ๋ณด๋ฉด ํํ ๊ฒฝํํ๋ ํ์์ ๋๋ค.
์ด๋ค ์น ์ฌ์ดํธ์ ๋ค์ด๊ฐ ์ฌ๋ฌ ํ์ด์ง๋ฅผ ๋์ ๋ค๋๋ฉฐ ์ด๋ค ์์ ์ ํ๋ ์ค์ธ๋ฐ ์ค๊ฐ์ ๋ก๊ทธ์ธ์ด ํ์ํ ํ์ด์ง๋ฅผ ๋๋ฅด๊ฒ ๋์ด ๋ก๊ทธ์ธ ํ์ด์ง๋กredirect๋์๋ค๊ณ ๊ฐ์ ํด๋ณผ๊ป์.
๊ท์ฐฎ๊ฒ ์ผ๋จ ๋ก๊ทธ์ธ์ ํ๋๋ฐ ํด๋น ์น ์ฌ์ดํธ์ ํ ํ์ด์ง๋ก ์ด๋๋๋ฉด ์ฌ์ฉ์๋ ๋ค์ ์ด์ ์ ๋ก๊ทธ์ธ์ด ํ์ํ ํ์ด์ง๋ก ์ด๋์ ํด์ผ ํฉ๋๋ค.
์ด๋ฐ ์ํฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด ํํฐ์ ๊ฑธ๋ฆฌ๊ธฐ ์ ์ฆ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋๋๊ธฐ ์ง์ ์ ์์ฒญ์ผ๋ก ์ด๋์์ผ์ค์ผ ํฉ๋๋ค.
์ธ์ฆ์ ์คํจํด์ ํํฐ์ ์ํด ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋์ URL์ /login?redirectURL=/์ง์ ์์ฒญURI์
๋๋ค.
์ด๋ ๊ฒ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋๋ redirectURI๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด POST /login์ปจํธ๋กค๋ฌ๋ฅผ ์์ ํด์ค๋๋ค.
ํด๋น ์ปจํธ๋กค๋ฌ์ ์๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ถ๊ฐํด์ค๋๋ค.
@RequestParam(defaultValue = "/")String redirectURL
๊ทธ๋ฆฌ๊ณ ๋ฆฌํด์ redirect url์ ์๋์ ๊ฐ์ด ๊ตฌ์ฑํด์ค๋๋ค.
์ด๋ ๊ฒ ํด์ฃผ๋ฉด redirectURL๋ก items(์ํ๋ชฉ๋ก์กฐํ)๊ฐ ํจ๊ป ์ ๋ฌ๋๋ค๋ฉด redirect:/items๊ฐ ๋ ๊ฒ์ด๊ณ redirectURL์ด ์๋ค๋ฉด redirect:/๋ก ํ๋ฒํ ๋ก๊ทธ์ธ ์์ฒญ ์ฑ๊ณต์ผ๋ก ํ ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
return "redirect:" + redirectURL;
ํํฐ๋ฅผ Bean์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด ์ค์ ํด๋์ค๊ฐ ์ปดํฌ๋ํธ ์ค์บ์ ๋์์ด ๋๋๋ก @Configuration๋ฅผ ๊ผญ ๋ถ์ฌ์ค์ผ ํฉ๋๋ค.

ํํฐ์ ์ฐ์ ์์, ํํฐ๋ฅผ ์ ์ฉํ๊ณ ์ ํ๋ ์์ฒญ URL ๋ฑ์ ์ค์ ํฉ๋๋ค.
/* ๋ ๋ชจ๋ ์์ฒญ URL์ ์๋ฏธํฉ๋๋ค.
@Bean
public FilterRegistrationBean loginCheckFilter() {
FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();
filterRegistrationBean.setFilter(new LoginCheckFilter());
filterRegistrationBean.setOrder(1);
filterRegistrationBean.addUrlPatterns("/*");
return filterRegistrationBean;
}
์ธํ๋ฐ ๊น์ํ๋์ ์คํ๋ง MVC 2ํธ ์ ์๊ฐํ๊ณ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.