Spring MVC 기반 애플리케이션의 인증과 인가 기능을 지원하는 보안 프레임워크
Spring에서 지원하는 Servlet Filter
나 Interceptor
로 보안 기능을 직접 구현하는 방법도 있지만, 보통 Spring Security를 사용한다.
보안에 대해서 잘 알고 스스로 구현할 수 있다면 괜찮은데, 현재는 보안보다 비즈니스 로직을 구현하는 것이 더 중요하기 때문에!
민감한 정보에 대한 데이터 암호화
SSL 적용
❓ 타임리프에 대해서 더 찾아보기!
Spring Security는 디폴트 로그인 페이지와 디폴트 로그인 정보를 생성해준다.
하지만 우린 이런 디폴트 로그인 정보를 사용하지 않고, Spring Security Configuration을 통해서 원하는 기능을 웹 페이지에 적용시켜 것이다.
@Configuration
public class SecurityConfiguration {
// 여기에 Spring Security의 설정을 진행합니다.
}
Spring Security Configuration 클래스를 하나 생성한 후에, @Configuration
애너테이션을 붙여준다.
Spring Security에 관한 @Configuration
이 붙은 클래스는 하나여야 한다!
❓
@Configuration
애너테이션은 필요한 설정에 따라 여러 개 생성할 수 있다. 하지만 동일한 처리를 하는 Configuration을 여러개 만들 경우 Bean으로 등록할 때 문제가 발생할 수 있기 때문에 주의해야 한다!
1️⃣ 인메모리에 인증을 위한 고정된 사용자 계정 정보를 생성한다.
@Configuration
public class SecurityConfiguration {
@Bean
public UserDetailsManager userDetailsService() {
UserDetails userDetails =
User.withDefaultPasswordEncoder()
.username("kevin@gmail.com")
.password("1111")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(userDetails);
}
}
UserDetails
: 사용자의 핵심 정보를 포함하는 인터페이스
User
: UserDetails 인터페이스의 구현체
withDefaultPasswordEncoder()
: 패스워드를 암호화해주는 메서드
UserDetailsManager
InMemoryUserDetailsManager
UserDetailsManager
의 구현체UserDetailsManager 객체를 Bean으로 등록해야 한다.
Spring은 "클라이언트의 요청"과 "Bean이 가지고 있는 사용자 정보"를 비교해서 인증 프로세스를 수행하기 때문에
2️⃣ HTTP 보안 설정
HttpSecurity
를 통해 Spring Security에서 지원하는 보안 설정을 구성할 수 있다.
SecurityFilterChain
객체를 Bean으로 등록해서 HTTP 보안 설정을 등록한다.
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf().disable()
.formLogin()
.loginPage("/auths/login-form")
.loginProcessingUrl("/process_login")
.failureUrl("/auths/login-form?error")
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/")
.and()
.exceptionHandling().accessDeniedPage("/auths/access-denied")
.and()
.authorizeHttpRequests(authorize -> authorize
.antMatchers("/orders/**").hasRole("ADMIN")
.antMatchers("/members/my-page").hasRole("USER")
.antMatchers("/**").permitAll()
);
return http.build();
}
HttpSecurity
: HTTP 요청에 대한 보안 설정을 구성하는 클래스
csrf().disable()
: CSRF 공격에 대한 Spring Security 설정을 비활성화
(활성화되어 있으면 CSRF 공격을 방지하기 위해서 클라이언트로부터 CSRF 토큰을 받아 검증한다. 현재는 로컬 환경에서 테스트하는 것이므로 비활성화해둔다.)
formLogin()
: 폼 로그인 방식으로 설정
authorizeHttpRequests()
: 클라이언트 요청 URI에 대한 접근 권한을 부여한다.
antMatchers(Path).hasRole("ADMIN/USER")
: 해당 role을 부여받은 사용자만 해당 Path에 접근할 수 있다.
and()
: Spring Security 보안 설정을 메서드 체인 형태로 구성한다.
위의 코드처럼 여러 필터가 존재하고, and 메서드를 통해서 여러 필터들을 체인 형태로 연결해주는 것이다.
3️⃣ 회원 가입 기능 추가
(1)번에서는 고정된 사용자 계정 정보를 추가해둔 것이다.
하지만 우리가 보통 웹 사이트를 사용할 때는, 고정된 계정을 사용하지 않고 사용자가 직접 회원가입을 한 계정을 사용한다.