์คํ๋ง ์ํ๋ฆฌํฐ์ ๋์ ์๋ฆฌ์ ๋ํด ๊ณต๋ถํ๊ณ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
์ ์ฒด ๋์๊ณผ์
ํํฐ๋?
- ์คํ๋ง ์ปจํ ์ด๋ ์ธ๋ถ์ ์กด์ฌํ์ฌ ์คํ๋ง๊ณผ ๋ฌด๊ดํ ์์์ ๋ํด ๋์ํฉ๋๋ค.
- ๋ณดํต web.xml์ ๋ฑ๋ก. ์ธ์ฝ๋ฉ ๋ณํ ์ฒ๋ฆฌ, XSS ๋ฐฉ์ด ๋ฑ์ ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
์ธ์ฆ๊ณผ ์ธ๊ฐ์ ์ฐจ์ด์
์ธ์ฆ : ํด๋น ์ฌ์ฉ์๊ฐ ๋ณธ์ธ์ด ๋ง๋์ง๋ฅผ ํ์ธํ๋ ์ ์ฐจ
์ธ๊ฐ : ์ธ์ฆ๋ ์ฌ์ฉ์๊ฐ ์์ฒญ๋ ์์์ ๋ํด ์ ๊ทผ์ด ๊ฐ๋ฅํ๊ฐ๋ฅผ ๊ฒฐ์ ํ๋ ์ ์น
Servlet Container์ Spring Container
DelegatingFilterProxy
- Servlet Container์ Spring์ Spring Container๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ํํฐ์ ๋๋ค.
- servlet container์ ์กด์ฌํ๋ ํํฐ์ ๋๋ค.
- ํํฐ(Filter)๋ ์คํ๋ง์์ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๊ฒ ํด์ค๋๋ค.
- ์์ฒญ์ด ์ค๋ฉด DelegatingFilterProxy๊ฐ spring container์ ๋ง๋ค์ด ๋ ํํฐ(์คํ๋ง ๋น)์๊ฒ ์์ฒญ์ ์์ํฉ๋๋ค.
๋ฑ์ฅ๋ฐฐ๊ฒฝ
์ด๊ธฐ์ ํํฐ(Filter)๋ servlet container์ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ Spring์์ ์ฌ์ฉ๋๋ ๊ธฐ์ ์ ์ฌ์ฉํ ์ ์์์ต๋๋ค.
ํํฐ๋ DI์ ๊ฐ์ ์คํ๋ง ๊ธฐ์ ์ด ํ์ํด์ง๋ฉด์ DelegatingFilterProxy๋ผ๋ ๋์์ ๋ง๋ จํ๊ฒ ๋์์ต๋๋ค.
Spring์์ DelegatingFilterProxy๋ฅผ ํ์ฉํด์ ํํฐ๋ฅผ ๋ฑ๋กํ๋ ๊ณผ์
@Component
public class MyFilter implements Filter {
@Override
public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws ServletException, IOException {
chain.doFilter(request, response);
}
@Override
public void init(final FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
์ถ์ฒ: https://mangkyu.tistory.com/221 [MangKyu's Diary:ํฐ์คํ ๋ฆฌ]
ํํฐ ์ปดํฌ๋ํธ ์์ฑํ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
public class MyWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
public void onStartup(ServletContext servletContext) throws ServletException {
super.onStartup(servletContext);
servletContext.addFilter("myFilter", DelegatingFilterProxy.class);
}
}
์ถ์ฒ: https://mangkyu.tistory.com/221 [MangKyu's Diary:ํฐ์คํ ๋ฆฌ]
์์ฑํ ํํฐ๋ฅผ DelegatingFilterProxy ์ ๋ฃ์ด์คฌ์ต๋๋ค.
์ด๋ ๊ฒ ํด์ ํํฐ๋ ์คํ๋ง ๊ธฐ์ ์ ์ฌ์ฉํ ์ ์๊ฒ ๋์์ต๋๋ค!
SpringBoot์์๋?
์คํ๋ง ๋ถํธ์์๋ DelegatingFilterProxy๊ฐ ํ์ ์์ต๋๋ค.
์คํ๋ง ๋ถํธ๋ ๋ด์ฅ ์น์๋ฒ๋ฅผ ์ง์ํ๋ฉฐ ํฐ์บฃ(servlet conatiner)๋ SpringBoot๊ฐ ์ ์ด๊ฐ ๊ฐ๋ฅํด์ก์ต๋๋ค.
์คํ๋ง ๋ถํธ๊ฐ ํํฐ๋ฅผ ๊ตฌํํ ๋น์ ์ฐพ์ผ๋ฉด ๋ฐ๋ก ํํฐ์ฒด์ธ์ ํํฐ๋ฅผ ๋ฑ๋กํด์ค๋๋ค.
FilterChainProxy
- springSecurityFilterChain ์ด๋ฆ์ผ๋ก ์์ฑ๋๋ ํํฐ ๋น ์ ๋๋ค.
- FilterChainProxy๋ ์ฒ๋ฆฌ๋ฅผ ์์ํ๊ธฐ ์ํ SecurityFilterChain์ ๋ค๊ณ ์์ต๋๋ค.
- ์ฌ๋ฌ๊ฐ์ SecurityFilterChain๋ค์ด ๋ด๊ธธ ์ ์์ต๋๋ค.
SecurityFilterChain
- ์คํ๋ง ์ํ๋ฆฌํฐ๋ ๋ค์ํ ๊ธฐ๋ฅ์ ๊ฐ์ง ํํฐ๋ค์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ๊ฒ ์ ๊ณต๋๋ ํํฐ๋ค์ Security Filter Chain์ด๋ผ๊ณ ํฉ๋๋ค.
์ฌ๋ฌ๊ฐ์ง์ Security Filter Chain - @EnableWebSecurity ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํด์ SecurityFilterChain์ ์คํ๋ง filter chain์ ๋ฑ๋กํ ์ ์์ต๋๋ค.
์คํ๋ง๋ถํธ์์ SecurityFilterChain ๋ฑ๋ก ์ฝ๋
@Configuration
@EnableWebSecurity // spring security ํํฐ๊ฐ ์คํ๋ง filter chain์ ๋ฑ๋ก์ด ๋จ.
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true) // secured ์ด๋
ธํ
์ด์
ํ์ฑํ, preAuthorize, postAuthorize ์ด๋
ธํ
์ด์
ํ์ฑํ
public class SecurityConfig {
@Autowired
private PrincipalOauth2UserService principalOauth2UserService;
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf().disable() // csrf ํ ํฐ disable
.authorizeRequests()
.antMatchers("/user/**").authenticated() // ์ธ์ฆ๋ง ๋๋ฉด ๋ค์ด๊ฐ ์ ์๋ ์ฃผ์!
.antMatchers("/manager/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_MANAGER')")
.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
.anyRequest().permitAll()
.and()
.formLogin()
.loginPage("/loginForm")
.loginProcessingUrl("/login") // /login ์ฃผ์๊ฐ ํธ์ถ์ด ๋๋ฉด ์ํ๋ฆฌํฐ๊ฐ ๋์์ฑ์ ๋์ ๋ก๊ทธ์ธ์ ์งํํด์ค. -> ์ปจํธ๋กค๋ฌ์ /login์ ๋ง๋ค์ด์ฃผ์ง ์์๋ ๋จ. UserDetailsService์ loadUserByUsername ํจ์๊ฐ ์คํ
.defaultSuccessUrl("/")
.and()
.oauth2Login()
.loginPage("/loginForm")
.userInfoEndpoint() // oauth2Login ์ฑ๊ณต ์ดํ์ ์ค์ ์ ์์ (principalOauth2UserService์์ ์ฒ๋ฆฌํ๊ฒ ๋ค)
.userService(principalOauth2UserService); // Tip. ์ฝ๋๋ฐ๊ธฐX, (์์ธ์คํ ํฐ + ์ฌ์ฉ์ํ๋กํ์ ๋ณด)๋ฅผ ํ ๋ฐฉ์ ๋ฐ์ ์ ์๋ค. OauthClient ๋ผ์ด๋ธ๋ฌ๋ฆฌ
return http.build();
}
์ ๋ฆฌ
- ํํฐ๋ servlet container์์ญ์ ์กด์ฌ
- DelegatingFilterProxy๋ก FilterChainProxy๋ฅผ ๊ฐ์ธ์ ํํฐ๋ฅผ ์คํ๋ง ์ปจํ ์ด๋์ ๋ฑ๋กํ๊ณ ์ฌ์ฉํ ์ ์๊ฒ ๋จ.
- FilterChainProxy๋ springSecurityFilterChain ์ด๋ฆ์ผ๋ก ์์ฑ๋๋ ํํฐ ๋น
- FilterChainProxy๋ SecurityFilterChain ์ฌ๋ฌ๊ฐ๋ฅผ ๊ฐ์ง ์ ์์
- ์คํ๋ง ๋ถํธ์์ @EnableWebSecurity ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํด์ SecurityFilterChain์ ์คํ๋ง filter chain์ ๋ฑ๋กํ ์ ์์.
'๐๋ฐฑ์๋ : BackEnd' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋์์ฑ ์ฒ๋ฆฌ (0) | 2024.04.08 |
---|---|
์น์์ผ (0) | 2024.02.22 |
REST API (1) | 2024.01.12 |
MyBatis (1) | 2024.01.06 |
Spring Web MVC (0) | 2024.01.02 |