취업한 지 반 년이 지났다..
그동안 여러 프로젝트를 진행하면서 웹 애플리케이션의 보안이 얼마나 중요한지 절실히 느꼈다.
사용자의 데이터 보호와 안전한 인증 절차는 개발자로서의 책임 중 하나라는 것을 깨달았다.
그래서 이번에 Spring Security를 본격적으로 공부하기로 결심했다.
Spring Security는 강력한 인증 및 권한 부여 기능을 제공해 주어, 안전한 애플리케이션을 개발하는 데 큰 도움이 될 것이라 생각한다.
다양한 인증 방식과 커스터마이징 가능한 보안 정책을 통해 실무에서 유용하게 활용할 수 있을 것이라 기대하고 있다.
이제 본격적으로 Spring Security의 기초부터 심화까지 공부하며, 기술 스택을 한층 더 발전시키고자 한다.
스프링 시큐리티 자동 설정
서버가 기동되면 스프링 시큐리티 초기화 작업 및 보안 설정이 이루어짐
별도의 설정이나 코드를 작성하지 않아도 기본적인 웹 보안 기능이 시스템에 연동되어 작동
- 기본적으로 모든 요청에 대하여 인증 여부를 검증하고 인증이 승인되어야 자원 접근 가능
- 인증 방식 - 폼 로그인 방식, httpBasic로그인 방식
- 인증을 시도할 수 있는 로그인 페이지 자동 생성, 렌더링
- 인증 승인이 이루어질 수 있는 한 개의 계정이 기본 제공
- SecutiryProperties 설정 클래스에서 생성
- username: user
- password: 랜덤 문자열
SpringBootWebSecutiryConfiguration
기본 보안 설정 클래스:
- SpringBootWebSecurityConfiguration에서 기본 보안 설정을 구성하는 SecurityFilterChainConfiguration 클래스가 생성된다. 아래는 주요 설정 내용이다:
@Configuration(proxyBeanMethods = false)
@ConditionalOnDefaultWebSecurity
static class SecurityFilterChainConfiguration {
@Bean
@Order(SecurityProperties.BASIC_AUTH_ORDER)
SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests((requests) -> requests.anyRequest().authenticated());
http.formLogin(withDefaults());
http.httpBasic(withDefaults());
return http.build();
}
}
이 설정을 통해 인증을 받아야만 서버에 접근할 수 있으며,
인증을 받지 않으면 폼 로그인 방식이나 HTTP Basic 방식으로 인증을 받아야 한다.
- 계정 추가나 권한 추가할 수 없음
- 더 세부적이고 추가적인 보안기능이 필요할 때 문제점
Spring Security 실행
Spring Initializer를 사용해서 Spring boot를 생성했다.
boot버전은 3.3.4를 사용하고, Spring Web과 Spring Security를 추가했다.
기본적으로 서버에 접속하면 index창이 떠야하지만 실행을 시켜보니 자동으로 로그인 창이 뜨고,
콘솔에 security password가 출력됐다.
Username : user와 출력된 password로 로그인을 해보니 index페이지로 이동했다.
이 계정은 SecurityProperties 클래스에서 자동으로 생성되는 계정이다.
계정 생성 원리:
- 기본 제공되는 계정은 UserDetailsServiceAutoConfiguration 클래스에서 inMemoryUserDetailsManager를 통해 메모리에 저장된다.
- 계정 생성 코드
@Bean
public InMemoryUserDetailsManager inMemoryUserDetailsManager(SecurityProperties properties,
ObjectProvider<PasswordEncoder> passwordEncoder) {
SecurityProperties.User user = properties.getUser();
List<String> roles = user.getRoles();
return new InMemoryUserDetailsManager(User.withUsername(user.getName())
.password(getOrDeducePassword(user, passwordEncoder.getIfAvailable()))
.roles(StringUtils.toStringArray(roles))
.build());
}
결론
- Spring Security의 기본 설정을 통해 인증과 권한 부여가 간편하게 이루어지며, 기본 계정과 보안 기능이 자동으로 제공된다.
- 그러나 계정 추가나 권한 세부 조정이 필요할 경우, 추가적인 설정과 커스터마이징이 필요하다.