Spring Security - 1( Filter들, 동작 구조)

EUNJI LEE·2023년 8월 5일
0

Spring

목록 보기
8/13
post-custom-banner

스프링 시큐리티(spring security)

스프링 시큐리티는 스프링 기반의 애플리케이션 보안을 담당하는 스프링의 하위 프레임워크다. 보안(인증, 인가, 권한)에 대한 많은 옵션을 제공하며 애너테이션으로 설정하기도 간편하다는 장점이 있다.

CSRF 공격(사용자 권한을 갖고 특정 동작을 유도), 세션 고정 공격(사용자 인증 정보 탈취 및 변조)을 방어할 수 있고 요청 헤더 또한 보안 처리를 해주기 때문에 개발자가 프로젝트 진행 시 보안에 대한 부담감을 줄이는데 크게 기여한다.

💡 인증, 인가
사용자의 신원을 입증하는 즉 로그인 과정을 인증이라고 하면 인가는 사이트의 관리자 페이지처럼 특정 권한을 확인하는 과정을 말한다.

STS에서 스프링 시큐리티를 사용하기 위해 프로젝트 생성시 Spring Security를 추가하거나 이미 작업 중이던 프로젝트라면 프로젝트 폴더 마우스 우클릭>Srping>Add Staters를 눌러서 Spring Security를 추가하도록 한다.

추가하면 pom.xml에서 위 사진의 해당 코드를 확인할 수 있고, JRE System Library를 확인해도 시큐리티 관련 자료 파일들이 들어가 있는 것을 확인할 수 있다.

스프링 시큐리티 필터들

SecurityContextPersistenceFilter

SecurityContextRepository에서 SecurityContext를 가져오거나 저장하는 역할을 한다. SecurityContext에는 접근 주체와 인증에 대한 정보를 담고 있다.

LogoutFilter

설정해둔 로그아웃 url에 요청을 확인하고 사용자를 로그아웃 처리하는 역할을 한다.

UsernamePasswordAuthenticationFilter

인증 관리자로 폼 기반 로그인을 사용할 때 사용되는 필터다. 필터로 아이디, 패스워드 데이터를 파싱하여 인증 요청을 위임하고 인증 성공 여부에 따라서 핸들러를 실행한다.

DefaultLoginPageGenerationFilter

개발자가 로그인 페이지를 따로 지정하지 않았을 때 기본적으로 설정하는 로그인 페이지에 관련된 필터이다. 스프링에서 로그인 페이지를 제공하므로 별도의 로그인 페이지를 만들지 않았다면 기본 로그인 페이지를 이용할 수 있다.

BasicAuthenticationFilter

요청 헤더에 있는 아이디와 패스워드를 파싱해서 인증 요청을 위임하는 필터다. 인증에 성공 여부에 따라 핸들러를 실행한다.

RequestCacheAwareFilter

로그인(인증)이 성공하면 관련 있는 캐시 요청이 있는지 확인하고 캐시 요청을 처리해주는 필터다. 로그인하지 않은 상태에서 방문했던 마지막 페이지를 기억해두었다가 로그인에 성공하면 해당 페이지로 이동시켜주는 등의 처리를 할 수 있다.

SecurityContextHolderAwareRequestFilter

HttpServletRequest 정보를 감싸고 있는 필터로 필터 체인 상의 다음 필터들에게 부가적인 정보를 제공하기 위해서 사용한다.

AnoymousAuthenticationFilter

필터가 호출되는 시점까지 인증이 되지 않았을 때 익명 사용자 객체(AnonymousAuthentication)를 만들어서 SecurityContext에 넣어주기 위해 사용되는 필터다.

SessionManagementFilter

인증된 사용자와 관련된 세션 작업을 실행할 때 사용하는 필터로 세션 변조 방지 전략에 대한 설정과 유효하지 않은 세션에 대한 처리, 세션 생성 전략을 세우는 등의 작업을 수행한다.

ExceptionTranslationFilter

요청 처리 중 발생하는 Exception을 위임하거나 전달하는 필터다.

FilterSecurityIntercetor

접근 결정 관리자 필터로 AccessDecisionManager애개 권한 부여 처리를 위임하여 접근 제어 결정을 쉽게 할 수 있도록 도와준다. 이미 사용자가 인증되어 있는 상태에서 사용하기 때문에 유효한 사용자인지 권한에 대한 확인을 한다.

스프링 시큐리티 동작 과정

스프링 시큐리티는 필터 기반으로 동작한다. 각 필터에서 인증, 인가와 관련된 작업들을 처리한다. 특정 필터를 제거 하거나 필터 뒤에 다른 필터를 넣는 설정도 가능하다.

스프링 시큐리티의 동작 과정은 위와 같다.

  1. 사용자가 인증에 필요한 정보(아이디, 패스워드)를 입력하면 HTTPServletRequest에 데이터가 전달된다. 이 때 AuthenticationFilter가 데이터의 유효성 검사를 실시한다.
  2. 유효성 검사를 한 뒤에 UsernamePasswordAuthenticationToken에 넘겨준다.
  3. 인증용 객체인 UsernamePasswordAuthenticationToken을 AuthenticationManager에게 보낸다.
  4. UsernamePasswordAuthenticationFilterToken을 AuthenticationProvier에게 보낸다.
  5. 이 중 사용자 아이디를 UserDetailService에 보내고 여기서 사용자 아이디를 가지고 찾은 정보를 UserDetails 객체로 만들어서 AuthenticationProvider에게 전달한다.
  6. DB에 있는 사용자 정보를 불러온다.
  7. 입력된 정보와 UserDetails의 정보를 비교해서 인증 처리를 진행한다.
  8. ~10. 까지 인증이 완료되고 나면 인증 여부에 따라 AuthenticationSuccessHandler, AuthenticationFilureHandler를 실행한다.

참고
Spring Security야! 일단 이론만 정리해보자고! -girgir 벨로그
서적 : 스프링 부트 3 백엔드 개발자 되기(자바 편)

profile
천천히 기록해보는 비비로그
post-custom-banner

0개의 댓글