ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring Security] 스프링 시큐리티 개념
    DEV/Spring 2020. 7. 15. 10:49

    1. Spring Security란?

    Spring Security는 Spring기반의 어플리케이션 보안(인증/권한)을 담당하는 프레임워크

     

    Spring Security는 보안과 관련해서 체계적으로 많은 옵션들을 지원해준다.

    Spring Security는 Filter기반으로 동작하기 때문에 Spring MVC와 분리되어 관리 및 동작한다.

    Spring Security 3.2부터 XML로 설정하지 않고 자바 config설정으로 간단하게 설정할 수 있다.

     

    * 짚고 넘어가는 보안 용어

    • 접근 주체(Principal) : 보호된 대상에 접근하는 유저
    • 인증(Authentication) : 인증은 '증명하다'라는 의미
      예를들어 유저 아이디와 비밀번호를 이용하여 로그인하는 과정을 말한다.
    • 인가(Authorization) : '권한부여'나 '허가'와 같은 의미
      즉, 어떤 대상이 특정 목정을 실현하도록 허용(Access)하는 것을 의미한다.
    • 권한 : 인증된 주체가 애플리케이션의 동작을 수행할 수 있도록 허락되었는지 결정할 때 사용

     

    2. Spring Security Filter

    그림 출처 : https://youmekko.github.io/2018/04/26/2018-04-26-Filter/ 

     

    클라이언트가 요청을 보내면 서블릿이나 JSP등이 처리하게 된다.

    Spring MVC에서 요청을 가장 먼저 받는 것이 DispatcherServlet이라고 했는데,

    이 DispatcherServlet이 요청받기 전에 다양한 필터들이 있을 수 있다.

     

    필터가 하는 역할은 클라이언트와 자원 사이에서 요청과 응답정보를 이용해 다양한 처리를 하는데에 목적이 있다.

    어떤 필터는 요청을 받은 후, 클라이언트가 원래 요청한 자원이 아닌 다른 자원으로 리다이렉트 시킬 수도 있고,

    어떤 필터는 다음 필터에게 요청과 응답을 전달하지 않고 바로 클라이언트에게 응답하고 끝낼 수도 있다.

     

    Spring Security는 다양한 기능을 가진 필터들을 10개이상 기본적으로 제공해준다.

    이렇게 제공되는 필터들을 Security Filter Chain이라고 말한다.

    그림출처 : https://atin.tistory.com/590

    Security Filter Chain과 각각의 필터에서 사용하는 객체들(Repository, Handler, Manager등)에 대해 잘 표현하고 있다.

     

    * Filter들의 역할

    • SecurityContextPersistenceFilter : SecurityContextRepository에서 SecurityContext를 가져오거나 저장하는 역할을 한다.
    • LogoutFilter : 설정된 로그아웃 URL로 오는 요청을 감시하며, 해당 유저를 로그아웃 처리
    • (UsernamePassword)AuthenticationFilter : (아이디와 비밀번호를 사용하는 form 기반 인증) 설정된 로그인 URL로 오는 요청을 감시하며, 유저 인증 처리
      1. AuthenticationManager를 통한 인증 실행
      2. 인증 성공 시, 얻은 Authentication 객체를 SecurityContext에 저장 후 AuthenticationSuccessHandler 실행
      3. 인증 실패 시, AuthenticationFailureHandler 실행
    • DefaultLoginPageGeneratingFilter : 인증을 위한 로그인폼 URL을 감시한다.
    • BasicAuthenticationFilter : HTTP 기본 인증 헤더를 감시하여 처리한다.
    • RequestCacheAwareFilter : 로그인 성공 후, 원래 요청 정보를 재구성하기 위해 사용된다.
    • SecurityContextHolderAwareRequestFilter : HttpServletRequestWrapper를 상속한 SecurityContextHolderAwareRequestWapper 클래스로 HttpServletRequest 정보를 감싼다.
      SecurityContextHolderAwareRequestWrapper 클래스는 필터 체인상의 다음필터들에게 부가정보를 제공한다.
    • AnonymousAuthenticationFilter : 이 필터가 호출되는 시점까지 사용자 정보가 인증되지 않았다면 인증토큰에 사용자가 익명 사용자로 나타난다.
    • SessionManagementFilter : 이 필터는 인증된 사용자와 관련된 모든 세션을 추적한다.
    • ExceptionTranslationFilter : 이 필터는 보호된 요청을 처리하는 중에 발생할 수 있는 예외를 위임하거나 전달하는 역할을 한다.
    • FilterSecurityInterceptor : 이 필터는 AccessDecisionManager 로 권한부여 처리를 위임함으로써 접근 제어 결정을 쉽게해준다.

     

    3. Spring Security 인증관련 아키텍처

    아이디와 암호를 입력했을 때 이를 처리하는 필터는 AutheticationFilter이다.

    해당 필터는 다음과 같은 순서로 동작한다.

    그림출처 : http://www.springbootdev.com

     

    그림 설명

    1. 클라이언트가 로그인을 시도
    2. AuthenticationFilter는 AuthenticationManager, AuthenticationProvider(s), UserDetailsService를 통해 DB에서 사용자 정보를 읽어온다. 여기서 중요한 것은 UserDetailsService가 인터페이스라는 것. 해당 인터페이스를 구현한 빈(Bean)을 생성하면 스프링 시큐리티는 해당 빈을 사용하게 된다. 즉, 어떤 데이터베이스로 부터 읽어들일지 스프링 시큐리티를 이용하는 개발자가 결정할 수 있게 된다.
    3. UserDetailsService는 로그인한 ID에 해당하는 정보를 DB에서 읽어들여 UserDetails를 구현한 객체로 반환. 프로그래머는 UserDetails를 구현한 객체를 만들어야 할 필요가 있을 수 있다. UserDetails정보를 세션에 저장.
    4. 스프링 시큐리티는 인메모리 세션저장소인 SecurityContextHolder 에 UserDetails정보를 저장.
    5. 클라이언트(유저)에게 session ID(JSESSION ID)와 함께 응답.
    6. 이후 요청에서는 요청 쿠키에서 JSESSION ID정보를 통해 이미 로그인 정보가 저장되어 있는 지 확인하고 이미 저장되어 있고 유효하면 인증 처리를 해주게 된다.

     

    출처 : 부스트코스 웹 백엔드 강의 - Spring Security 개요
    https://www.edwith.org/boostcourse-web-be/lecture/58997/

     

    [LECTURE] 1) Spring Security 개요 : edwith

    들어가기 전에 웹 어플리케이션을 기획하다 보면 로그인/로그아웃 등이 필요한 경우가 있습니다. 로그인/로그아웃 등은 어떻게 구현해야 할까요? 직접 세션(HttpSession)을 다룰... - 부스트코스

    www.edwith.org

     

    댓글

Designed by Tistory.