๐ํ๋ก๊ทธ๋๋จธ์ค ๋ฐฑ์๋ ๋ฐ๋ธ์ฝ์ค 4๊ธฐ ๊ต์ก๊ณผ์ ์ ๋ฃ๊ณ ์ ๋ฆฌํ ๊ธ์
๋๋ค.๐
Spring Security ์์
์์กด์ฑ ์ถ๊ฐ
- spring-boot-starter-security: spring security ๋ชจ๋ ์ฌ์ฉ
- spring-security-test: spring security ํ
์คํธ ๋ชจ๋ ์ฌ์ฉ
@Configuration
public class WebSecurityConfigure {
@Bean
public InMemoryUserDetailsManager userDetailsManager() {
UserDetails admin = makeUserDetails("admin", "1234", "ADMIN");
UserDetails user = makeUserDetails("user", "1234", "USER");
return new InMemoryUserDetailsManager(user, admin);
}
private UserDetails makeUserDetails(String name, String password, String role) {
return User.withUsername(name)
.password(String.format("{noop}%s", password))
.roles(role)
.build();
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
return http
.authorizeHttpRequests(auth -> auth
.requestMatchers(new AntPathRequestMatcher("/me")).hasAnyRole("USER", "ADMIN")
.requestMatchers(new AntPathRequestMatcher("/admin")).hasRole("ADMIN")
.requestMatchers(new AntPathRequestMatcher("/admin")).fullyAuthenticated()
.anyRequest().permitAll())
.formLogin(auth -> auth
.defaultSuccessUrl("/")
.usernameParameter("my-username")
.passwordParameter("my-password")
.permitAll())
.logout(auth -> auth
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.logoutSuccessUrl("/")
.invalidateHttpSession(true)
.clearAuthentication(true))
.rememberMe(auth -> auth
.key("my-remember-me")
.rememberMeParameter("remember-me")
.tokenValiditySeconds(300))
.build();
}
}
- Spring Security๋ฅผ ์ฌ์ฉํ์ฌ ์น ๋ณด์์ ๊ตฌ์ฑํ๋ ์คํ๋ง ์ค์ ํด๋์ค
- userDetailsManager() ๋ฉ์๋๋ ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ ์ฌ์ฉ์ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ธ์ฆ๊ณผ ๊ถํ์ ๋ถ์ฌํจ
- ์ค์ ์๋น์ค์์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฅ์์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋๋ก ๊ตฌ์ฑํด์ผํจ
- InMemoryUserDetailsManager ๊ฐ์ฒด๋ UserDetailsPasswordService ์ธํฐํ์ด์ค ๊ตฌํ์ฒด
- ์ต์ด ๋ก๊ทธ์ธ 1ํ ์ฑ๊ณต์, {noop} ํ์
์์ {bcrypt} ํ์
์ผ๋ก PasswordEncoder๊ฐ ๋ณ๊ฒฝ๋๊ณ , ๋น๋ฐ๋ฒํธ๊ฐ ์ํธํ๋จ
- {noop}์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ํธํํ์ง ์๊ณ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค๋ ์๋ฏธ์ด๋ฉฐ, ์ด๋ฌํ prefix ๋ถ๋ถ์ ์ค์ ํด์ผํจ
- filterChain() ๋ฉ์๋๋ Spring Security์ ํํฐ ์ฒด์ธ์ ๊ตฌ์ฑํ๋ ๋ฐ ์ฌ์ฉ
- HttpSecurity ๊ฐ์ฒด๋ ์น ๋ณด์์ ๋ํ ์ค์ ์ ๊ตฌ์ฑํ ์ ์๋๋ก ๋์์ฃผ๋ ์ธํฐํ์ด์ค
- http.authorizeHttpRequests()๋ ์์ฒญ์ ๋ํ ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ๋ฅผ ๊ตฌ์ฑ
- http.formLogin()๋ ๋ก๊ทธ์ธ ํ์ด์ง๋ฅผ ์ ๊ณต
- http.logout()๋ ๋ก๊ทธ์์ ๊ธฐ๋ฅ์ ์ ๊ณต
- http.rememberMe()๋ ์๋ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ์ ๊ณต
DelegatingPasswordEncoder
{bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG
{noop}password
{pbkdf2}5d923b44a6d129f3ddf3e3c8d29412723dcbde72445e8ef6bf3b508fbf17fa4ed4d6b99ca763d8dc
{sha256}97cde38028ad898ebc02e690819fa220e88c62e0699403e94fff291cfffaf8410849f27605abcbc0
- DelegatingPasswordEncoder ํด๋์ค๋ ํจ์ค์๋ ํด์ ์๊ณ ๋ฆฌ์ฆ๋ณ๋ก PasswordEncoder๋ฅผ ์ ๊ณต
- ํด์ ์๊ณ ๋ฆฌ์ฆ๋ณ PasswordEncoder ์ ํ์ ์ํด ํจ์ค์๋ ์์ prefix({noop})๋ฅผ ์ถ๊ฐํจ
- Spring Security์์๋ DelegatingPasswordEncoder ํด๋์ค๊ฐ ๊ธฐ๋ณธ PasswordEncoder๋ก ์ฌ์ฉ๋จ
- prfiex ๋ถ๋ถ์ด ์๋ต๋๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ PasswordEncoder๋ก bcrypt๊ฐ ์ฌ์ฉ๋จ
- DelegatingPasswordEncoder ๋์ ๋ค๋ฅธ ์ธ์ฝ๋(BCryptPasswordEncoder)๊ฐ ํ์ํ๋ค๋ฉด, ํด๋น ํด๋์ค๋ฅผ ๋ช
์์ ์ผ๋ก Bean ์ ์ธํ๋ฉด๋จ
๊ฐ์ฌํฉ๋๋ค. ์ด๋ฐ ์ ๋ณด๋ฅผ ๋๋ ์ฃผ์ ์ ์ข์์.