SEB_BE 63일차 - Spring Security 기본3

subimm_·2022년 11월 23일
0

코드스테이츠

목록 보기
63/83

💡 오늘의 학습목표

  • Spring Security의 웹 요청 처리 흐름
  • Spring Security 인증 구성요소 이해
  • Spring Security 권한 부여 구성요소 이해

📔 Spring Security의 웹 요청 처리 흐름

📖 보안이 적용된 웹 요청의 일반적인 처리 흐름

  • (1) 사용자가 보호된 리소스 요청
  • (2) 인증 관리자 역할을 하는 컴포넌트가 사용자의 크리덴셜 요청
    • 크리덴셜 : 해당 사용자를 증명하기 위한 구체적인 수단 (일반적으로 사용자의 패스워드)
  • (3) 사용자는 인증 관리자에게 크리덴셜 제공
  • (4) 인증 관리자는 크리덴셜 저장소에서 크리덴셜을 조회
  • (5) 인증 관리자는 사용자가 제공한 크리덴셜과 저장소에 저장된 것을 비교해 검증 작업 수행
  • (6) 유효한 크리덴셜이 아니면 예외를 던진다.
  • (7) 유효한 크리덴셜이면 (8)에서 접근 결정 관리자 역할을 하는 컴포넌트는 사용자가 적절한 권한을 부여받았는지 검증
  • (9) 적절한 권한을 부여 받지 못한 사용자라면 예외 던지기
  • (10) 적절한 권한을 부여 받은 사용자라면 보호된 리소스의 접근 허용

📖 웹 요청에서의 서블릿 필터와 필터 체인의 역할

  • 서블릿 기반 애플리케이션일 경우, 엔드포인트에 요청이 도달하기 전에 중간에서 요청을 가로채 어떤 처리를 할 수 있는 포인트를 제공하는데 그것을 서블릿 필터 라고 한다.

    • 서블릿 필터는 자바에서 제공하는 API
      javax.servlet.Filter 인터페이스를 구현한 서블릿 필터는 웹 요청을 가로채어 전처리를 할 수 있으며, 엔드포인트에서 전달되는 응답을 클라이언트에게 전달 하기 전 후처리를 할 수 있다.
  • 서블릿 필터는 하나 이상의 필터들을 연결하여 필터 체인을 구성할 수 있다.

  • 디스패쳐서블릿에 클라이언트의 요청이 전달되기 전에 필터 체인을 구성한 예.

  • 서블릿 필터는 각각의 필터들이 doFilter()라는 메서드를 구현해야 하며, doFilter() 메서드 호출을 통해 필터 체인을 형성

📖 Spring Security에서의 필터 역할

  • Spring Security에서 사용하는 필터는 보안과 관련된 작업을 추가한다.
  • 서블릿 필터에 Spring Security Filter가 추가된 모습
  • DelegatingFilterProxyFilterChainProxy 클래스는 Filter 인터페이스를 구현하므로 엄연한 서블릿 필터 역할을 한다. (조금 특별한 필터)

⭐ DelegatingFilterProxy

  • Spring Security 역시 Spring의 핵심인 ApplicationContext 를 이용한다.
  • 서블릿 필터와 연결되는 Spring Security 만의 필터를 ApplicationContext에 Bean으로 등록한 후에 이 Bean들을 이용해서 보안과 관련된 여러가지 작업들을 처리하게 된다. DelegatingFilterProxy 가 Bean으로 등록된 Spring Security의 필터를 사용하는 시작점이라고 생각하면 된다.
  • 서블릿 컨테이너 영역의 필터와 ApplicationContext에 Bean으로 등록된 필터들을 연결해주는 브릿지 역할을 한다.
  • FilterChainProxy의 역할

