본문 바로가기
백엔드

[Spring Boot] Spring Security 기본 필터 살펴보기

by 육빔 2024. 8. 22.
728x90
반응형

이번에는 시큐리티 제공 필터에 대해 알아보자.

 

DisableEncodeUrlFilter
URL로 간주되지 않는 부분을 포함하지 않도록 설정

WebAsyncManagerIntegrationFilter
비동기로 처리되는 작업에 대해 알맞은 시큐리티 컨텍스트(세션)을 적용

SecurityContextHolderFilter
접근한 유저에 대해 시큐리티 컨텍스트 관리

HeaderWriterFilter
보안을 위한 응답 헤더 추가 (X-Frame-Options, X-XSS-Protection and X-Content-Type-Options)

CorsFilter
CORS 설정 필터

CsrfFilter
CSRF 방어 필터

LogoutFilter
로그아웃 요청 처리 시작점 GET : “/logout”

UsernamePasswordAuthenticationFilter
username/password 기반 로그인 처리 시작점 POST : “/login”

DefaultLoginPageGeneratingFilter
기본 로그인 페이지 생성 GET : “/login”

DefaultLogoutPageGeneratingFilter
기본 로그아웃 페이지 생성 GET : “/logout”

BasicAuthenticationFilter
http basic 기반 로그인 처리 시작점

RequestCacheAwareFilter
이전 요청 정보가 존재하면 처리 후 현재 요청 판단

SecurityContextHolderAwareRequestFilter
ServletRequest에 서블릿 API 보안을 구현

AnonymousAuthenticationFilter
최초 접속으로 인증 정보가 없고, 인증을 하지 않았을 경우 세션에 익명 사용자 설정

ExceptionTranslationFilter
인증 및 접근 예외에 대한 처리

AuthorizationFilter
경로 및 권한별 인가 (구. filterSecurityIntercepter)

 

 

커스텀 필터 등록하는 방법.

//특정필터이전
http
        .addFilterBefore(추가할필터, 기존필터.class);

//특정필터위치
http
        .addFilterAt(추가할필터, 기존필터.class);

//특정필터이후
http
        .addFilterAfter(추가할필터, 기존필터.class);

 

이렇게 SecurityFilterChain의 필터가 작업을 진행하면서 앞에서 한 작업을 알기 위한 저장소 개념이 필요하다. 그래서 SecurityContextJoler라는 Authentication 안에 저장되며 N개의 SecurityContext는 하나의 SecurityContextHolder에 의해서 관리된다.

 

securityContextHolder은 static이라 어디서든 접근 가능할 수 있다. 또한 ThreadLocal 방식으로 SecurityContext를 호출하기에 각각의 유저는 동시에 시큐리티 로그인 로직을 사용할 수 있다.

 

ThreadLocal의 개념

  • ThreadLocal은 자바에서 제공하는 클래스로, 각 스레드가 독립적인 변수를 가질 수 있도록 합니다. 즉, 동일한 변수를 여러 스레드에서 접근하더라도 서로 다른 값을 가지게 됩니다.
  • 스레드마다 고유한 컨텍스트 정보를 저장하고, 해당 스레드에서 실행되는 코드가 언제든지 이 정보를 읽고 쓸 수 있게 합니다.

주의 사항

  • 비동기 작업: 기본적으로 ThreadLocal은 하나의 스레드 내에서 동작하지만, 비동기 작업에서는 스레드가 달라질 수 있으므로, 인증 정보를 명시적으로 전달해야 할 수 있습니다.
  • 클린업: 요청이 끝난 후 ThreadLocal에 저장된 정보를 제대로 정리하지 않으면 메모리 누수(memory leak)나 다른 요청 간의 정보 공유 문제가 발생할 수 있습니다. 따라서 요청 종료 시 SecurityContextHolder.clearContext()가 중요합니다.

 

톰켓 WAS는 멀티 쓰레드 방식으로 동작한다. 유저가 접속하면 위같은 방식으로 하나의 쓰레드를 할당한다.

 

사용처 

 

로그아웃 필터 : 로그아웃 로직을 수행하면서 SecurityContext의 Authentication 객체를 비움

로그인 필터 : 인증을 완료한 뒤 유저 정보를 담은 Authentication 객체를 넣음

 

각각의 필터는 서블릿 Filter 인터페이스, GenericFilterBean 추상클래스로 상속되어 있으며 크게 종류는 2가지이다.

 

GenericFilterBeanOncePerRequestFilter로 구분되는 필터 클래스인데, 둘 다 javax.servlet.Filter 인터페이스를 구현하고 요청을 처리하는 데 사용된다. 둘 다 역할은 비슷하지만 아래와 같은 차이점이 있다.

 

  • 중복 실행 방지: OncePerRequestFilter는 요청당 한 번만 실행되도록 보장하지만, GenericFilterBean은 그런 제한이 없어서 요청 처리 중 여러 번 호출될 수 있습니다.
  • 사용 목적: GenericFilterBean은 일반적인 필터 구현을 위한 기본 클래스인 반면, OncePerRequestFilter는 중복 실행을 방지해야 할 때 사용됩니다.
  • 상속과 구현의 용이성: OncePerRequestFilter는 doFilterInternal() 메서드를 오버라이드해야 하는 반면, GenericFilterBean은 doFilter() 메서드를 오버라이드하여 사용합니다.

ref

https://www.devyummi.com/

 

개발자 유미 | 커뮤니티

 

www.devyummi.com

 

728x90
반응형