정지용
기술스택 목록
백엔드

Spring Security

프로젝트 5에서 사용했습니다. 각 프로젝트에서 어떤 역할로 썼는지 아래에 정리했습니다.

이 기술은 무엇인가요?

Spring 애플리케이션에 인증과 인가 기능을 제공하는 보안 프레임워크

Spring Security는 Java/Spring 기반 애플리케이션에서 사용자 인증, 권한 관리, 공격 방어를 처리하는 프레임워크입니다. 세션 기반 인증, JWT 토큰, OAuth2 등 다양한 인증 방식을 지원하며, URL·메서드 단위로 접근 권한을 선언적으로 제어할 수 있습니다. CSRF, XSS, 세션 고정 공격 등 웹 보안 취약점에 대한 기본 방어 기능을 제공하여, 개발자가 보안 로직을 직접 구현하지 않아도 되도록 설계되었습니다.

이럴 때 사용합니다

  • Spring Boot REST API에서 JWT 기반 인증과 역할별 접근 제어가 필요할 때
  • 관리자·일반 사용자처럼 권한에 따라 접근 가능한 엔드포인트를 구분해야 할 때
  • 세션 기반 로그인, OAuth2 소셜 로그인 등 다양한 인증 방식을 통합 관리하고 싶을 때
  • CSRF, XSS, 세션 고정 공격 등 웹 보안 취약점을 자동으로 방어하고 싶을 때

핵심 개념

Authentication
사용자가 누구인지 확인하는 과정입니다. 아이디/비밀번호, JWT 토큰, OAuth2 등을 통해 신원을 검증하고 인증 객체를 생성합니다.
Authorization
인증된 사용자가 특정 리소스에 접근할 권한이 있는지 판단하는 과정입니다. 역할(Role)이나 권한(Authority)을 기반으로 요청을 허용하거나 거부합니다.
SecurityFilterChain
HTTP 요청이 들어올 때 순차적으로 실행되는 필터들의 체인입니다. 인증, 인가, CSRF 검증 등 각 필터가 보안 처리를 담당하며, 개발자가 필터를 추가하거나 순서를 조정할 수 있습니다.
UserDetailsService
사용자 정보를 데이터베이스나 외부 시스템에서 조회하는 인터페이스입니다. 로그인 시 입력받은 사용자명으로 UserDetails 객체를 반환하며, Spring Security가 비밀번호 검증에 사용합니다.
PasswordEncoder
비밀번호를 안전하게 암호화하고 검증하는 인터페이스입니다. BCrypt, PBKDF2 등 해시 알고리즘을 적용하여 평문 비밀번호를 저장하지 않도록 보호합니다.
SecurityContext
현재 인증된 사용자 정보를 담고 있는 컨텍스트입니다. 요청 처리 중 언제든지 SecurityContextHolder를 통해 접근하여 인증 객체와 권한을 확인할 수 있습니다.

JWT 기반 인증 설정

인증 없이 접근 가능한 경로와 ADMIN 역할이 필요한 경로를 구분하고, JWT 필터를 추가하여 stateless 인증을 구성하는 설정입니다.

Java
@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .csrf(csrf -> csrf.disable())
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/api/auth/**").permitAll()
                .requestMatchers("/api/admin/**").hasRole("ADMIN")
                .anyRequest().authenticated()
            )
            .sessionManagement(session -> 
                session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            )
            .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class);
        return http.build();
    }
}

처음 쓸 때 흔한 함정

  • SecurityFilterChain에서 permitAll()과 authenticated() 순서를 잘못 지정하면 의도와 다르게 접근이 차단될 수 있습니다.
  • JWT 사용 시 세션을 STATELESS로 설정하지 않으면 불필요한 세션이 생성되어 메모리를 낭비합니다.
  • PasswordEncoder를 Bean으로 등록하지 않으면 인증 시 암호화 방식을 찾지 못해 오류가 발생합니다.

위 개요는 기술 학습을 돕기 위해 자동 생성된 일반 설명입니다. 정확한 사양과 최신 정보는 공식 문서를 확인하세요.

프로젝트별 활용 방식

위 개념이 실제 프로젝트에서 어떻게 쓰였는지 보여줍니다.

함께 사용한 기술

위 프로젝트들에서 같이 쓰인 다른 기술입니다.