Spring Boot

[Spring Security] docs : Getting Started

kiritoni 2024. 8. 29. 17:14
반응형

 

 

Spring Security는 인증, 권한부여 및 일반적인 공격에 대한 보호를 제공하는 프레임워크이다. 개발자가 보안 설정에 추가적으로 신경쓰지 않더라도 안전한 애플리케이션을 빠르게 구축할 수 있도록 돕는다!

 

 

Spring Security docs 

 

Hello Spring Security :: Spring Security

Running Spring Boot Application $ ./mvnw spring-boot:run ... INFO 23689 --- [ restartedMain] .s.s.UserDetailsServiceAutoConfiguration : Using generated security password: 8e557245-73e2-4286-969a-ff57fe326336 ... $ ./gradlew :bootRun ... INFO 23689 --- [ re

docs.spring.io

 

 

* Gradle 기준으로 작성됨

 

Spring Security의 종속성 업데이트를 한 뒤 실행하면

다음과 같이 Spring Security가 활성화된다. 

 

$ ./gradlew :bootRun
...
INFO 23689 --- [  restartedMain] .s.s.UserDetailsServiceAutoConfiguration :

Using generated security password: 8e557245-73e2-4286-969a-ff57fe326336

...

 

만약 자격 증명없이 엔드포인트에 도달한 경우 `401 Unauthorized` 를 사용해 액세스를 거부한다.

자격 증명을 사용해 엔드포인트에 도달하면 Spring Boot가 요청을 처리하고,

경로가 존재하지 않으면 `404 Not Found`를 반환한다. 

 

 

Spring Boot 보안 자동 구성

@EnableWebSecurity
@Configuration
public class DefaultSecurityConfig {
    @Bean
    @ConditionalOnMissingBean(UserDetailsService.class)
    InMemoryUserDetailsManager inMemoryUserDetailsManager() {
        String generatedPassword = // ...;
        return new InMemoryUserDetailsManager(User.withUsername("user")
                .password(generatedPassword).roles("USER").build());
    }

    @Bean
    @ConditionalOnMissingBean(AuthenticationEventPublisher.class)
    DefaultAuthenticationEventPublisher defaultAuthenticationEventPublisher(ApplicationEventPublisher delegate) {
        return new DefaultAuthenticationEventPublisher(delegate);
    }
}

 

  • `@EnableWebSecurity`: Spring Security 활성화, 웹 애플리케이션에서 기본적인 보안 구성을 설정하도록 한다. 이 애너테이션이 적용된 클래스는 Spring Security의 설정 클래스임을 의미한다. Spring Security의 default Filter chain을 bean 으로 등록한다. 
  • `@Configuration`: 해당 클래스가 Spring의 설정 클래스로 사용됨을 나타낸다. 설정 클래스는 bean 정의 및 의존성 주입을 위해 사용된다. 
  • `inMemoryUserDetailsManager()`
    1. `@Bean`: 메서드를 통해 반환되는 객체가 스프링 컨텍스트에 빈으로 등록된다. 
    2. `@ConditionalOnMissingBean(UserDetailsService.class)`: `UserDetailsService` 타입의 빈이 스프링 컨텍스트에 없는 경우에만 이 메서드가 실행되도록 조건을 설정한다는 것이다. 즉, 애플리케이션에서 `UserDetailsService` 빈이 이미 등록되어있다면 이 메서드가 무시된다. 
    3. `InMemoryUserDetailsManager`: 이 클래스는 메모리에 사용자 정보를 저장하는 `UserDetailsService`의 구현체이다. 
      • 메서드 내부에서는 기본 사용자 이름이 `user`이고, 비밀번호가 `generatedPassword`인 사용자를 생성한다. 
      • `User.withUsername("user")`를 사용하여 이름이 `user`인 기본 사용자를 만들고, `.password(generatedPassword)`로 비밀번호를 설정하며, `.roles("USER")`로 사용자의 역할을 `USER`로 지정한다. 
  • `defaultAuthenticationEventPublisher()`
    1. `@Bean`
    2. `@ConditionalOnMissingBean(AuthenticationEventPublisher.class)`: 위와 같다. `AuthenticationEventPublisher` 타입의 빈이 스프링 컨텍스트에 없는 경우에만 이 메서드가 실행되도록 조건을 설정한다. 
    3. `DefaultAuthenticationEventPublisher`: 이 클래스는 `ApplicationEventPublisher`를 사용하여 SpringSecurity 인증 event를 게시한다. 
    4. `delegate`: 이 매개변수는 기본 event 게시자를 나타내며, 인증 event가 발생할 때 해당 이벤트를 처리한다. 

 

Spring Security의 기본구성이 제공하는 런타임 동작

  1. 모든 엔드포인트에 인증된 사용자 요구
  2. 기본 사용자 등록 및 비밀번호 생성
  3. BCrypt를 사용한 비밀번호 보호
  4. 폼 기반 로그인 및 로그아웃 흐름 제공
  5. 폼 기반 로그인과 HTTP Basic 인증 지원
  6. 콘텐츠 협상 제공
  7. CSRF 공격 방지
  8. 세션 고정 공격 방지
  9. 엄격한 전송 보안 헤더 작성
  10. X-Content-Type-Options 헤더 작성
  11. 인증된 리소스를 보호하기 위한 캐시 제어 헤더 작성
  12. X-Frame-Options 헤더 작성
  13. HttpServletRequest의 인증 메서드와 통합
  14. 인증 성공 및 실패 이벤트 게시

 

반응형