⭐ FilterChainProxy

  • Spring Security의 필터를 사용하기 위한 진입점
  • FilterChainProxy 부터 Spring Security에서 제공하는 보안 필터들이 필요한 작업을 수행한다.
  • URL 별로 여러개 등록 가능, 필터 체인이 있을때 어떤 것을 사용할 지 FilterChainProxy가 결정하며 가장 먼저 매칭된 필터 체인을 실행한다.
    ex)
    • /api/** 패턴의 Filter Chain이 있고, /api/message URL 요청이 전송하는 경우
      • /api/** 패턴과 제일 먼저 매칭되므로 디폴트 패턴인 /**도 일치하나 가장 먼저 매칭되는 /api/** 패턴과 일치하는 필터 체인만 실행한다.
    • /message/** 패턴의 필터 체인이 없는데 /message/ URL 요청 전송하는 경우
      • 매칭되는 필터 체인이 없으므로 디폴트 패턴인 /** 패턴의 필터 체인을 실행

📔 Spring Security 인증 구성요소 이해

📖 Spring Security의 컴포넌트로 보는 인증(Authentication) 처리 흐름

  • (1) 사용자가 로그인 폼 등을 이용해 Username과 Password를 포함한 request를 Spring Security가 적용된 애플리케이션에 전송
    사용자의 요청이 Filter Chain까지 들어오면 필터들 중에서 UsernamePasswordAuthenticationFilter가 해당 요청 받는다.

  • 요청을 전달 받은 필터는 Username과 Password를 이용해 (2)와 같이 UsernamePasswordAuthenticationToken을 생성

    • Authentication 인터페이스를 구현한 구현 클래스이면 여기서 Authentication은 아직 인증이 되지 않음
  • 아직 인증되지 않은 Authentication을 가지고 있는 UsernamePasswordAuthenticationFilter는 (3)과 같이 해당 Authentication을 AuthenticationManager에게 전달

    • 인증 처리를 총괄하는 매니저 역할을 하는 인터페이스, AuthenticationManager를 구현한 구현 클래스가 ProviderManager 이다.
    • 즉, ProviderManager가 인증이라는 작업을 총괄하는 실질적인 매니저
  • (4) ProviderManager로부터 Authentication을 전달 받은 AuthenticationProvider는 (5)와 같이 UserDetailsService를 이용해 UserDetails를 조회

    • UserDetails는 데이터베이스 등의 저장소에 저장된 사용자의 Username과 사용자의 자격을 증명해주는 크리덴셜인 Password, 사용자의 권한 정보를 포함하고 있는 컴포넌트
    • UserDetails를 제공하는 컴포넌트가 바로 UserDetailsService 이다.
  • UserDetailsService 는 (5)에서 처럼 사용자의 크리덴셜을 초함한 사용자의 정보 조회

  • 저장소에서 조회한 사용자의 크리덴셜을 포함한 사용자의 정보를 기반으로 (7)과 같이 UserDetails를 생성한 후, 생성된 것을 다시 (8) AuthenticationProvider 에게 전달

  • UserDetails를 전달 받은 AuthenticationProvider 는 PasswordEncoder를 이용하여 UserDetails에 포함된 암호화 된 Password와 인증을 위한 Authentication 안에 포함된 Password가 일치하는지 검증

    • (9) 검증 성공하면 UserDetails를 이용하여 인증된 Authentication 생성
    • 검증에 성공하지 못하면 예외를 발생시키고 인증 처리 중단
  • AuthenticationProvider는 인증된 Aithentication을 ProviderManager에게 전달(10)

    • (2)에서의 Authentication은 인증을 위해 필요한 사용자의 로그인 정보를 가지지만,
      이 단계에서의 Authentication은 인증에 성공한 사용자의 정보 (Principal, Credential, GrantedAuthorities)를 가지고 있다.
  • ProviderManager는 (11)과 같이 인증된 Authentication을 다시 UsernamePasswordAuthenticationFilter에게 전달한다.

  • (12)와 같이 SecurityContextHolder를 이용해 SecurityContext에 인증된 Authentication을 저장한다.

    • 이후에 Spring Security의 세션 정책에 따라서 HttpSession에 저장되어 사용자의 인증 상태를 유지하기도 하고, 무상태를 유지하기도 한다.

📖 Spring Security의 권한 부여 처리 흐름

  • 사용자가 로그인 인증에 성공한 이후, 인증된 사용자에게 권한을 부여하는 처리 흐름
  • Spring Security Filter Chain에서 URL을 통해 사용자의 액세스를 제한하는 권한 부여 Filter는 AuthorizationFilter 이다.
  • AuthorizationFilter 는 (1) 과 같이 SecurityContextHolder로부터 Authentication을 획득
  • 그리고 (2)와 같이 획득한 Authentication과 HttpservletRequest를 AuthorizationManager에게 전달한다.
  • AuthorizationManager는 권한 부여 처리를 총괄하는 매니저 역할을 하는 인터페이스
    RequestMatcherDelegationgAuthorizationManagerAuthorizationManager를 구현하는 구현체 중 하나로 RequestMatcher 평가식을 기반으로 해당 평가식에 매치되는 AuthorizationManager 에게 권한 부여 처리를 위임하는 역할을 한다.
  • RequestMatcherDelegationgAuthorizationManager 내부에서 매치되는 AuthorizationManager 구현 클래스가 있다면 해당 구현 클래스가 사용자의 권한을 체크 (3)
  • 적절한 권한이면 (4) 와 같이 요청 프로세스를 이어간다.
  • 적절한 권한이 아니라면 (5)처럼 AccessDeniedException이 throw되고 ExceptionTranslationFilter가 예외를 처리하게 된다.
profile
코린이의 공부 일지

0개의 댓글