노트

시큐리티 필터체인

Spring Security Filter Chain

백엔드#security#spring · 연결된 개념 16개

쉽게 말하면

시큐리티 필터체인은 공항에서 탑승구(컨트롤러)에 가기 전에 신분 확인과 보안 검색을 차례로 거치는 관문이에요. 통과 못 하면 탑승구 근처에도 못 가니, 인증·인가 검사를 한곳에서 끝내죠.

비유가 깨지는 곳 관문에서 걸리면 컨트롤러까지 안 가서 ControllerAdvice가 아니라 AuthenticationEntryPoint(401)·AccessDeniedHandler(403)가 응답해요. 경로 규칙은 위에서부터 처음 맞는 것이 적용돼요.

Spring Security는 요청이 컨트롤러에 닿기 전에 서블릿 필터(servlet filter) 묶음에서 인증·인가를 처리한다. SecurityFilterChain 빈으로 어떤 경로를 열고 막을지 선언한다.

  • 프런트 비유: Express 미들웨어 체인과 닮았다. 다만 필터 순서가 프레임워크에 정해져 있고, 내 필터는 기존 필터 앞뒤에 끼운다(addFilterBefore)
  • 토큰 방식은 JWT 검증 필터를 끼우고, 세션 방식은 세션에 인증 정보를 둔다
  • 인증(authentication) 실패(누구인지 모름)는 401, 인가(authorization) 실패(권한 없음)는 403이다
  • CORS(Cross-Origin Resource Sharing) 처리도 필터 단계에서 일어나므로, Security를 붙인 뒤에는 preflight 요청을 따로 확인한다

설정 방식의 변화

예전에는 WebSecurityConfigurerAdapter를 상속해 설정했지만, 5.7에서 deprecated되고 6에서 제거됐다. 지금은 SecurityFilterChain 빈을 등록한다. 경로 지정도 antMatchers·mvcMatchers 대신 requestMatchers를 쓴다(2026 기준).

@Bean
SecurityFilterChain security(HttpSecurity http) throws Exception {
    return http
        .authorizeHttpRequests(auth -> auth
            .requestMatchers("/public/**", "/actuator/health").permitAll()
            .requestMatchers("/admin/**").hasRole("ADMIN")
            .anyRequest().authenticated())
        .formLogin(Customizer.withDefaults())
        .build();
}
  • permitAll은 공개 경로, denyAll은 코드를 지우지 않고 막아 둘 때, authenticated는 로그인 필요
  • 패턴은 위에서부터 처음 맞는 규칙이 적용되므로 구체적인 경로를 먼저 쓴다
  • InMemoryUserDetailsManager나 spring.security.user.* 속성으로 만든 사용자는 PoC(Proof of Concept)용이다. 운영에서는 DB·LDAP(Lightweight Directory Access Protocol)·OAuth2 서버로 인증한다
  • 직접 인증 로직이 필요하면 AuthenticationProvider를 구현해 authenticate·supports를 채운다. 비밀번호 비교는 PasswordEncoder에 맡긴다(비밀번호 저장: 인코딩·암호화·해싱)
  • 상태를 바꾸는 요청에는 CSRF 보호가 기본으로 켜져 있다. 끌 때는 쿠키 인증을 쓰지 않는지 먼저 확인한다
  • 필터에서 난 인증·인가 실패는 스프링 전역 예외 처리까지 가지 않는다. AuthenticationEntryPoint·AccessDeniedHandler가 응답을 만든다(인증과 인가)
flowchart TD
  R[요청] --> F["필터 체인 (인증 · 인가)"]
  F -->|통과| C[컨트롤러]
  F -->|"인증 실패 → AuthenticationEntryPoint"| E[401]
  F -->|"인가 실패 → AccessDeniedHandler"| D[403]

책: 9장. 보안의 기초 — 필터체인

출처: Spring Security 문서: SecurityFilterChain · Security Filters · Authorize HttpServletRequests

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • Bean Validation

    Bean Validation은 객체 필드에 제약 어노테이션(constraint annotation)을 붙여 입력을 검증하는 자바 표준이다(Jakarta Validation, 구현체는 Hibernate Validator). 스프링은 컨트롤러 파라미터에 @Valid가 붙으면 바인딩 직후 검증을 실행한다.

  • 스프링 부트 자동 설정

    스프링 부트는 스프링 앱을 만들 때 반복되던 설정(의존성 버전 맞추기, 서블릿 컨테이너 연결, 배포)을 관례(convention over configuration)로 대신해 주는 도구다. 클래스패스(classpath)에 무엇이 있는지 보고 필요한 빈을 자동으로 등록하고, 웹 서버를 내장해 java -jar 하나로 실행된다.

  • 스프링 REST 컨트롤러

    @RestController는 메서드의 반환값을 뷰 이름이 아니라 HTTP 응답 본문(보통 JSON)으로 쓰는 컨트롤러다. @Controller에 @ResponseBody를 합친 것으로, 직렬화(serialization)는 Jackson이 맡는다.

  • DRF 필터·검색·정렬

    DRF의 목록 API는 쿼리 파라미터로 결과를 좁히는 세 가지 장치를 붙일 수 있다. 값이 정확히 맞는 것만 고르는 필터, 일부 문자열로 찾는 검색, 순서를 바꾸는 정렬이다. 모두 제네릭 뷰(GenericAPIView 계열)의 filter_backends로 적용된다.

보기 옵션