๐ฌ ๋ฐฐ๊ฒฝ
ํ์ฌ ํ๋ก์ ํธ์์ ํน์ ์์ฒญ์ ํํฐ์์ ์ ์ธํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์์๋ค. ํ์๋ ์คํ๋ง ์ํ๋ฆฌํฐ WebSecurity ignoring() ๋ฉ์๋์ ํน์ ํจํด์ด ๋ณด์(ํํฐ๋ง)์ ๊ฑธ๋ฆฌ์ง ์๋๋ก ์ถ๊ฐํ๋ค. ํ์ง๋ง ์ด์ ์ ๋ฑ๋กํ ํํฐ์ ๊ณ์ํด์ ๊ฑธ๋ฆฌ๊ฒ ๋์๊ณ , ๊ด๋ จ ์์ธ์ ํ์ ํ๊ณ ํด๋น ์ผ์ด์ค๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ ์ง ๊ณ ๋ฏผํ ๋ด์ฉ์ ๋ํด์ ์์ฑํด ๋ณธ๋ค.
WebSecurity ignoring() ๊ธฐ๋ฅ์ด๋?
์คํ๋ง ์ํ๋ฆฌํฐ์์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ ๋ณด์์ ์์(ํํฐ, ํจํด, ๊ถํ ๋ฑ)๋ฅผ ๋ฌด์ํ ์ ์๋๋ก WebSecurity์ ignoring() ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
ํด๋น ๊ธฐ๋ฅ์ ๋ฑ๋ก๋ ํจํด๋ค์ ๋ณด์์ ์์๋ฅผ ๊ฑฐ์น์ง ์๊ณ ๋ฐ๋ก ํต๊ณผํ๋ค. ๋ฐ๋ผ์ ์ธ์ฆ/์ธ๊ฐ๊ฐ ํ์ํ์ง ์์ ์ ์ ๋ฆฌ์์ค์ ๋ํ ์์ฒญ์ ํด๋น ๊ธฐ๋ฅ ํ์ฉํ๋ค. (๋์ ๋ฆฌ์์ค ์์ฒญ์ ์คํ๋ง ์ํ๋ฆฌํฐ์์ permitAll()์ ๊ถ์ฅํ๋ค.)
- SecurityConfig
@Configuration
@RequiredArgsConstructor
public class SecurityConfig{
private final ShibaHolicFilter shibaHolicFilter;
@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
return (web) -> web.ignoring().antMatchers("/shibaHolic");
}
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.addFilterBefore(shibaHolicFilter, UsernamePasswordAuthenticationFilter.class)
.authorizeRequests()
.anyRequest()
.authenticated();
return http.build();
}
}
- Controller
@RestController
public class ShibaHolicController {
@GetMapping("/shibaHolic")
public String getShibaHolic() {
return "ํ์๋ฐ";
}
}
- Filter
@Component
public class ShibaHolicFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
System.out.println("ํํฐ ๊ฑธ๋ฆผ");
filterChain.doFilter(request, response);
}
}
SecurityConfig์ ShibaHolicFilter๋ฅผ ๋ฑ๋กํ๊ณ , ๋ค๋ฅธ ์์ฒญ์ ๋ํด์๋ ๋ฐ๋์ ์ธ์ฆํ๋๋ก ์ค์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ WebSecurity ignoring() ํจํด์๋ /shibaHolic์ ๋ฑ๋กํ๋ค.
์ด๋ ๊ฒ ์ค์ ํ๊ณ GET ๋ฉ์๋๋ก /shibaHolic์ ํธ์ถํ๋ฉด,
์ธ์ฆ ์์ด ํต๊ณผ๋๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ง๋ง, ์ด๋ฏธ์ง์ ๊ฐ์ด ShibaHolic ํํฐ๋ฅผ ๊ฑฐ์ณ์ ๋์ด๊ฐ๊ฒ ๋๋ค๋ ๊ฑธ ํ์ธํ ์ ์๋ค.
๐ ์์ธ
์คํ๋ง ์ํ๋ฆฌํฐ ํํฐ์๋ ๊ฑธ๋ฆฌ์ง ์์์ง๋ง, ๋ฌธ์ ๋ ServletFilter์์ ๊ฑธ๋ฆฐ๋ค๋ ๊ฒ์ด๋ค.
์คํ๋ง ๊ณต์๋ฌธ์์๋ "Bean์ผ๋ก ๋ฑ๋ก๋ ํํฐ๋ ์๋์ผ๋ก ServletFilterChain์ ๋ฑ๋ก๋๋ค"๋ผ๊ณ ํ๋ค.
๋ฐ๋ผ์ Filter๋ฅผ Bean์ผ๋ก ๋ฑ๋กํ๋ฉด์ ์๋์ผ๋ก ServletFilterChain์ ํํฐ๊ฐ ๋ฑ๋ก๋๊ณ ,
SecurityFilterChain์๋ addFilterBefore() ๋ฉ์๋๋ก ์ธํด ํํฐ๊ฐ ๋ ๋ฑ๋ก๋๋ฉด์ ์ด 2๋ฒ ๋ฑ๋ก๋๋ค.
ApplicationFilterChain์ ๋๋ฒ๊น ํ๋ฉด ์ด๋ฏธ์ง์ 3, 4์ ๊ฐ์ด, SecurityFilterChain๊ณผ ShibaHolicFilter ๋ ๋ค ๋ฑ๋ก๋์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๐ ํด๊ฒฐ
ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ด ์์ผ๋ฏ๋ก, ์ํฉ์ ๋ฐ๋ผ ๋ง๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
1. ํํฐ๋ฅผ Bean์ผ๋ก ๋ฑ๋กํ์ง ์๋๋ค.
๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ด๋ค. ํํฐ๋ฅผ Bean์ผ๋ก ๋ฑ๋กํ์ง ์๊ณ Security ์ค์ ์ ์์ฑ์๋ก ๋ฑ๋กํ๋ค๋ฉด, ํํฐ๊ฐ 2๊ฐ ๋ฑ๋ก๋๋ ์ผ์ ํผํ ์ ์๋ค. ํ์๋ ๊ฐ์ธ์ ์ผ๋ก ์์กด์ฑ ์ฃผ์ ์ด ํ์ ์๋ ๋จ์ํ ํํฐ๋ผ๋ฉด ํด๋น ๋ฐฉ๋ฒ์ ์ถ์ฒํ๋ค.
- SecurityConfig
@Configuration
@RequiredArgsConstructor
public class SecurityConfig {
@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
return (web) -> web.ignoring().antMatchers("/shibaHolic");
}
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.addFilterBefore(new ShibaHolicFilter(), UsernamePasswordAuthenticationFilter.class)
.authorizeRequests()
.anyRequest()
.authenticated();
return http.build();
}
}
- Filter
public class ShibaHolicFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
System.out.println("ํํฐ ๊ฑธ๋ฆผ");
filterChain.doFilter(request, response);
}
}
ShibaHolicFilter๋ฅผ ์์กด์ฑ ์ฃผ์ ๋ฐ์ง ์๊ณ , ์ธ์คํด์คํํด์ ๋ฑ๋กํ๋ค.
์ด๋ฌ๋ฉด Bean์ผ๋ก ๋ฑ๋ก๋์ง ์๊ธฐ ๋๋ฌธ์, Servlet Filter์ ์ถ๊ฐ๋ ์ผ์ด ์๋ค.
๋๋ฒ๊น ์ ํตํด ํ์ธํด ๋ณด๋ฉด ๋ ์ด์ ShibaHolicFilter๊ฐ ๋ฑ๋ก๋์ง ์๋๋ค๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค.
2. ํํฐ๋ฅผ Servlet Filter๋ก ๋ฑ๋ก๋์ง ์๋๋ก ํ๋ค.
์คํ๋ง์ด Bean์ผ๋ก ๋ฑ๋ก๋ ํํฐ๋ฅผ ์๋์ผ๋ก ๋ฑ๋กํ๋ ์ค์ ์ ๋๋ฉด, ํํฐ๋ฅผ Bean์ผ๋ก ๋ฑ๋กํด๋ ๋์ด์ Servlet Filter๋ก ๋ฑ๋ก๋์ง ์๋๋ค.
@Configuration
public class WebConfig {
@Bean
public FilterRegistrationBean<ShibaHolicFilter> registration(ShibaHolicFilter filter) {
FilterRegistrationBean<ShibaHolicFilter> registration = new FilterRegistrationBean<>(filter);
registration.setEnabled(false);
return registration;
}
}
FilterRegistrationBean setEnabled ์ต์ ์ ๋๋ฉด, ๋์ด์ Servlet Filter์ ํด๋น ํํฐ๊ฐ ์ถ๊ฐ๋์ง ์๋๋ค.
3. shouldNotFilter()๋ฅผ ํ์ฉํ์ฌ ํน์ ํจํด์์๋ง ํด๋น ํํฐ๊ฐ ์ ์ฉ๋๋๋ก ์ค์ ํ๋ค.
OncePerRequestFilter๋ shouldNotFilter()๋ฅผ ์ค๋ฒ๋ผ์ด๋ ํ์ฌ ํน์ ํจํด์๋ง ํํฐ๋ฅผ ์ ์ฉ์ํค๊ฑฐ๋ ์ ์ธ์ํฌ ์ ์๋๋ก ํ๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค. ํน์ ํจํด์ ๊ฒฝ์ฐ๋ง ํด๋น ํํฐ๋ฅผ ๊ฑฐ์น๊ฒ ํ๋ค๋ฉด, ํํฐ ๋ฑ๋ก ์ฌ๋ถ์ ์๊ด์์ด ๋ฌด์ํ ์ ์๋ค.
@Component
public class ShibaHolicFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
System.out.println("ํํฐ ๊ฑธ๋ฆผ");
filterChain.doFilter(request, response);
}
@Override
protected boolean shouldNotFilter(HttpServletRequest request) throws ServletException {
return !request.getServletPath().equals("/blackshiba") || !request.getMethod().equals("GET");
}
}
GET ๋ฉ์๋์ /blackshiba์ผ๋ก ์ค๋ ๊ฒฝ์ฐ๋ง ํด๋น ํํฐ๋ฅผ ์ ์ฉํ๋๋ก ํ๋ฉด์, /shibaHolic์ธ ๊ฒฝ์ฐ ํด๋น ํํฐ๋ฅผ ๊ฑฐ์น์ง ์๋๋ก ํ์๋ค.
'Spring > Security' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋น๋๊ธฐ ํ๊ฒฝ์์ Spring Security ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ์ ์ง์ํค๋ ๋ฐฉ๋ฒ (0) | 2024.09.02 |
---|---|
OAuth 2.0 Grant Type (0) | 2023.07.02 |
๋๊ธ