뭔가 애매하게 알고있는듯 해서 좀더 자세하게 알아보기로 했다.!!!
인증은 주체(Principal)가 누구인지 확인하는 과정이다. 스프링 시큐리티는 Form 인증, Basic 인증, Digest 인증, OAuth2.0 인증 등 다양한 인증 방식을 지원한다. 사용자가 로그인을 하면 스프링 시큐리티는 인증 요청을 가로채서 인증을 진행한다.
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
위의 예제 코드에서는 사용자의 상세 정보를 가져오는 UserDetailsService를 AuthenticationManagerBuilder에 등록하고 있다. 이렇게 하면 사용자가 로그인을 시도할 때, 입력한 사용자 이름으로 UserDetailsService를 통해 사용자 정보를 가져와서 비밀번호를 비교하여 인증을 진행한다.
인가는 주체(Principal)가 리소스에 접근할 권한이 있는지 확인하는 과정이다. 스프링 시큐리티는 URL 패턴으로 접근 권한을 제어하거나, 메소드 호출 시 접근 권한을 확인하는 등 다양한 방식으로 인가를 처리한다.
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").hasAnyRole("USER", "ADMIN")
.anyRequest().authenticated()
.and()
.formLogin();
}
}
위의 예제 코드에서는 /admin/ URL 패턴에는 'ADMIN' 역할을 가진 사용자만 접근 가능하도록 설정하였고, /user/ URL 패턴에는 'USER' 또는 'ADMIN' 역할을 가진 사용자만 접근 가능하도록 설정하였다. 그리고 그 외의 모든 요청에는 인증된 사용자만 접근 가능하도록 설정하였다.
오늘의 학습을 통해 스프링 시큐리티의 인증과 인가에 대해 깊이 있게 이해할 수 있었다. 스프링 시큐리티는 강력한 인증과 인가 기능을 제공함으로써, 보안이 중요한 웹 애플리케이션 개발에 있어서 필수적인 도구라는 것을 느꼈다. 또한, 인증과 인가 과정이 어떻게 동작하는지, 어떤 방식으로 설정할 수 있는지 등을 배움으로써 보다 안전한 웹 애플리케이션을 개발할 수 있을 것이라는 생각만 들었는데 아직 활용에 있어서는 내가 부족하다고 느껴졌다...