Spring Boot
[Spring Security] docs : Getting Started
kiritoni
2024. 8. 29. 17:14
반응형
Spring Security는 인증, 권한부여 및 일반적인 공격에 대한 보호를 제공하는 프레임워크이다. 개발자가 보안 설정에 추가적으로 신경쓰지 않더라도 안전한 애플리케이션을 빠르게 구축할 수 있도록 돕는다!
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()`
- `@Bean`: 메서드를 통해 반환되는 객체가 스프링 컨텍스트에 빈으로 등록된다.
- `@ConditionalOnMissingBean(UserDetailsService.class)`: `UserDetailsService` 타입의 빈이 스프링 컨텍스트에 없는 경우에만 이 메서드가 실행되도록 조건을 설정한다는 것이다. 즉, 애플리케이션에서 `UserDetailsService` 빈이 이미 등록되어있다면 이 메서드가 무시된다.
- `InMemoryUserDetailsManager`: 이 클래스는 메모리에 사용자 정보를 저장하는 `UserDetailsService`의 구현체이다.
- 메서드 내부에서는 기본 사용자 이름이 `user`이고, 비밀번호가 `generatedPassword`인 사용자를 생성한다.
- `User.withUsername("user")`를 사용하여 이름이 `user`인 기본 사용자를 만들고, `.password(generatedPassword)`로 비밀번호를 설정하며, `.roles("USER")`로 사용자의 역할을 `USER`로 지정한다.
- `defaultAuthenticationEventPublisher()`
- `@Bean`
- `@ConditionalOnMissingBean(AuthenticationEventPublisher.class)`: 위와 같다. `AuthenticationEventPublisher` 타입의 빈이 스프링 컨텍스트에 없는 경우에만 이 메서드가 실행되도록 조건을 설정한다.
- `DefaultAuthenticationEventPublisher`: 이 클래스는 `ApplicationEventPublisher`를 사용하여 SpringSecurity 인증 event를 게시한다.
- `delegate`: 이 매개변수는 기본 event 게시자를 나타내며, 인증 event가 발생할 때 해당 이벤트를 처리한다.
Spring Security의 기본구성이 제공하는 런타임 동작
- 모든 엔드포인트에 인증된 사용자 요구
- 기본 사용자 등록 및 비밀번호 생성
- BCrypt를 사용한 비밀번호 보호
- 폼 기반 로그인 및 로그아웃 흐름 제공
- 폼 기반 로그인과 HTTP Basic 인증 지원
- 콘텐츠 협상 제공
- CSRF 공격 방지
- 세션 고정 공격 방지
- 엄격한 전송 보안 헤더 작성
- X-Content-Type-Options 헤더 작성
- 인증된 리소스를 보호하기 위한 캐시 제어 헤더 작성
- X-Frame-Options 헤더 작성
- HttpServletRequest의 인증 메서드와 통합
- 인증 성공 및 실패 이벤트 게시
반응형