Spring Security란?

Hyeseong_M·2024년 2월 16일

Spring

목록 보기
1/3

지금까지의 주먹구구식 스프링 시큐리티 사용에서 벗어나고자, 스프링 시큐리티에 대해 자세하게 공부를 해보고자 합니다.

최신 버전인 스프링 시큐리티 6 버전을 기준으로 공부합니다.

Spring Security란?

스프링 프레임워크에서 인증(Authentication) 및 인가(Authorization), 권한 관리 등의 기능을 제공하는 프레임워크입니다.

스프링 시큐리티에서는 필터(Filter)와, 필터로 이루어진 필터 체인의 흐름에 따라 인증과 인가를 처리합니다.

용어 정리

  • 인증(Authnetication): 보호된 리소스에 접근한 대상에 대해 누구인지 확인하는 과정
  • 인가(Authorization): 해당 리소스에 대해 접근할 권한을 갖고있는지 확인하는 과정
  • 권한: 특정 리소스에 대한 접근 제한. 모든 리소스는 접근에 대한 제어 권한이 걸려있음. 인가 과정에서 해당 리소스에 제한된 권한을 가졌는지 확인함.
  • 접근 주체(Principal): 보호된 리소스에 접근하는 대상

Spring Security 특징

  • 보안과 관련된 다양한 로직과 커스텀 옵션을 사용할 수 있어, 보안 관련 로직을 직접 작성하지 않아도 됨.
  • Filter 기반 동작으로, MVC와 분리하여 관리 및 동작함.
  • 어노테이션을 통한 간단한 설정
  • 인증 관리자(Authentication Manager)와, 접근 결정 관리자(Access Decision Mananger)를 통해 사용자의 리소스 접근을 관리함.
  • 인증 관리자는 UsernamePasswordAuthenticationFilter, 접근 결정 관리자는 FilterSecurityInterceptor가 수행함.

Spring Security 구조

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

인증정보를 담는 객체

Principal

  • 인증 주체에 대한 정보를 담고있는 객체
  • Spring Security가 제공하는 인증정보의 한 부분이다.

Authentication

  • 실질적으로 인증정보를 담고있는 객체
  • Principal(내가 누구인지 / 로그인 ID에 해당하는 값), Credential(인증자격 / 비밀번호에 해당하는 값),
    Authorities(권한정보 / ROLE에 해당하는 값)의 세 객체로 구성되어있다.

SecurityContextHolder

  • 시큐리티가 최종적으로 제공하는 객체
  • SecurityContextHolderSecurityContext객체를 Thread-local로 제공하여, 같은 Thread에서는 매개로 주고받지 않아도 인증정보에 접근이 가능하다.

Spring Security동작 과정

Spring Security는 Dispatcher Servlet으로 가기 전에 요청을 가로 채 Filter에서 인증과 인가를 처리합니다.

  1. 사용자가 로그인 정보로 로그인 요청
  2. AuthenticationFilter가 정보를 인터셉트하여 UsernamePasswordAuthentication Token(Authentication 객체) 생성하여 AuthenticationManager에게 Authentication 객체를 전달.
  3. AuthenticationManager 인터페이스를 거쳐 AutheticationProvider에게 (2)의 정보 전달(Authentication 형태), 등록된 AuthenticationProvider를 조회하여 인증 요구
  4. AuthenticationProviderUserDetailsService를 통해 입력받은 (3)의 사용자 정보를 DB에서 조회
    • supports() 메소드를 통해 실행 가능한지 체크
    • authenticate() 메소드를 통해 DB에 저장된 이용자의 정보와 입력한 로그인 정보 비교
      • DB 이용자 정보: UserDetailsServiceloadUserByUsername() 메소드를 통해 불러옴
      • 입력 로그인 정보: (3)에서 받았던 Authentication 객체(UsernameAuthentication Token)
    • 일치하는 경우 Authentication 반환
  5. AuthenticationMangerAuthentication 객체를 AuthenticationFilter로 전달
  6. AuthenticationFilter는 전달받은 Authentication 객체를 LoginSuccessHandler로 전송하고 SecurityContextHolder에 담음
  7. 성공시 AuthenticationSuccessHandle, 실패기 AuthenticationFailureHandle 실행

참고자료

profile
Dev_Hyeseong

0개의 댓글