728x90
๋ฐ์ํ
@Configuration
@RequiredArgsConstructor
public class WebSecurityConfig {
private final UserDetailService userService;
@Bean
public WebSecurityCustomizer configure() {
return (web) -> web.ignoring()
.requestMatchers(toH2Console())
.requestMatchers("/static/**");
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
return http
.authorizeRequests(auth -> auth
.requestMatchers("/login", "/signup", "/user").permitAll()
.anyRequest().authenticated()
)
.formLogin(formLogin -> formLogin
.loginPage("/login")
.defaultSuccessUrl("/articles")
)
.logout(logout -> logout
.logoutSuccessUrl("/login")
.invalidateHttpSession(true)
)
.csrf(AbstractHttpConfigurer::disable)
.build();
}
@Bean
public DaoAuthenticationProvider daoAuthenticationProvider() throws Exception {
DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
daoAuthenticationProvider.setUserDetailsService(userService);
daoAuthenticationProvider.setPasswordEncoder(bCryptPasswordEncoder());
return daoAuthenticationProvider;
}
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}
}
@Bean
public WebSecurityCustomizer configure() {
return (web) -> web.ignoring()
.requestMatchers(toH2Console())
.requestMatchers("/static/**");
}
- WebSecurityCustomizer configure()
์ด ๋ฉ์๋๋ ์น ๋ฆฌ์์ค์ ๋ํ ๋ณด์ ์ค์ ์ ์ ์ํฉ๋๋ค.
ํน์ ๊ฒฝ๋ก์ ๋ํด ๋ณด์ ํํฐ๋ฅผ ๊ฑฐ์น์ง ์๊ณ ๋ฌด์ํ๋๋ก ์ค์ ํ ์ ์์ต๋๋ค.- web.ignoring()
์ฌ๊ธฐ์๋ H2 ์ฝ์ ๊ฒฝ๋ก(toH2Console())์ ์ ์ ๋ฆฌ์์ค ๊ฒฝ๋ก(/static/**)์ ๋ํด ๋ณด์ ํํฐ๋ง์ ๋ฌด์ํ๋๋ก ์ค์ ํฉ๋๋ค. ์ฆ, H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฝ์๊ณผ ์ ์ ํ์ผ๋ค(์: CSS, JS, ์ด๋ฏธ์ง ๋ฑ)์ ์ ๊ทผํ ๋๋ ์ธ์ฆ ์์ด ์ ๊ทผํ ์ ์๋ค.
- web.ignoring()
- SecurityFilterChain filterChain(HttpSecurity http)
์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์ ํํฐ ์ฒด์ธ์ ์ค์ ๋ถ๋ถ
์์ฒญ์ ๋ํ ์ธ์ฆ, ๋ก๊ทธ์ธ ํ์ด์ง ์ค์ , ๋ก๊ทธ์์ ์ฒ๋ฆฌ ๋ฑ์ ์ ์ํ๋ค.
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
return http
.authorizeRequests(auth -> auth
.requestMatchers("/login", "/signup", "/user").permitAll()
.anyRequest().authenticated()
)
.formLogin(formLogin -> formLogin
.loginPage("/login")
.defaultSuccessUrl("/articles")
)
.logout(logout -> logout
.logoutSuccessUrl("/login")
.invalidateHttpSession(true)
)
.csrf(AbstractHttpConfigurer::disable)
.build();
}
- filterChain()
- authorizeRequests()
- ์์ฒญ์ ๋ํ ๊ถํ ๋ถ์ฌ ๊ท์น ์ ์
- requestMatchers("/login", "/signup", "/user").permitAll()
๋ก๊ทธ์ธ, ํ์๊ฐ์ , ์ฌ์ฉ์ ์ ๋ณด ํ์ด์ง์ ๋ํด์๋ ๋ชจ๋ ์ฌ์ฉ์๊ฐ ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ์ค์ ํฉ๋๋ค. - anyRequest()
ํ์ฌ๊น์ง ์ ์๋ ๋ชจ๋ ์์ฒญ ๊ท์น์ ์ ์ธํ ๋ชจ๋ ์์ฒญ์ ์ ํํ๋ ๋ฉ์๋ - authenticated()
์ฌ์ฉ์๊ฐ ์ธ์ฆ๋ ์ํ์ฌ์ผ ํด๋น ์์ฒญ์ ์ ๊ทผํ ์ ์๋๋ก ์๊ตฌํ๋ ์กฐ๊ฑด ์ค์ .
์ฆ, ์ฌ์ฉ์๋ ์ ํจํ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค.
- ์์ฒญ์ ๋ํ ๊ถํ ๋ถ์ฌ ๊ท์น ์ ์
- formLogin()
- ํผ ๊ธฐ๋ฐ ๋ก๊ทธ์ธ ์ค์
- loginPage("/login")
๋ก๊ทธ์ธ ํ์ด์ง๋ก /login ๊ฒฝ๋ก ์ง์ - defaultSuccessUrl("/articles")
๋ก๊ทธ์ธ ์ฑ๊ณต ํ ์ฌ์ฉ์๊ฐ ์ด๋ํ ๊ธฐ๋ณธ ๊ฒฝ๋ก๋ฅผ ์ค์
- ํผ ๊ธฐ๋ฐ ๋ก๊ทธ์ธ ์ค์
- logout()
- ๋ก๊ทธ์์ ์ค์
- logoutSuccessUrl("/login")
๋ก๊ทธ์์ ํ ์ฌ์ฉ์๊ฐ /login ํ์ด์ง๋ก ์ด๋ํ๋๋ก ์ค์ - invalidateHttpSession(true)
๋ก๊ทธ์์ ์, ์ธ์ ์ ๋ฌดํจํํ์ฌ ์ฌ์ฉ์์ ์ธ์ ์ ๋ณด ์ ๊ฑฐ
- ๋ก๊ทธ์์ ์ค์
- csrf(AbstractHttpConfigurer::disable):
- CSRF ๋ณดํธ ๊ธฐ๋ฅ์ ๋นํ์ฑํ
์ฃผ๋ก API ์๋ฒ๋ JWT ๊ธฐ๋ฐ์ ๋ฌด์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ๋๋ค
- CSRF ๋ณดํธ ๊ธฐ๋ฅ์ ๋นํ์ฑํ
@Bean
public DaoAuthenticationProvider daoAuthenticationProvider() throws Exception {
DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
daoAuthenticationProvider.setUserDetailsService(userService);
daoAuthenticationProvider.setPasswordEncoder(bCryptPasswordEncoder());
return daoAuthenticationProvider;
}
- DaoAuthenticationProvider daoAuthenticationProvider()
- DAO ๊ธฐ๋ฐ์ ์ธ์ฆ ์ ๊ณต์ ์ค์
์ด ์ ๊ณต์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์ธ์ฆ ์ํ - setUserDetailsService(userService)
์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ก๋ํ๋ ์๋น์ค ์ค์
์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ ๋ ์ ๋ ฅํ ์ ๋ณด๋ฅผ userService๊ฐ ์ ๊ณตํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฌ์ฉ์ ์ ๋ณด์ ๋น๊ตํจ - setPasswordEncoder(bCryptPasswordEncoder())
๋น๋ฐ๋ฒํธ ์ํธํ ๋ฐฉ์ ์ค์
BCryptPasswordEncoder๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์ ๋น๋ฐ๋ฒํธ๋ฅผ ์์ ํ๊ฒ ์ํธํํ๊ณ ๊ฒ์ฆํจ
- DAO ๊ธฐ๋ฐ์ ์ธ์ฆ ์ ๊ณต์ ์ค์
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}
- BCryptPasswordEncoder bCryptPasswordEncoder()
- ๋น๋ฐ๋ฒํธ ์ํธํ๋ฅผ ์ํ BCrypt ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ ๋น
์ฌ์ฉ์์ ๋น๋ฐ๋ฒํธ๋ฅผ ํด์ํํ๊ณ , ๋ก๊ทธ์ธ ์ ์ ๋ ฅ๋ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ์ฅ๋ ํด์ ๊ฐ๊ณผ ๋น๊ตํ์ฌ ์ธ์ฆํ๋ค.
- ๋น๋ฐ๋ฒํธ ์ํธํ๋ฅผ ์ํ BCrypt ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ ๋น
- ์ ์ ๋ฆฌ์์ค์ H2 ์ฝ์์ ๋ํ ๋ณด์ ํํฐ๋ง์ ๋ฌด์.
- ๋ก๊ทธ์ธ ํ์ด์ง์ ๋ก๊ทธ์ธ ์ฑ๊ณต ํ ๋ฆฌ๋ค์ด๋ ํธ ์ค์ .
- ๋ก๊ทธ์์ ์ ์ธ์ ๋ฌดํจํ์ ๋ก๊ทธ์์ ํ ๋ฆฌ๋ค์ด๋ ํธ ์ค์ .
- CSRF ๋ณดํธ ๋นํ์ฑํ.
- ์ฌ์ฉ์ ์ธ์ฆ์ ์ํด BCrypt ๋น๋ฐ๋ฒํธ ์ํธํ ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ DAO ์ธ์ฆ ์ ๊ณต์ ์ค์ .
ํด๋น ๊ธ์ ์๋ ๋์์ ๋ด์ฉ์ ์ฐธ๊ณ ํ๋ฉฐ ์ ๋ฆฌํ ๊ฐ์ธํ์ต์ฉ ๊ธ์
๋๋ค.
์คํ๋ง ๋ถํธ 3 ๋ฒก์๋ ๊ฐ๋ฐ์ ๋๊ธฐ - ์๋ฐ ํธ, ์ ์ ์
๋ฐ์ํ
'TIL > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
OAuth2 ์ค์ ํ์ผ ์์ฑํ๊ธฐ (0) | 2024.10.04 |
---|---|
JWT ํ ํฐ ๊ธฐ๋ฐ ๊ฐ๋ ์์๋ณด๊ธฐ (0) | 2024.08.12 |
thymeleaf layout ์ ์ฉํ๊ธฐ (header, footer, main) (0) | 2024.01.26 |
jre jdk ์ฐจ์ด (0) | 2024.01.18 |
java lombok annotation ์์๋ณด์ (0) | 2024.01.14 |