Spring Security

JiMin LEE·2022년 11월 17일
0

로그인

목록 보기
7/7

1️⃣ 스프링 시큐리티란?

  • 스프링 기반의 애플리케이션의 보안을 담당하는 스프링 하위 프레임워크
  • 인증(Authenticate, 누구인지?) 과 인가(Authorize, 어떤것을 할 수 있는지?)를 담당하는 프레임워크
  • 서블릿 필터(filter)와 이들로 구성된 필터체인으로의 구성된 위임모델을 사용한다.
  • 보안과 관련해서 체계적으로 많은 옵션을 제공해주기 때문에 개발자 입장에서는 일일이 보안관련 로직을 작성하지 않아도 된다.

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

비밀번호 (Credential) : 대상에 접근하는 유저의 비밀번호

💡 서블릿(servlet) 필터

  • 사용자의 요청이 서블릿에 전달되기 전, 스프링 시큐리티는 필터의 생명주기를 이용해서 인증과 권한 작업을 수행한다.
  • 서블릿 컨테이너는 스프링 컨테이너에 등록된 빈을 인식할 수 없다.
  • 스프링 시큐리티에서는 DelegatingFilterProxy라는 서블릿 필터의 구현체를 제공한다.
  • DelegatingFilterProxy 는 서블릿 매커니즘으로 서블릿의 필터로 등록될 수 있으며, 스프링에 등록된 빈을 가져와서 의존성을 주입할 수도 있다.
    → 서블릿 컨테이너의 생명주기와 스프링의 ApplicationContext 사이를 연결하는 다리 역할

2️⃣ 스프링 시큐리티 특성

  • 보안과 관련하여 체계적으로 많은 옵션을 제공한다.
  • Filter 기반으로 동작하여 MVC와 분리하여 관리 및 동작
  • 어노테이션을 통한 간단한 설정
  • Spring Security는 기본적으로 세션 & 쿠키방식으로 인증
  • 인증 관리자는 UsenamePasswordAuthenticationFilter,
    접근 결정 관리자는 FilterSecurityInterceptor가 수행한다.

3️⃣ 스프링 시큐리티 구조

  • SecurityContextPersistenceFilter :SecurityContextRepository에서 SecurityContext를 로드하고 저장하는 일을 담당함
  • LogoutFilter

    : 로그아웃 URL로 지정된 가상URL에 대한 요청을 감시하고 매칭되는 요청이 있으면 사용자를 로그아웃시킴

  • UsernamePasswordAuthenticationFilter

    : 사용자명과 비밀번호로 이뤄진 폼기반 인증에 사용하는 가상 URL요청을 감시하고 요청이 있으면 사용자의 인증을 진행함

  • DefaultLoginPageGeneratingFilter

    : 폼기반 또는 OpenID 기반 인증에 사용하는 가상URL에 대한 요청을 감시하고 로그인 폼 기능을 수행하는데 필요한 HTML을 생성함

  • BasicAuthenticationFilter

    :HTTP 기본 인증 헤더를 감시하고 이를 처리함

  • RequestCacheAwareFilter

    : 로그인 성공 이후 인증 요청에 의해 가로채어진 사용자의 원래 요청을 재구성하는데 사용됨 SecurityContextHolderAwareRequestFilter HttpServletRequest를 HttpServletRequestWrapper를 상속하는 하위 클래스(SecurityContextHolderAwareRequestWrapper)로 감싸서 필터 체인상 하단에 위치한 요청 프로세서에 추가 컨텍스트를 제공함

  • AnonymousAuthenticationFilter

    : 이 필터가 호출되는 시점까지 사용자가 아직 인증을 받지 못했다면 요청 관련 인증 토큰에서 사용자가 익명 사용자로 나타나게 됨

  • SessionManagementFilter

    : 인증된 주체를 바탕으로 세션 트래킹을 처리해 단일 주체와 관련한 모든 세션들이 트래킹되도록 도움

  • ExceptionTranslationFilter

    : 이 필터는 보호된 요청을 처리하는 동안 발생할 수 있는 기대한 예외의 기본 라우팅과 위임을 처리함

  • FilterSecurityInterceptor

    : 이 필터는 권한부여와 관련한 결정을 AccessDecisionManager에게 위임해 권한부여 결정 및 접근 제어 결정을 쉽게 만들어 줌



4️⃣ 아키텍쳐

[Security] 스프링 시큐리티의 아키텍처(구조) 및 흐름

  1. 유저가 로그인 요청 (Http Request)
  2. AuthenticationFilter 에서 UsernamePasswordAuthentication Token 을 생성하여 AuthenticationManager 에 전달
  3. AuthenticationManager 은 등록된 AuthenticationProvider 들을 조회하여 인증 요구
  4. AuthenticationProvider 은 UserDetailService 를 통해 입력받은 아이디에 대한 사용자 정보를 User(DB) 에서 조회
  5. User 에 로그인 요청한 정보가 있는 경우 UserDetails 로 꺼내서 유저 session 생성
  6. 인증이 성공된 UsernameAuthenticationToken 을 생성하여 AuthenticationManager 로 반환
  7. AuthenticationManager 은 UsernameAuthenticationToken 을 AuthenticationFilter 로 전달
  8. AuthenticationFilter 은 전달받은 UsernameAuthentication 을 LoginSuccessHandler 로 전송하고, spring security 인메모리 세션저장소인 SecurityContextHolder 에 저장
  9. 유저에게 session ID 와 응답을 내려줌

0개의 댓글