@EnableWebSecurity
애노테이션이란?
- web security 구성정보를 활성화하기 위해 사용된다.
- 스프링에 인증 및 권한을 제공하는 보안 구성을 적용하도록 신호를 보낸다.
- 주로
WebSecurityConfigurerAdapter
클래스를 상속하여 사용한다.- 기본 보안 설정을 제공하고, 메서드 오버라이딩을 통한 보안 커스터마이징을 제공한다.
인증 (Authentication) 구성하기
configure(AuthenticationManagerBuilder auth)
메서드를 재정의하여 사용자 인증 방법을 구성할 수 있다.- 사용자 세부 정보를 검색하는 방법 (ex. DB, LDAP, 인메모리)과 비밀번호 인코딩 방법 등을 정의할 수 있다.
@Autowired
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("user").password(passwordEncoder().encode("password")).roles("USER")
.and()
.withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN");
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(customUserDetailsService)
.passwordEncoder(passwordEncoder());
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
인가 (Authorization) 구성하기
configure(HttpSecurity http)
메서드를 오버라이드하여 인가를 구성할 수 있다.- URL 과 ROLE 을 기반으로 한 접근 제어 규칙을 설정할 수 있다.
- 로그인, 로그아웃 핸들링도 가능하다.
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.antMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.cors()
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS) // 세션을 사용하지 않음
.and()
.csrf().disable() // csrf 미사용
.headers().frameOptions().disable()
.and()
.formLogin().disable() // 로그인 폼 미사용
.httpBasic().disable() // Http basic Auth 기반으로 로그인 인증창이 열림(disable 시 인증창 열리지 않음)
.exceptionHandling().authenticationEntryPoint(new RestAuthenticationEntryPoint()) // 인증,인가가 되지 않은 요청 시 발생
.and()
.authorizeRequests()
.antMatchers("/auth/**", "/oauth2/**").permitAll() // Security 허용 Url
.anyRequest().authenticated() // 그 외엔 모두 인증 필요
.and()
.oauth2Login()
.authorizationEndpoint().baseUri("/oauth2/authorization") // 소셜 로그인 Url
.authorizationRequestRepository(cookieOAuth2AuthorizationRequestRepository()) // 인증 요청을 쿠키에 저장하고 검색
.and()
.redirectionEndpoint().baseUri("/oauth2/callback/*") // 소셜 인증 후 Redirect Url
.and()
.userInfoEndpoint().userService(customOAuth2UserService) // 소셜의 회원 정보를 받아와 가공처리
.and()
.successHandler(oAuth2AuthenticationSuccessHandler) // 인증 성공 시 Handler
.failureHandler(oAuth2AuthenticationFailureHandler); // 인증 실패 시 Handler
http.addFilterBefore(tokenAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
}
패스워드 인코딩 추가하기
- 패스워드 인코딩에 필요한 빈을 추가할 수 있다.
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
Spring MVC 통합
- Spring MVC 를 사용하는 경우 보안 구성이 자동으로 통합된다.
- 세션 관리, CSRF 보호 등과 같은 측면을 구성할 수도 있다.
기타 커스터마이징
WebSecurityConfigurerAdapter
를 이용하면, 사용자 지정 인증 및 액세스 거부 처리기, CORS 설정, 기억하기 기능 등 기타 사용자 지정이 가능하다.
반응형
'프레임워크 > 스프링 프레임워크' 카테고리의 다른 글
Spring Boot Configuration Processor 란? (0) | 2023.08.02 |
---|---|
@EnableGlobalMethodSecurity 애노테이션이란? (0) | 2023.07.31 |
@EnableWebMvc 애노테이션이란? (0) | 2023.07.31 |
스프링 WebMvcConfigurer 인터페이스란? (0) | 2023.07.31 |
스프링부트 @EnableConfigurationProperties 애노테이션이란? (0) | 2023.07.30 |