Spring Security / / 2024. 10. 28. 12:48

Spring Security

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
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유