๐ง SecurityBuilder & SecurityConfigurer
SecurityBuilder๋ ์น ๋ณด์์ ๊ตฌ์ฑํ๋ ๋น ๊ฐ์ฒด์, ์ค์ ํด๋์ค๋ค์ ์์ฑํ๋ ์ญํ ์ ์ํํ๋ฉฐ, ๊ทธ ์ข ๋ฅ๋ก๋ WebSecurity, HttpSecurity๊ฐ ์์ต๋๋ค.
SecurityConfigurer์ Http ์์ฒญ๊ณผ ๊ด๋ จ๋ ๋ณด์์ฒ๋ฆฌ๋ฅผ ๋ด๋นํ๋ ํํฐ๋ค์ ์์ฑํ๊ณ , ์ฌ๋ฌ ์ด๊ธฐํ ์์ ์ ๊ด์ฌํฉ๋๋ค.
SecurityBuilder๋ ์๋์ ๊ฐ์ด SecurityConfigurer๋ฅผ ํฌํจํ๊ณ ์์ผ๋ฉฐ,
์ธ์ฆ ๋ฐ ์ธ๊ฐ ์ด๊ธฐํ ์์ ์ SecurityBuilder ๋ด๋ถ์์ SecurityConfigurer๋ฅผ ํตํด ์งํ๋ฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ์ด๊ธฐํ ์์ ์ SecurityBuilder์ build() ๋ด๋ถ์์ ์คํ๋๋ฉฐ,
์๋์ ๊ฐ์ด init()๊ณผ configure()์ ์คํํ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
init()์ ๋ด๋ถ์์๋ SecurityConfigurer์ init()์ ํธ์ถํ๋ฉฐ,
configure()์ ๋ด๋ถ์์๋ SecurityConfigurer์ configure()์ ํธ์ถํ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
AbstractConfiguredSecurityBuilder์๋ ๋ค์๊ณผ ๊ฐ์ด apply() ๋ฉ์๋๊ฐ ์ ์๋์ด ์์ต๋๋ค.
apply()๋ฅผ ํตํด ์ฌ๋ฌ SecurityConfigurer ๋ฅผ ์ด๊ธฐํ ๋์์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ ์ถ๊ฐ๋ SecurityConfigurer๋ init()๊ณผ configurer()์์ ์ด๊ธฐํ ์์ (Filter ์์ฑ, Authentication Provider, Authenticaion Manager ๋ฑ ์์ฑ)์ด ์งํ๋ฉ๋๋ค.
์ต์ข ์ ์ผ๋ก WebSecurity์ build()๊ฐ ๋ฐํํ๋ ๊ฒ์ FilterChainProxy์ด๋ฉฐ,
HttpSecurity์ build()๊ฐ ๋ฐํํ๋ ๊ฒ์ SecurityFilterChain์ ๋๋ค.
๋ํ ๋ฐํ๋ FilterChainProxy๋ SecurityFilterChain์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ดํ ์ฌ์ฉ์ ์์ฒญ์ด ๋ค์ด์์ ๋, FilterChainProxy๋ SecurityFilterChain์ ๊ฐ์ง๊ณ ์ธ์ฆ์ ์ํํฉ๋๋ค.
(๋ฐ๋ก ์ค์ ํ์ง ์์ ๊ฒฝ์ฐ) ์ด๊ธฐํ ์์ ์คํ ์, ์ฐ์ WebSecurityConfiguration์ setFilterChainProxySecurityConfigurer()๊ฐ ํธ์ถ๋ฉ๋๋ค.
apply๋ฅผ ํตํด WebSecurity์ SecurityConfigurer๋ฅผ applyํด์ฃผ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
์ดํ HttpSecurityConfiguration์ httpSecurity()๊ฐ ํธ์ถ๋ฉ๋๋ค.
์ด๋ ์ ๋ฐ์ค ๋ถ๋ถ์ ์ฝ๋๋ค๋ก ์ฌ๋ฌ SecurityConfigurer๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
csrf๋ฅผ ์์๋ก ์ดํด๋ณด๋ฉด, ๋ค์๊ณผ ๊ฐ์ด Csrf ๊ด๋ จํ SecurityConfigurer์ธ CsrfConfigurer๋ฅผ Apply ํ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
์ ์ค์ ์ด ๋๋๋ฉด ์๋์ ๊ฐ์ด ์ฌ๋ฌ ์ค์ ๋ค์ด ์ถ๊ฐ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
httpSecurity()์์ return๋ HttpSecurity๋ ์๋์ ๊ฐ์ด SecurityFilterChainConfiguration ์์ build()๋์ด SecurityFilterChain์ด ๋ฉ๋๋ค.
์ด๋ ๊ฒ ๋ง๋ค์ด์ง SecurityFilterChain์ WebSecurityConfiguration์ setFilterChains()๋ก ์ฃผ์ ๋ฉ๋๋ค.
์ดํ WebSecurityConfiguration์ springSecurityFilterChain()์ด ํธ์ถ๋์์ ๋,
์์์ ์ค์ ๋ SecurityFilterChain์ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ๋ฐํํ๋ SecurityFilterChainBuilder๋ฅผ WebSecurity์ ์ถ๊ฐํฉ๋๋ค.
์์์ ์ถ๊ฐ๋ SecurityFilterChainBuilder๋ฅผ ํตํด SecurityFilterChain์ ์์ฑํ์ฌ FilterChainProxy์ ์์ฑํ ๋ ์ฃผ์ ํด์ค๋๋ค.
๐ง SecurityConfigurer๋ฅผ ์ง์ ๋ง๋ค์ด ํ์ธํด๋ณด๊ธฐ
์ด์ SecurityConfigurer์ ์ง์ ๋ง๋ค๋ฉด์ ์ ์ฉ๋๋ ๊ณผ์ ์ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด SecurityFilterChain์ ํ๋ ๋น์ผ๋ก ๋ฑ๋กํฉ๋๋ค.
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain3(HttpSecurity http) throws Exception {
http.authorizeHttpRequests().anyRequest().authenticated();
http.formLogin();
http.apply(new CustomSecurityConfigurer().setFlag(false));
return http.build();
}
}
public class CustomSecurityConfigurer extends AbstractHttpConfigurer<CustomSecurityConfigurer, HttpSecurity> {
private boolean isSecure;
@Override
public void init(HttpSecurity builder) throws Exception {
super.init(builder);
System.out.println("init method");
}
@Override
public void configure(HttpSecurity builder) throws Exception {
super.configure(builder);
System.out.println("configure method");
if (isSecure) {
System.out.println("Https is required");
}
else {
System.out.println("Http is optional");
}
}
public CustomSecurityConfigurer setFlag(boolean isSecure) {
this.isSecure = isSecure;
return this;
}
}
์ด์ ์คํ์์ผ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
๐ง ์คํ๋ง ๋ถํธ ์๋ ์ค์ ์ ์ํ ์ด๊ธฐํ ๊ณผ์
์คํ๋ง ๋ถํธ ์๋ ์ค์ ์ ์ํ ์ด๊ธฐํ ๊ณผ์ ์ ์์ธํ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฐ์ SpringWebMvcImportSelector๊ฐ ์คํ๋ฉ๋๋ค.
์ด๋ WebMvcSecurityConfiguration์ ๋ก๋ํ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
์ดํ SecurityFilterAutoConfiguration ์ค์ ํด๋์ค๊ฐ ์คํ๋ฉ๋๋ค.
ํด๋น ํด๋์ค๋ ์๋์ ๊ฐ์ด DelegatingFilterProxyRegistrationBean์ ์์ฑํ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
DelegatingFilterProxyRegistrationBean์ ์ญํ ์ DelegatingFilterProxy๋ฅผ ๋ฑ๋กํ๋ ๊ฒ์ ๋๋ค.
DelegatingFilterProxy๋ "springSecurityFilterChain" ์ด๋ฆ์ ๋น์ ๊ฒ์ํ์ฌ, ํด๋น ๋น์๊ฒ ์์ฒญ์ ์์ํ๋ ์ญํ ์ ์ํํฉ๋๋ค.
์ด๋ "springSecurityFilterChain"์ด๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง ๋น์ด ๋ฐ๋ก FilterChainProxy์ ๋๋ค.
์ดํ WebMvcSecurityConfiguration๊ฐ ์คํ๋๋๋ฐ, ๋ค์๊ณผ ๊ฐ์ด AuthenticationPrincipalArgumentResolver ๋ฑ์ ๋ฑ๋กํ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
AuthenticationPrincipalArgumentResolver๋ @AuthenticationPrincipal๋ก Principal ๊ฐ์ฒด๋ฅผ ๋ฐ์ธ๋ฉ ํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก HttpSecurityConfiguration ์์ HttpSecurity๋ฅผ ์์ฑํฉ๋๋ค.
์ด๋ Singleton์ผ๋ก ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ prototype์ผ๋ก ์์ฑํ๋ ๊ฒ์ ์ ์ ์๋๋ฐ, ๊ทธ ์ด์ ๋ HttpSecurity๋ ์ฌ๋ฌ๊ฐ๋ฅผ ๋ฑ๋กํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
HttpSecurity๋ ๊ณตํต ์ค์ ํด๋์ค(~~Configurer)์, ์ด๋ฅผ ํตํด ํํฐ๋ค์ ์์ฑํ๊ณ , ์ต์ข ์ ์ผ๋ก SecurityFilterChain์ ๋ฐํํฉ๋๋ค.
(๋ฐ๋ก ์ค์ ํ ๊ฒ ์์ด ์๋ ์ค์ ์ ๊ฒฝ์ฐ) ์ดํ SpringBootWebSecurityConfiguration์ด ์๋ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
์ดํ WebSecurityConfiguration์์ WebSecurity๋ฅผ ์์ฑํ์ฌ ๋ด๋ถ์์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์์ ๊ฐ์ด WebSecurity๋ build() ์ ์ต์ข ์ ์ผ๋ก FilterChainProxy๋ฅผ ๋ง๋ญ๋๋ค.
WebSecurity์๋ securityFilterChainBuilders๋ผ๋ ํ๋๊ฐ ์์ผ๋ฉฐ,
ํด๋น SecurityBuilder๋ SecurityFilterChain๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
๊ทธ ์ค ํ๋๊ฐ HttpSecurity(SecurityBuilder)์, ์๋ SecurityFilterChain์ ๋๋ค.
์ด๋ฅผ ๊ฐ์ง๊ณ ์ต์ข ์ ์ผ๋ก FilterChainProxy๋ฅผ ์์ฑํ๋ฉฐ, ๊ทธ ๋ด๋ถ์๋ SecurityBuilder๋ฅผ ํตํด ์์ฑํ SecurityFilterChians๋ฅผ ๊ฐ์ง๊ณ ์๊ฒ ๋ฉ๋๋ค.
์ ๊ณผ์ ์ ์์ฝํ๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
๐ง WebSecurity์ HttpSecurity์ ๊ด๊ณ
HttpSecurity๋ SecurityFilterChain์ ์์ฑํฉ๋๋ค.
์ด๋ฌํ SecurityFilterChain์ 1๊ฐ ์ด์์ผ๋ก ๋ง๋ค์ด๋ผ ์ ์์ผ๋ฉฐ,
๋ฐ๋ผ์ HttpSecurity ๋น์ ์ฑํดํค์ด ์๋ ํ๋กํ ํ์ ๋น์ผ๋ก ๋ง๋ ๊ฒ์ ๋๋ค.