Spring Security

이진욱·2024년 12월 6일

이론

목록 보기
3/24

Spring Security는 Spring Framework 기반의 강력하고 유연한 인증(Authentication)권한 부여(Authorization) 프레임워크입니다. 이는 애플리케이션의 보안을 간단하면서도 강력하게 구현할 수 있도록 도와줍니다.

1. 주요 기능

  • 인증 (Authentication)
    사용자 또는 시스템의 신원을 확인하는 과정입니다.
    예: 사용자 ID와 비밀번호 검증.

  • 권한 부여 (Authorization)
    인증된 사용자가 애플리케이션 내에서 어떤 리소스나 작업에 접근할 수 있는지 결정합니다.
    예: 특정 API는 관리자만 접근 가능.

  • 보안 정책
    URL 패턴, 메서드 호출, 데이터 접근 등에 대한 접근 제어 정책을 제공합니다.

  • CSRF 보호
    CSRF(Cross-Site Request Forgery) 공격을 방지하기 위한 기본적인 보호 기능을 제공합니다.

  • 세션 관리
    사용자 세션의 고유성 및 유효성을 관리합니다.

  • 암호화
    비밀번호 해싱 및 암호화를 위한 유틸리티를 제공합니다.
    예: BCryptPasswordEncoder.

  • 확장성
    사용자 정의 보안 요구 사항을 구현할 수 있는 다양한 확장 포인트를 제공합니다.

2. 구성 요소

  • SecurityFilterChain

HTTP 요청을 가로채고 인증 및 권한 부여를 처리합니다.
Spring Boot 3.x 이후에는 WebSecurityConfigurerAdapter가 더 이상 사용되지 않고, SecurityFilterChain을 사용한 DSL 기반 설정이 주로 사용됩니다.

  • AuthenticationManager

인증 과정을 처리하는 핵심 컴포넌트입니다.
UserDetailsService 또는 AuthenticationProvider를 통해 사용자 인증을 수행합니다.

  • UserDetailsService

사용자 정보를 가져오는 데 사용됩니다.
보통 데이터베이스에서 사용자 정보를 조회하는 로직을 구현합니다.

  • PasswordEncoder

비밀번호를 안전하게 저장하기 위해 암호화를 수행합니다.
Spring Security는 기본적으로 BCryptPasswordEncoder를 권장합니다.

  • SecurityContext

현재 인증된 사용자의 정보를 저장합니다.
일반적으로 SecurityContextHolder를 통해 접근합니다.

  • Filter

다양한 보안 필터(예: UsernamePasswordAuthenticationFilter, BasicAuthenticationFilter)를 통해 요청 흐름을 제어합니다.

3. Spring Security 설정

기본적인 보안 설정 (Spring Boot 3.x 기준)


@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .csrf().disable() // CSRF 보호 비활성화 (테스트 시만)
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/auth/**").permitAll() // 인증 없이 접근 가능
                .anyRequest().authenticated() // 그 외 요청은 인증 필요
            )
            .formLogin(login -> login
                .loginPage("/login") // 커스텀 로그인 페이지 설정
                .defaultSuccessUrl("/") // 로그인 성공 시 이동할 URL
                .permitAll()
            )
            .logout(logout -> logout
                .logoutUrl("/logout") // 로그아웃 URL
                .logoutSuccessUrl("/login?logout") // 로그아웃 성공 시 이동 URL
                .permitAll()
            );
        return http.build();
    }
}




profile
열심히 하는 신입 개발자

0개의 댓글