본문 바로가기
Spring/Spring Security

Spring Security 공부 시작

by 롱싱싱 2024. 10. 14.

취업한 지 반 년이 지났다..

 

그동안 여러 프로젝트를 진행하면서 웹 애플리케이션의 보안이 얼마나 중요한지 절실히 느꼈다.

사용자의 데이터 보호와 안전한 인증 절차는 개발자로서의 책임 중 하나라는 것을 깨달았다.

그래서 이번에 Spring Security를 본격적으로 공부하기로 결심했다.

 

Spring Security는 강력한 인증 및 권한 부여 기능을 제공해 주어, 안전한 애플리케이션을 개발하는 데 큰 도움이 될 것이라 생각한다.

다양한 인증 방식과 커스터마이징 가능한 보안 정책을 통해 실무에서 유용하게 활용할 수 있을 것이라 기대하고 있다.

 

이제 본격적으로 Spring Security의 기초부터 심화까지 공부하며, 기술 스택을 한층 더 발전시키고자 한다.

 

 


스프링 시큐리티 자동 설정

서버가 기동되면 스프링 시큐리티 초기화 작업 및 보안 설정이 이루어짐

별도의 설정이나 코드를 작성하지 않아도 기본적인 웹 보안 기능이 시스템에 연동되어 작동

  1. 기본적으로 모든 요청에 대하여 인증 여부를 검증하고 인증이 승인되어야 자원 접근 가능
  2. 인증 방식 - 폼 로그인 방식, httpBasic로그인 방식
  3. 인증을 시도할 수 있는 로그인 페이지 자동 생성, 렌더링
  4. 인증 승인이 이루어질 수 있는 한 개의 계정이 기본 제공
    • 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 실행

 

https://start.spring.io/

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의 기본 설정을 통해 인증과 권한 부여가 간편하게 이루어지며, 기본 계정과 보안 기능이 자동으로 제공된다.
  • 그러나 계정 추가나 권한 세부 조정이 필요할 경우, 추가적인 설정과 커스터마이징이 필요하다.