1. 사전 지식 : 스프링 시큐리티


스프링 시큐리티는 스프링 기반의 애플리케이션 보안(인증, 인가, 권한)을 담당하는 스프링 하위 프레임워크이다.

인증과 인가

[인증]

인증(Authentication)은 사용자의 신원을 입증하는 과정이다. 예를 들어 사용자가 사이트에 로그인 할 때 누구인지 확인하는 과정을 인증이라고 한다.

[인가]

인가(authorization)은 인증과는 다르다. 인가는 사이트의 특정 부분에 접근할 수 있는지 권한을 확인하는 작업이다. 예를 들어 관리자는 관리자 페이지에 들어갈 수 있지만 일반 사용자는 그렇지 않다. 이런 권한 확인 과정을 인가라고 한다.

[스프링 시큐리티]

인증과 인가 관련 코드를 아무런 도구의 도움 없이 작성하려면 많은 시간이 필요한데 스프링 시큐리티를 이용하면 쉽게 처리가 가능하다.

스프링 시큐리티는 보안을 담당하는 스프링 하위 프레임워크이다. CSRF 공격, 세션 공격을 방어해주고, 요청 헤더도 보안처리 해주므로 개발자가 보완 관련 개발을 해야하는 부담을 크게 줄여준다.

필터 기반으로 동작하는 스프링 시큐리티

스프링 시큐리티는 필터 기반으로 동작한다. 시큐리티 필터에 대해 알아보자.

필터 설명
SecurityContextPersitenceFilter SecurtyContextRepository에서 SecurityContext(접근 주체와 인증에 대한 정보를 담고 있는 객체)를 가져오거나 저장하는 역할을 한다.
LogoutFilter 설정된 로그아웃 URL로 오는 요청을 확인해 해당 사용자를 로그아웃 처리한다.
UsernamePasswordAuthenticationFilter 인증 관리자이다. 폼 기반 로그인을 할 때 사용되는 필터로 아이디, 패스워드 데이터를 파싱해 인증 요청을 위임한다. 인증이 성공하면 AuthenticationSuccessHandler를, 인증에 실패하면 AuthenticationFailureHandler를 실행한다.
DefaultLoginPageGeneratingFilter 사용자가 로그인 페이지를 따로 지정하지 않았을 때 기본으로 설정하는 로그인 페이지 관련 필터이다.
BasicAuthenticationFilter 요청 헤더에 있는 아이디와 패스워드를 파싱해서 인증 요청을 위임한다. 인증이 성공하면 AuthenticationSuccessHandler를, 인증에 실패하면 AuthenticationFailureHandler를 실행한다.
RequestCacheAwareFilter 로그인 성공 후, 관련 있는 캐시 요청이 있는지 확인하고 캐시 요청 처리를 해준다. 예를 들어 로그인하지 않은 상태로 방문했던 페이지를 기억해두었다가 로그인 이후에 그 페이지로 이동시켜준다.
SecurityContextHolderAwareRequestFilter HttpServletRequest 정보를 감싼다. 필터 체인 상의 다음 필터들에게 부가 정보를 제공하기 위해 사용한다.
AnonymousAuthenticationFilter 필터가 호출되는 시점까지 인증되지 않았다면 익명 사용자 전용 객체인 Anonymous Authentication을 만들어 SecurityContext에 넣어준다.
SessionManagementFilter 인증된 사용자와 관련된 세션 관련 작업을 진행한다. 세션 변조 방지 전력을 설정하고, 유효하지 않은 세션에 대한 처리를 하고, 세션 생성 전략을 세우는 등의 작업을 처리한다.
ExceptionTranslationFilter 요청을 처리하는 중에 발생할 수 있는 예외를 위임하거나 전달한다.
FilterSecurityInterceptor 접근 결정 관리자이다. AccessDecisionManager로 권한 부여 처리를 위임함으로써 접근 제어 결정을 쉽게 해준다. 이 과정에서는 이미 사용자가 인증되어 있으므로 유효한 사용자인지도 알 수 있다. 즉, 인가 관련 설정을 할 수 있다.

시큐리티는 위에서 살펴본 필터 순서대로 거친다.