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ํธ ์ ์๊ฐํ๊ณ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.