8. JWT๋ฅผ ์ฌ์ฉํ๊ธฐ ์ Filter ๋ฑ๋ก ํ ์คํธ
์ด ํฌ์คํธ๋ ๋ฐ์ด ํ๋ก๊ทธ๋๋ฐ๋์ ์ ํ๋ธ ๊ฐ์๋ฅผ ๋ฃ๊ณ ๋์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
Spring Security Filter ๊ตฌ์กฐ
ํํฐ๋ฅผ ๋ฑ๋กํ๊ธฐ ์ SpringFilterChain
๊ตฌ์กฐ์ ๋ํด์ ๋จผ์ ์๋ฉด ์ข์ต๋๋ค.
Filter๋ฅผ ์์ฑํด๋ณด์
public class MyFilter1 implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("Filter 1");
filterChain.doFilter(servletRequest, servletResponse); // ๋ค์ ํํฐ๋ก ๋์ด๊ฐ๋ผ๋ ์๋ฏธ
}
}
- Servlet ์๋์ ์๋ Filter ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ฃผ๋ฉด ๋ฉ๋๋ค.
- ํด๋น ํํฐ์์ ์ฒ๋ฆฌํ๊ณ ๋ค์ ๋ค์ ํํฐ๋ก ๋๊ฒจ์ฃผ๋
doFilter
ํธ์ถ์ ํด์ค์ผํฉ๋๋ค.
Filter ๋ฑ๋ก
addFilter(Filter filter)
addFilterBefore(Filter filter, Class<? extends Filter> beforeFilter)
addFilterAfter(Filter filter, Class<? extends Filter> afterFilter)
addFilter
http.addFilter(new MyFilter1());
์๋ฌ ๋ฉ์ธ์ง:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'springSecurityFilterChain' defined in class path resource [org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.servlet.Filter]: Factory method 'springSecurityFilterChain' threw exception; nested exception is java.lang.IllegalArgumentException: The Filter class me.iseunghan.jwttutorial.filter.MyFilter1 does not have a registered order and cannot be added without a specified order. Consider using addFilterBefore or addFilterAfter instead.
MyFilter1์ SpringSecurityFilterChain์ ๋ฑ๋ก๋์ง ์์์ผ๋ ๋ฑ๋กํ๊ณ ์ถ์ผ๋ฉด addFilterBefore or addFilterAfter
๋ฅผ ์ฌ์ฉํ๋ผ!
์ฌ์ฉํด๋ด ์๋ค.
addFilterBefore
http.addFilterBefore(new MyFilter1(), UsernamePasswordAuthenticationFilter.class);
UsernamePasswordAuthenticationFilter ์ง์ ์ MyFilter๊ฐ ๊ฑธ๋ฆฌ๋๋ก ํฉ๋๋ค.
addFilterBefore
http.addFilterAfter(new MyFilter1(), UsernamePasswordAuthenticationFilter.class);
UsernamePasswordAuthenticationFilter ์ดํ์ MyFilter๊ฐ ๊ฑธ๋ฆฌ๋๋ก ํฉ๋๋ค.
FilterConfig ์์ฑ
๊ตณ์ด SecurityConfg์์ ์ถ๊ฐํ์ง ๋ง๊ณ , ๋ฐ๋ก FilterConfig๋ฅผ ์์ฑํ์ฌ ๋ฑ๋กํด๋ณด๊ฒ ์ต๋๋ค.
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean<MyFilter1> filter1() {
FilterRegistrationBean<MyFilter1> bean = new FilterRegistrationBean<>(new MyFilter1());
bean.addUrlPatterns("/*"); // ๋ชจ๋ ์์ฒญ์ ๋ํด์ ํํฐ ์ ์ฉ
bean.setOrder(0); // ๋ฎ์ ์ซ์์ผ์๋ก ์ฐ์ ์์
return bean;
}
}
FilterRegistrationBean
์ ์์ฑํ์ฌ MyFilter1์ ๋น์ผ๋ก ๋ฑ๋ก์์ผ์ฃผ๋ฉด ๋์ ๋๋ค.- urlPatterns
"/**"
๊ฐ ์๋ ์ ์ฃผ์!
- urlPatterns
ํํฐ๊ฐ ์ธ์ ์คํ๋๋๊ฐ?
SpringSecurityFilter๊ฐ ๋จผ์ ์คํ๋ ๊น์? ์๋๋ฉด ์ฐ๋ฆฌ๊ฐ ์์ฑํด์ค MyFilter๊ฐ ๋จผ์ ์คํ๋ ๊น์?
ํ ์คํธ ํ๊ฒฝ
- MyFilter1 ๊ณผ MyFilter2๋ฅผ ์์ฑ
- MyFilter1์ FilterConfig์ ๋ฑ๋ก! (์ ์ฝ๋์ ๋์ผ : ์ฐ์ ์์ 0์ผ๋ก ์ค์ )
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean<MyFilter1> filter1() {
...
bean.setOrder(0); // ๋ฎ์ ์ซ์์ผ์๋ก ์ฐ์ ์์
..
- MyFilter2๋ SecurityConfig์ ๋ฑ๋ก! (Username..Filter ์ด์ ์ ์คํ๋๋๋ก ์ค์ )
http.addFilterBefore(new MyFilter2(), UsernamePasswordAuthenticationFilter.class)
์คํ ๊ฒฐ๊ณผ
Filter2๊ฐ Filter1 ๋ณด๋ค ๋จผ์ ์คํ๋์๋ค.
์ฐ๋ฆฌ๊ฐ ์์ฑํ ํํฐ๋ณด๋ค SpringSecurityFilter๊ฐ ๊ฐ์ฅ ๋จผ์ ์คํ๋๋ค.
SpringSecurityFilter๋ณด๋ค(๋๋ ํน์ ํํฐ ์ด์ ์ ๋๋ ์ดํ์) ๋จผ์ ์คํ๋๊ฒ ํ๋ ค๋ฉด?
SpringSecurity ์ค์ ์์ ํํฐ๋ฅผ ๋ฑ๋กํด์ค๋ค.
addFilterBefore(Filter filter, Class<? extends Filter> beforeFilter)
addFilterAfter(Filter filter, Class<? extends Filter> afterFilter)