🙋‍♀️ Server

[Server] Spring Security가 뭐지?

수댕ʕت̫͡ʔ 2025. 1. 29. 22:00

프로젝트를 진행하면서 Spring boot를 이용해 로그인와 회원가입을 구현해야한다. 

여기서 Spring Security는 무엇이고 왜 사용하는지 공부해보자. 그 전에 인증과 인가라는 개념을 명확히 알고 넘어가보도록 하자.

 

🔊 인증과 인가

인증 (Authentication)

인증은 사용자의 신원을 확인하는 것이다. 사용자가 플랫폼에 로그인하면 이 사람이 누구인지 입증하는 것을 말한다.

 

인가 (Authorization)

반면에 인가는 인증과 다르게 이 사람의 권한을 확인하는 것이다. 특정 사용자가 관리자 권한을 가지고 있는지, 일반 사용자의 권리를 가지고 있는지 확인하는 것을 말한다.

 

이렇게 인증/인가를 간편하게 처리할 수 있도록 도와주는 것이 Spring Security이다!

 

✔ Spring Security란?

spring security는 스프링 기반의 인증, 인가, 권한을 담당하는 프레임워크이다. 보안과 관련된 기능을 쉽게 구현하고, 사용자가 안전하게 서비스를 이용할 수 있게 한다.

 

📌 Spring Security 필터 구조

Spring Security는 기본적으로 필터를 기반으로 동작한다. 필터를 커스텀할 수도 있고, 기존 필터를 제거할 수도있다. 그리고 이런한 필터를 Bean으로 등록할 수도 있다.

 

📑 FilterChain을 통한 요청 처리 흐름

Spring Security는 서블릿 필터 체인을 통해 작동하는 체인 기반 보안 구조를 가지고 있다. 

 

공식 문서를 살펴보면 클라이언트가 특정 요청을 보낼 때 FilterChain을 통해서 필요한 인증, 인가를 처리한다는 것을 알 수 있다. 이 체인을 사용해 다양한 보안 기능을 순차적으로 적용한다. 

 

만약 클라이언트가 로그인 요청을 한다고 생각해보자. 그러면 서블릿 컨테이너에서 요청을 받고 FilterChainProxy에 전달된다. 그리고 FilterChain의 각 필터들이 순차적으로 요청을 처리한다. 모든 보안 필터를 통과하면 최종적으로 서블릿에 도달하게 된다.

 

그리고 그 응답은 다시 서블릿 -> 필터체인 -> 클라이언트로 전달된다.

 

 

🤔 조금 더 깊숙히 생각을 해보자.

클라이언트가 API 요청을 보낸다고 가정하면

 

  1. FilterChain을 통해 필터들을 순차적으로 거친다
  2. Filter0 을 거친다. 여기서 Filter0은 Spring Security와 관련이 없는 서블릿 컨테이너에 등록된 필터이다.
  3. 그 후 DelegatingFilterProxy를 통해 FilterChainProxy를 호출한다. 여기에는 Spring Security 필터 체인을 포함하고있는데 이는 다양한 보안 필터로 구성되어있다.
  4. 그리고 Filter2를 거쳐 서블릿으로 요청이 전달된다.

 

 

 

만약에 Spring Security의 필터 체인을 거치고 싶지 않다면, ""permitAll()""을 통해서 특정 경로는 이 필터를 지나가지 않도록 설정할 수도 있다.

http
    .authorizeHttpRequests(auth -> auth
        .requestMatchers("/public/**").permitAll() // 인증/인가 필요 없음
        .anyRequest().authenticated() // 그 외에는 인증 필요
    );

 

📚 주요한 보안 필터들

필터 역할
SecurityContextPersistenceFilter SecurityContextRepository에서 기존 인증 정보를 불러오고 저장한다.
LogoutFilter 설정된 로그아웃 URL로 오는 요청을 확인하고 사용자를 로그아웃 처리한다.
UsernamePasswordAuthenticationFilter 폼 로그인(Form-based login)을 처리하며, 인증 성공 시 AuthenticationSuccessHandler를, 실패 시 AuthenticationFailureHandler를 실행한다.
DefaultLoginPageGeneratingFilter 커스텀 로그인 페이지를 설정하지 않았을 경우 기본 로그인 페이지를 자동으로 생성한다.
BasicAuthenticationFilter 요청 헤더의 아이디와 비밀번호를 파싱하여 인증 요청을 처리한다.
RequestCacheAwareFilter 로그인 성공 후 캐시된 요청을 처리하여, 원래 요청한 페이지로 이동할 수 있도록 한다.
SecurityContextHolderAwareRequestFilter HttpServletRequest를 래핑하여 SecurityContext에 저장된 인증 정보를 쉽게 사용할 수 있게 해준다.
AnonymousAuthenticationFilter 인증되지 않은 사용자를 익명 사용자(AnonymousUser)로 설정하여, null 인증 객체를 방지한다.
SessionManagementFilter 세션 정책 관리중복 로그인 제어, 세션 고정 보호(Session Fixation Protection) 기능을 제공한다.
ExceptionTranslationFilter 요청 처리 중 발생할 수 있는 예외를 위임하거나 적절히 처리한다.
FilterSecurityInterceptor 접근 결정 관리자(AccessDecisionManager)로, 요청에 대한 최종 권한 검증을 수행하며, 권한이 없을 경우 403 Forbidden을 반환한다.

 

참고로 FilterChainProxy는 Security Filter Chain을 통해 특정 url에 맞는 필터를 자동으로 적용시킨다.

 

스프링 시큐리티는 공부할 내용이 많은 것 같다!🤣