Spring Security - Security 설정을 위한 WebSecurityConfigurerAdatper

목차

Spring Security 설정하기 - WebSecurityConfigurerAdatper

스프링 Scurity에 대한 설정은 WebSecurityConfigurer 인터페이스 구현하거나 WebSecurityConfigurerAdapter 클래스를 상속해 설정을 할 수 있다.

인증 방식 설정

configure(AuthenticationManagerBuilder auth)

  • 인증 방식과 관련된 설정을 하기 위한 메소드
  • AuthenticationManagerBuilder는 인증객체(AuthenticationManager)를 생성하기 위한 클래스이다.
  • In Memory authentication나 UserDetailsService를 사용하는 다양한 인증 방식을 손 쉽게 구축할 수 있도록 지원한다.

configure(AuthenticationManagerBuilder auth)

private final CustomUserDetailsService customUserDetailsService;

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(customUserDetailsService);
}

전역적인 Security 설정

configure(WebSecurity web)

  • 전역적인 Security 설정을 하기 위해 사용하는 메소드
  • 정적 파일에 대한 보안 예외처리와 같이 Security Filter Chain에 대한 예외처리를 할 때 사용한다.
  • WebSecurity 클래스는 Spring Security에서 FilterChainProxy를 생성한다.

configure(WebSecurity web)

@Override
public void configure(WebSecurity web) throws Exception {
web
.ignoring()
.antMatchers("/css/**", "/js/**")
.antMatchers("/favicon.ico", "/resources/**", "/error");
}

Resource별로 Security를 설정

configure(HttpSecurity http)

  • Resource별로 Security를 설정하기 위한 메소드이다.
  • HttpSecurity 클래스를 통해 인증, 인가와 관련된 Web 기반의 보안 설정을 할 수 있다.
  • 인증 : Form Login, Http Basic, OAuth2 Login 등
  • 인가 : Matchers, Role, Authenticate, permit 등

configure(HttpSecurity http)

@Override
protected void configure(HttpSecurity http) throws Exception {
// 인가
http
.authorizeRequests() // 인가에 대한 설정을 한다.
.antMatchers("/loginPage").permitAll() // /loginPage 접근시에는 인증이 필요하지 않다.
.anyRequest().authenticated(); // 다른 모든 리소스에 접그하기 위해서는 인증이 필요하다

// 인증
http
.formLogin() // Form Login 방식의 인증을 사용한다.
.loginPage("/loginPage") // 로그인 페이지를 설정한다.
.defaultSuccessUrl("/") // Login을 성공한 후 / 페이지로 이동하게 된다.
.failureUrl("/loginPage") // 로그인 실패시 /loginPage로 이동하게 된다.
.usernameParameter("username") // 요청 파라미터에서 username을 usernameParameter로 사용한다.
.passwordParameter("password") // 요청 파라미터에서 password를 passwordParameter로 사용한다.
.loginProcessingUrl("/login_proc") // 로그인을 진행하기 위한 URL
// 로그인이 성공했을 때 처리하기 위한 Handler
.successHandler(new AuthenticationSuccessHandler() {
@Override
public void onAuthenticationSuccess(HttpServletRequest httpServletRequest
, HttpServletResponse httpServletResponse
, Authentication authentication) throws IOException, ServletException {
httpServletResponse.sendRedirect("/");
}
})
// 로그인이 실패했을 때 처리하기 위한 Handler
.failureHandler(new AuthenticationFailureHandler() {
@Override
public void onAuthenticationFailure(HttpServletRequest httpServletRequest
, HttpServletResponse httpServletResponse
, AuthenticationException e) throws IOException, ServletException {
httpServletResponse.sendRedirect("/loginPage");
}
});
}

패스워드 암호화

Spring Boot에서는 사용자의 Password는 암호화된 상태로 저장이 돼야 한다. 암호화가 안된 상태로 저장하게 되면 사용자 인증시에 오류가 발생하게 된다. 그래서 Password를 암호화된 상태로 저장할 수 있도록 PasswordEncoder 인터페이스를 제공한다.

PasswordEncoder

  • PasswordEncoder 인터페이스는 보통 패스워드를 단방향으로 변환한다. 즉 다시 원래대로 되돌릴 수 없다는 의미이다.
  • 그래서 Hash 알고리즘을 사용한다.
    • BcryptPasswordEncoder
    • Argon2PasswordEncoder
    • Pbkdf2PasswordEncoder
    • SCryptPasswordEncoder
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
Share