[Spring] 스프링 시큐리티

김나우·2022년 5월 29일
0

Spring

목록 보기
11/13

스프링 시큐리티란?

스프링 시큐리티는 스프링 기반의 애플리케이션과 보안(인증과 권한, 인가)을 담당하는

스프링 하위 프레임워크다, 즉 인증(Authenticate, 누구인지?)인가(Authorize, 어떤것을 할수 있는지?) 를 담당하는 프레임워크를 말한다.

스프링 시큐리티에서는 주로 서블릿 필터와 이들로 구성된 필터체인으로 구성된 위임모델을 사용한다.

그리고 보안과 관련해서 체계적으로 많은 옵션을 제공해주기 때문에 개발자 입장에서는 일일이
보안관련 로직을 작성하지 않아도 된다는 장점이 있다.

기본용어

  • 접근 주체(Principal) : 보호된 리소스에 접근하는 대상

  • 인증(Authentication) : 보호된 리소스에 접근한 대상에 대해 누구인지, 애플리케이션의 작업을 수행해도 되는 주체인지 확인하는 과정, 즉 누구인지?(Who?)

  • 인가(Authorize) : 해당 리소스에 대해 접근 가능한 권한을 가지고 있는지 확인하는 과정 -> 즉 어떤것을 할 수 있는지?(Can?)

  • 권한 : 어떠한 리소스에 대한 접근 제한, 모든 리소스는 접근 제어 권한이 걸려있음.
    인가 과정에서 해당 리소스에 대한 제한된 최소한의 권한을 가졌는지 확인

스프링 시큐리티 특징과 구조

  • 보안과 관련하여 체계적으로 많은 옵션을 제공하여 편리하게 사용할 수 있음
  • Filter 기반으로 동작하여 MVC와 분리하여 관리 및 동작
  • 어노테이션을 통한 간단한 설정
  • Spring Security는 기본적으로 세선 & 쿠키방식으로 인증

  • 인증관리자(Authentication Manager)접근 결정 관리자(Access Decision Manager)를 통해 사용자의 리소스 접근을 관리

  • 인증 관리자는 UsernamePasswordAuthenticationFilter,
    접근 관리자는 FilterSecurityInterCeptor가 수행

스프링 시큐리티 기본구조

각 필터별 기능 설명

필터기능
SecurityContextPersistenceFilterSecurityContextRepository에서 SecurityContext를 로드하고 저장하는 일을 담당
LogoutFilter로그아웃 URL로 지정된 가상URL에 대한 요청을 감시하고 매칭되는 요청이 있으면 사용자를 로그아웃 시킴
UsernamePasswordAuthenticationFIlter사용자명과 비밀번호로 이뤄진 폼 기반 인증에 사용하는 가상 URL요청을 감시하고 요청이 있으면 사용자의 인증을 진행함
DefaultLoginPageGeneratingFilter폼기반/OpenID기반 인증에 사용하는 가상 URL에 대한 요청을 감시하고 로그인 폼 기능을 수행하는데 필요한 HTML을 생성
BasicAuthenticationFilterHTTP 기본 인증 헤더를 감시하고 이를 처리함
RequestCacheAwareFilter로그인 성공 이후 인증 요청에 의해 가로채어진 사용자의 원래 요청을 재구성하는데 사용
AnonymousAuthenticationFilter이 필터가 호출되는 시점까지 사용자가 아직 인증을 받지 못했다면 요청 관련 인증 토큰에서 사용자가 익명 사용자로 나타가게 됨
SessionManagementFilter인증된 주체를 바탕으로 세션 트래킹을 처리해 단일 주체와 관련한 모든 세션들이 트래킹되도록 도움
ExceptionTranslationFilter이 필터는 보호된 요청을 처리하는 동안 발생할 수 있는 기대한 예외의 기본 라우팅과 위임을 처리함
FilterSecurityInterceptor이 필터는 권한부여와 관련한 결정을 AccessDecisionManager에게 위임해 권한부여 결정 및 접근 제어 결정을 쉽게 만들어 줌

스프링 시큐리티 작동 구조

스프링 시큐리티 사용 시 스프링은 DispatcherServlet 앞단에 Filter를 배치시켜서
요청을 가로챈다.

클라이언트에 접근 권한이 없다면 인증화면으로 자동 리다이렉트 시킨다.

시큐리티 필터

SpringSecurity는 기능별 필터의 집합으로 되어있고 그 필터의 종류도 매우 다양하다

하지만 중요한 것은 처리 순서에 있다.

클라이언트가 리소스를 요청할 때 접근 권한이 없는 경우 기본적으로 로그인 폼으로 보내게 되는데

그 역할을 하는 Filter가 UsernamePasswordAuthenticationFilter이다.

RestAPI 구조에서는 로그인 폼이 따로 존재하지 않으므로 인증 권한이 없다는 오류를

JSON 형태로 반환해줘야 한다. 따라서 UsernamePasswordAuthenticationFilter가 작동하기 전에 해당 처리를 해줘야 한다.

profile
안녕하세요

0개의 댓글