Spring Security는 웹 애플리케이션과 REST API의 보안을 강화하는 Java 기반의 프레임워크로, 주로 **인증(Authentication)**과 권한 부여(Authorization) 기능을 제공합니다. Spring Framework와 쉽게 통합되며, 접근 제어, 보안 정책 관리, 암호화 등의 다양한 보안 기능을 구축할 수 있습니다. Spring Boot와 함께 사용할 때는 많은 설정을 자동으로 구성해 주어, 더 빠르고 쉽게 보안 기능을 추가할 수 있습니다.
Spring Boot 3에서는 WebSecurityConfigurerAdapter가 더 이상 사용되지 않습니다. 대신, **SecurityFilterChain**을 사용하여 Spring Security 설정을 구성합니다. WebSecurityConfigurerAdapter가 제거된 이유는 보안 구성을 보다 유연하게 하고, 필요할 때마다 메서드 수준에서 설정할 수 있도록 개선하기 위해서입니다.
Spring Security의 개념 (Spring Boot 3 기준)
1. **인증(Authentication)**과 권한 부여(Authorization):
• 인증은 사용자가 누구인지 확인하는 과정입니다. 예를 들어, 사용자가 로그인할 때 입력한 아이디와 비밀번호가 유효한지를 검증합니다.
• 권한 부여는 인증된 사용자가 특정 리소스나 기능에 접근할 수 있는지 결정하는 과정입니다. Spring Security는 @PreAuthorize, @Secured 등의 어노테이션을 통해 권한을 제어할 수 있습니다.
2. Security Filter Chain:
• Spring Security는 필터 기반의 보안 구조를 가지고 있으며, SecurityFilterChain은 요청이 들어올 때 이를 처리하는 일련의 보안 필터들을 정의합니다.
• Spring Boot 3에서는 @Bean으로 SecurityFilterChain을 직접 정의하여 보안 설정을 관리합니다. HttpSecurity 객체를 사용해 각 요청별로 보안 설정을 추가합니다.
Spring Boot 3에서 Spring Security 설정
Spring Boot 3에서는 WebSecurityConfigurerAdapter 없이 SecurityFilterChain을 설정하는 방식으로 보안을 구성합니다.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/public/**").permitAll() // public 경로는 인증 없이 접근 가능
.anyRequest().authenticated() // 그 외 모든 요청은 인증 필요
)
.formLogin(form -> form
.loginPage("/login") // 커스텀 로그인 페이지 설정
.permitAll()
)
.httpBasic(); // HTTP Basic 인증 설정
return http.build();
}
}
위 설정을 보면:
• authorizeHttpRequests: 특정 경로에 대한 접근 권한을 설정합니다. 예를 들어, /public/** 경로는 인증 없이 접근할 수 있지만, 그 외의 모든 요청은 인증이 필요합니다.
• formLogin: 로그인 페이지를 지정합니다. 기본 제공되는 로그인 폼을 사용하거나 /login으로 직접 커스텀 페이지를 설정할 수 있습니다.
• httpBasic: 기본 HTTP Basic 인증을 활성화하여 간단한 인증을 제공합니다.
주요 설정 옵션
1. Form Login:
• formLogin을 통해 Spring Security의 기본 로그인 페이지를 사용하거나 커스텀 로그인 페이지를 설정할 수 있습니다. 로그인 경로, 성공 시 리다이렉트 경로 등을 커스터마이즈할 수 있습니다.
2. HTTP Basic Authentication:
• httpBasic() 설정을 통해 브라우저 팝업을 통한 기본 인증 방식을 사용할 수 있습니다. 이 방식은 테스트 용도로는 유용하지만, 보안이 취약할 수 있으므로 실무에서는 주로 Form Login이나 OAuth2 인증을 사용합니다.
3. JWT와 OAuth2:
• RESTful API에서는 세션 기반 인증 대신 **JWT(Json Web Token)**나 OAuth2와 같은 토큰 기반 인증 방식을 사용합니다. Spring Security는 OAuth2 인증을 손쉽게 지원합니다.
사용자 정의 AuthenticationProvider 설정
Spring Boot 3에서는 커스텀 인증 로직을 구현하기 위해 **AuthenticationProvider**를 직접 구현할 수 있습니다.
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Component;
import java.util.Collections;
@Component
public class CustomAuthenticationProvider implements AuthenticationProvider {
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
String username = authentication.getName();
String password = authentication.getCredentials().toString();
if ("user".equals(username) && "password".equals(password)) {
return new UsernamePasswordAuthenticationToken(username, password, Collections.emptyList());
} else {
throw new AuthenticationException("Invalid credentials") {};
}
}
@Override
public boolean supports(Class<?> authentication) {
return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication);
}
}
PasswordEncoder 설정
Spring Security는 비밀번호를 암호화할 것을 요구합니다. 보통 BCryptPasswordEncoder와 같은 암호화기를 사용합니다.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@Configuration
public class PasswordConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
Custom UserDetailsService 구현
UserDetailsService를 구현하여 사용자 정보를 데이터베이스에서 로드할 수 있습니다.
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
@Service
public class CustomUserDetailsService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// 데이터베이스에서 사용자 조회 로직
// 예시: if ("user".equals(username)) { return new User("user", passwordEncoder.encode("password"), authorities); }
throw new UsernameNotFoundException("User not found");
}
}
Spring Boot 3의 주요 보안 기능 요약
1. 인증 및 권한 부여 설정: SecurityFilterChain을 통해 경로별 접근 권한을 설정할 수 있습니다.
2. 암호화 지원: PasswordEncoder를 설정하여 비밀번호를 안전하게 저장하고 검증합니다.
3. 다양한 인증 방식: Form Login, HTTP Basic, JWT, OAuth2 등의 인증 방식을 유연하게 지원합니다.
4. 커스텀 인증 제공자: AuthenticationProvider를 구현하여 커스텀 인증 로직을 추가할 수 있습니다.
이와 같이, Spring Boot 3에서는 SecurityFilterChain을 사용하여 Spring Security 설정을 유연하고 간단하게 구성할 수 있습니다. WebSecurityConfigurerAdapter 없이도 다양한 인증과 권한 부여 로직을 쉽게 구현할 수 있어, 최신 Spring Security의 설정이 더욱 편리해졌습니다.
'Spring Security' 카테고리의 다른 글
UserDetailsService, PasswordEncoder, AuthenticationProvider (0) | 2024.10.29 |
---|---|
JSON Web Token (0) | 2024.10.28 |
SHA-256 (4) | 2024.10.28 |
자체 서명된 인증서 생성하기 (1) | 2024.10.28 |
Credential, Principal (1) | 2024.10.28 |