HttpSecurity

2025. 12. 16. 09:52Spring Security

🛠️ HttpSecurity

HttpSecurity는 Spring Security에서 SecurityFilterChain을 생성하고 구성하는 데 사용되는 핵심 빌더(Builder) 객체입니다. 이는 개발자가 선언적인 방식으로 복잡한 웹 보안 규칙을 쉽게 정의할 수 있도록 해주는 DSL(Domain Specific Language, 도메인 특화 언어) 역할을 합니다.

개발자는 HttpSecurity 객체에 메서드 체이닝 방식으로 원하는 보안 설정을 적용하고, 최종적으로 .build()를 호출하여 SecurityFilterChain 인스턴스를 생성하게 됩니다.

1. HttpSecurity의 핵심 역할: 빌더 패턴

HttpSecurity빌더 패턴을 구현하고 있습니다. 이 객체를 사용하여 SecurityFilterChain에 포함될 모든 보안 필터들과 그 동작 방식을 설정합니다.

  1. 설정 시작: @Bean 메서드의 아규먼트로 HttpSecurity http 객체를 주입받아 설정합니다.
  2. 설정 체이닝: http.로 시작하는 메서드를 호출하여 인증, 인가, 세션 관리 등 다양한 설정을 정의합니다. 대부분의 메서드는 설정을 위한 객체를 반환하거나 다시 HttpSecurity 객체를 반환하여 연속적인 체이닝을 가능하게 합니다.
  3. 필터 체인 생성: 설정이 완료되면 .build()를 호출하여 설정된 모든 규칙을 담은 최종 결과물인 SecurityFilterChain을 생성하여 반환합니다.

2. HttpSecurity를 통해 구성되는 주요 영역

HttpSecurity는 웹 요청에 대한 보안을 전반적으로 제어하는 데 사용되며, 크게 다음과 같은 영역의 설정을 담당합니다.

설정 영역 주요 메서드 (예시) 설명
Authorization .authorizeHttpRequests() 특정 URL Path에 대한 접근 권한(permitAll(), hasRole(), authenticated() 등)을 정의합니다. 가장 중요하고 자주 사용됩니다.
Authentication .formLogin() 폼 기반 로그인(Username/Password)의 동작(로그인 페이지, 성공/실패 URL)을 설정합니다.
  .httpBasic() HTTP Basic 인증을 활성화합니다.
  .oauth2Login() OAuth 2.0 기반 소셜 로그인을 설정합니다.
예외 처리 .exceptionHandling() 인증/인가 실패 시의 동작(accessDeniedHandler(), authenticationEntryPoint())을 정의합니다.
세션 관리 .sessionManagement() 세션 생성 정책(STATELESS, IF_REQUIRED), 동시 세션 제어 등을 설정합니다.
보안 기능 .csrf() CSRF(Cross-Site Request Forgery) 방어를 활성화/비활성화합니다.
  .headers() HTTP 보안 헤더(XSS, Content-Security-Policy 등)를 설정합니다.
필터 관리 .addFilter() / .addFilterBefore() 개발자가 만든 커스텀 필터(예: JWT 인증 필터)를 기존 필터 체인의 특정 위치에 삽입합니다.

 

3. 멀티 SecurityFilterChain 구성에서의 역할

HttpSecurityFilterChainProxy가 요청을 분류할 수 있도록 각 체인의 적용 범위를 지정하는 데도 사용됩니다.

  • .securityMatcher(String... patterns): 해당 SecurityFilterChain이 적용될 URL 패턴을 명시적으로 정의합니다. 이 설정을 통해 요청 경로에 따라 완전히 다른 보안 정책을 가진 여러 개의 SecurityFilterChain을 생성할 수 있습니다.
  • 예시: /api/** 경로에만 적용되는 SecurityFilterChain을 만듭니다.
	http.securityMatcher("/api/**")
		.csrf(csrf -> csrf.disable()); 
    // ...

 

4. HttpSecurity와 Spring 컨테이너의 관계 (다시 한번 강조)

HttpSecurity 객체는 개발자가 직접 new 키워드로 생성하거나, 컨테이너에 빈으로 등록하는 객체가 아닙니다.

  • 주입 방식: Spring Security의 내부 구성 인프라(주로 WebSecurityConfiguration)가 SecurityFilterChain 빈을 생성하는 메서드(@Bean public SecurityFilterChain filterChain(HttpSecurity http))를 감지하고, 해당 메서드가 호출될 때 요청에 맞는 HttpSecurity 인스턴스를 새로 만들거나 준비하여 아규먼트로 주입(전달)해 줍니다.
  • 휘발성: HttpSecurity는 설정을 정의하는 동안만 사용되는 임시적인 빌더이며, .build()를 호출한 후에는 수명이 다하고, 최종 결과물인 SecurityFilterChain만이 컨테이너에 빈으로 등록됩니다.

HttpSecurity를 사용하면 복잡한 필터 체인 구성 작업을 추상화하여, 개발자가 '어떻게' 보안을 구현할지 대신 '무엇을' 보호할지에 집중할 수 있게 됩니다.