Spring Security๋?
Spring ๊ธฐ๋ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์(์ธ์ฆ๊ณผ ๊ถํ, ์ธ๊ฐ ๋ฑ)์ ๋ด๋นํ๋ ์คํ๋ง ํ์ ํ๋ ์์ํฌ์ด๋ค.
- ์ฃผ๋ก ์๋ธ๋ฆฟ ํํฐ์ ์ด๋ค๋ก ๊ตฌ์ฑ๋ ํํฐ ์ฒด์ธ์ผ๋ก ๋์ด์๋ค.
- ์ฌ์ฉ์์ ์์ฒญ์ ๊ฐ๋ก์ฑ๊ณ Spring Security ํ๋ก์ธ์ค์ ๋ณด์ ์ฒ๋ฆฌ๋ฅผ ์์ํ๋ ์ผ๋ จ์ ๊ณผ์ ์ ์๋ฏธํ๋ค.
- ์ธ์ฆ ์ ์ฐจ๋ฅผ ๊ฑฐ์น ํ ์ธ๊ฐ ์ ์ฐจ๋ฅผ ์งํํ๋ฉฐ ์์ด๋(Principal), ๋น๋ฐ๋ฒํธ(Credential)๋ฅผ ์ฌ์ฉํ๋ Credential ๊ธฐ๋ฐ์ ์ธ์ฆ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ์ฆ ์ ๋ณด๋ ์ธ๋ฉ๋ชจ๋ฆฌ ์ธ์ ์ ์ฅ์์ธ SecurityContextHolder์ ์ธ์ -์ฟ ํค ๋ฐฉ์์ผ๋ก ์ ์ฅ๋๋ค.
- Security 3.2 ๋ฒ์ ๋ถํฐ๋ xml๋ก ์ค์ ํ์ง ์๊ณ ์๋ฐ bean์ผ๋ก ๊ฐ๋จํ๊ฒ ์ค์ ํ ์ ์๋๋ก ์ง์ํ๋ค.
๐ ์ธ์ฆ(Authentication)
์ฌ์ฉ์๊ฐ ๋ณธ์ธ์ด ๋ง๋์ง ํ์ธํ๋ ์ ์ฐจ
๐ ์ธ๊ฐ(Authorization)
์ธ์ฆ๋ ์ฌ์ฉ์๊ฐ ์์ฒญํ ์์์ ์ ๊ทผ ๊ฐ๋ฅํ์ง ํ์ธํ๋ ์ ์ฐจ
๐ ์ ๊ทผ ์ฃผ์ฒด(Principal)
๋ณดํธ ๋ฐ๋ ๋ฆฌ์์ค์ ์ ๊ทผํ๋ ๋์
Spring Security ๋์ ๊ณผ์
๐ ์ธ์ -์ฟ ํค ์ธ์ฆ ๊ณผ์
โ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ ์๋ํ๋ฉด http request ์์ฒญ์ด ๋ค์ด์จ๋ค.
โก AuthenticationFilter๋ฅผ ํตํด ์ฌ์ฉ์ ์ ๋ณด๊ฐ ์ ์ฅ๋ DB์์ ์ ๋ณด๋ฅผ ์กฐํํ๋ค.
โข DB์ ์ ๋ณด๊ฐ ์๋ ์ฌ์ฉ์๋ UserDetails๋ก ์ธ์ ์ ์์ฑํ๋ค.
โฃ Spring Security ์ธ๋ฉ๋ชจ๋ฆฌ ์ธ์ ์ ์ฅ์์ธ SecurityContextHolder์ ์ ์ฅํ๋ค.
โค ์ฌ์ฉ์์๊ฒ ์ธ์ ID์ ํจ๊ป ์๋ต์ ํ๋ค.
โฅ ์ดํ ์์ฒญ์์๋ ์ฟ ํค์์ ์ธ์ ID๋ฅผ ๊ฒ์ฆํ๊ณ ์ ํจํ ๊ฒฝ์ฐ ์ธ์ฆ๋๋ค.
Spring Security Filter ์ข ๋ฅ
HeaderWriterFilter | ์๋ต ํค๋์ ์ํ๋ฆฌํฐ ๊ด๋ จ ํค๋๋ฅผ ์ถ๊ฐํด์ฃผ๋ ์ญํ |
CorsFilter | Cross-Domain ์์ฒญ์ธ์ง๋ฅผ ํ์ธํ๊ณ ์ค์ ์์ฒญ ํ์ด์ง์ ์ ๋ฌํ๊ธฐ ์ ์ ์ ์ ํ CORS ์ ์ฑ ๊ณผ ํค๋๋ฅผ ์ ์ฉ |
CsrfFilter | CSRF ๊ณต๊ฒฉ์ ๋ฐฉ์ดํ๋ ์ญํ , CSRF Token์ ํ์ฉํ์ฌ ๋ฐฉ์ด |
LogoutFilter | ๋ก๊ทธ์์ ์์ฒญ์ด ๋ค์ด์์ ๋ LogoutHandler๊ฐ ๋ก๊ทธ์์ ์ํ |
UsernamePasswordAuthenticationFilter | ์ฌ์ฉ์ ์ธ์ฆ์ ์ฒ๋ฆฌ, ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ username๊ณผ password๋ก UsernamePasswordAuthenticationToken์ ๋ง๋ค๊ณ AuthenticationManager๋ฅผ ํตํด ์ธ์ฆ ์ฒ๋ฆฌ |
ConcurrentSessionFilter | ๋งค ์์ฒญ๋ง๋ค ํ์ฌ ์ฌ์ฉ์์ ์ธ์ ๋ง๋ฃ ์ฌ๋ถ๋ฅผ ํ์ธ |
BearerTokenAuthenticationFilter | BearerToken์ ๋ํด์ ์ธ์ฆ์ ์ฒ๋ฆฌํด์ฃผ๋ ์ญํ ๋ด๋น, JWT๋ก ์ธ์ฆ๋ ์์ฒญ์ ์ ํจ์ฑ์ ๊ฒ์ฌ |
BasicAuthenticationFilter | Http Basic ์ธ์ฆ์ ์ฒ๋ฆฌ, Authorization ํด๋์ Basic ํ ํฐ์ ์ธ์ฆํด์ฃผ๋ ์ญํ |
RequestCacheAwareFilter | request ๋ด์ฉ์ cache์ ์ ์ฅํด๋๊ณ ๋ค์ request๊ฐ ์ค๋ฉด ์ด์ ์ cache ๊ฐ์ ์ ๋ฌ |
RememberMeAuthenticationFilter | ์ธ์ ์ด ๋ง๋ฃ๋๊ฑฐ๋ ์ข ๋ฃ๋ ํ์๋ ์๋ฒ์์ ํด๋ผ์ด์ธํธ์ ์ธ์ฆ ์ ๋ฌด๋ฅผ ๊ธฐ์ตํ๋ ์ญํ , ์ฟ ํค๋ฅผ ๊ฒ์ฌํด ์ธ์ฆ ์ฒ๋ฆฌ |
SessionManagementFilter | ์ธ์ ๋ณ์กฐ ๋ฐฉ์ง ์ ๋ต ์ค์ , ์ ํจํ์ง ์์ ์ธ์ Redirect URL ์ค์ , ๋์์ฑ ์ ์ด ๋ฑ ์ธ์ ์ ์ฑ ์ ๋ง๊ฒ ์ฌ์ฉํ๊ณ ์๋์ง ๊ฒ์ฌ |
ExcpetionTranslationFilter | ํด๋น ํํฐ ์ดํ ์ธ์ฆ์ด๋ ๊ถํ ์์ธ ๋ฐ์ ์ ์ฒ๋ฆฌ, ExceptionTranslationFilter๊ฐ SecurityInterceptor ์ด์ ์ ์กด์ฌํด์ผ ํจ |
์คํ๋ง ์ํ๋ฆฌํฐ์์ ํํฐ ํธ์ถ ์์ ๋๋ฒ๊น ์ด ํ์ํ ๋๋ ๋๋ฒ๊ทธ ๋ชจ๋๋ฅผ ํ์ฑํํ์ฌ ๋ก๊ทธ๋ฅผ ํ์ธํ ์ ์๋ค.
๐ ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ; @EnableWebSecurity
WebSecurityConfigureAdapter๋ฅผ ์์๋ฐ์ Filter Chain์ ๋ง๋๋ ํด๋์ค์ @EnableWebSecurity(debug=true) ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ์ฃผ๋ฉด ์์ฒญ URL, ์ธ์ ID, ์์ฒญ ๋ธ๋ผ์ฐ์ ๋ฑ์ ์ ๋ณด์ ํ์ฌ ์คํ๋๋ Security Filter๋ค์ ํ์ธํ ์ ์๋ค.
โ ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ; ์ค์ ํ์ผ ๋ด spring.security.debug๋ฅผ true๋ก ์ค์
@Value ์ด๋ ธํ ์ด์ ์ ์ด์ฉํด ์ค์ ๊ฐ์ ๋์ ์ผ๋ก ๊ฐ์ ธ์จ๋ค. :false๋ฅผ ํด์ฃผ๋ฉด ์ค์ ์ด ์์ ๊ฒฝ์ฐ false๊ฐ ๊ธฐ๋ณธ ๊ฐ์ผ๋ก ์ง์ ๋๋ค. ์ดํ๋ฆฌ์ผ์ด์ ์ค์ ํ์ผ์ ์ด์ฉํ๋ฉด ํ๊ฒฝ ๋ณ๋ก ์ค์ ๊ฐ์ ๋ค๋ฅด๊ฒ ์ ์ฉํ ์ ์๋ค.
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Value("${spring.security.debug:false}")
boolean securityDebug;
@Override
public void configure(WebSecurity web) throws Exception {
web.debug(securityDebug);
}
}
Spring Security ๊ตฌํ
์คํ๋ง ์ํ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฒ๊ฐ ๊ธฐ๋๋ ๋ ์ํ๋ฆฌํฐ ์ด๊ธฐํ ์์ ๋ฐ ๊ธฐ๋ณธ์ ์ธ ๋ณด์ ์ค์ ์ด ์ด๋ฃจ์ด์ง๋ค.
- ๊ธฐ๋ณธ์ ์ธ ๋ก๊ทธ์ธ ํ์ด์ง๋ฅผ ์ ๊ณต, ์์ฒญ์ ๋ํ ์ธ์ฆ์ ์๊ตฌ
- ์ธ์ฆ ๋ฐฉ์์ Form ๋ก๊ทธ์ธ ๋ฐฉ์๊ณผ httpBasic ๋ก๊ทธ์ธ ๋ฐฉ์ ์ ๊ณต
- Form ๋ก๊ทธ์ธ ๋ฐฉ์์ ์๋ฒ์ ํด๋น ์ฌ์ฉ์์ ์ธ์ ์ํ๊ฐ ์ ํจํ์ง๋ฅผ ํ๋จํ์ฌ ์ธ์ฆ ์ฒ๋ฆฌ
- Http Basic ๋ก๊ทธ์ธ ๋ฐฉ์์ ์๋ฒ๋ก๋ถํฐ ์์ฒญ๋ฐ์ ๋ฐฉ์๋๋ก ๊ตฌ์ฑํ ๋ค์ ํค๋์ ๊ธฐ์ ํ์ฌ ์๋ฒ๋ก ๋ณด๋ด๋ ๋ฐฉ์์ผ๋ก ์ธ์ฆ ์ฒ๋ฆฌ
โ Maven or Gradle
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
compile("org.springframework.boot:spring-boot-starter-security")
โ WebSecurityConfigurerAdapter
- ์คํ๋ง ์ํ๋ฆฌํฐ์ ์น ๋ณด์ ๊ธฐ๋ฅ์ ์ด๊ธฐํํ๊ณ ์ค์ ํด์ฃผ๋ ์ถ์ ํด๋์ค
- ํด๋น ํด๋์ค๋ฅผ ์์ ๋ฐ์ config ํด๋์ค๋ฅผ ๊ตฌํ
- @EnableWebSecurity ์ด๋ ธํ ์ด์ ์ ์ ์ธํ๋ฉด ์น ๋ณด์์ ํ์ฑ์์ผ Spring Security Filter๊ฐ ์๋์ผ๋ก ํฌํจ
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
// ์คํ๋ง ์ํ๋ฆฌํฐ์์ ์ฌ์ฉ์๋ฅผ ์ธ์ฆํ๋ ๋ฐฉ๋ฒ
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// AuthenticationProvider ๊ตฌํ์ฒด
auth.authenticationProvider(authenticationProvider);
// auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder);
}
// ์คํ๋ง ์ํ๋ฆฌํฐ ๊ท์น์ ๋ฌด์ํ๋ url ์ง์
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring()
.antMatchers("/resources/**")
.antMatchers("/css/**")
.antMatchers("/vendor/**")
.antMatchers("/js/**")
.antMatchers("/favicon*/**")
.antMatchers("/img/**");
}
// ์คํ๋ง ์ํ๋ฆฌํฐ ๊ท์น
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests() // ๋ณดํธ๋ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋ ๊ถํ ์ค์
.antMatchers("/login*/**").permitAll() // ์ ์ฒด ์ ๊ทผ ํ์ฉ
.antMatchers("/logout/**").permitAll()
.antMatchers("/info").hasRole("ADMIN")// ADMIN ๋กค์ ๊ฐ์ง ์ฌ์ฉ์๋ง ์ ๊ทผ ํ์ฉ
.anyRequest().authenticated()
.and().logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler())
.and().csrf().disable() // csrf ๋ณด์ ์ค์ ์ ๋นํ์ฑํ
.exceptionHandling()
.accessDeniedHandler(accessDeniedHandler())
.authenticationEntryPoint(authenticationEntryPoint());
}
}
์ฐธ๊ณ ์๋ฃ ๋ฐ ์ถ์ฒ ๐โ๏ธ
https://sjh836.tistory.com/165
https://velog.io/@seongwon97/Spring-Security-Filter%EB%9E%80
'๊ฐ๋ฐ > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring Boot ํ๋ก์ ํธ git ์ฐ๋ (0) | 2022.03.09 |
---|---|
Spring Boot์ MySQL / Mybatis ์ฐ๊ฒฐํ๊ธฐ (0) | 2022.03.09 |
Spring Boot ํ๋ก์ ํธ ์์ฑํ๊ธฐ (0) | 2022.03.08 |
JPA, Hibernate (0) | 2022.03.08 |
WAS ๋์๊ณผ์ / ์๋ธ๋ฆฟ(Servlet) / Servlet ๊ตฌํ / ์๋ธ๋ฆฟ ์ปจํ ์ด๋ (0) | 2022.01.24 |
๋๊ธ