열심히 살아나갈 사람
article thumbnail
Published 2023. 11. 27. 21:23
Spring Security Java/Spring
728x90

스프링 시큐리티(Spring Security)란 무엇인가?

스프링 시큐리티는 스프링 기반의 어플리케이션의 보안(인증과 권한)을 담당하는 프레임워크입니다.

이를 사용하지 않으면, 개발자는 직접 세션을 체크하고, 리다이렉트 등의 보안 관련 작업을 처리해야 합니다.

그러나 스프링 시큐리티는 이러한 보안과 관련된 체계적이고 다양한 옵션들을 제공해줍니다.

스프링 시큐리티는 필터(Filter) 기반으로 동작하며 스프링 MVC와 분리되어 동작합니다.

그리고 스프링 시큐리티 3.2부터는 XML 설정이 아닌 자바 config 설정으로 간단하게 설정할 수 있습니다.

 

스프링 시큐리티를 이해하기 위해선 몇 가지 주요 보안 용어를 알아야 합니다:

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

 

스프링 시큐리티 필터(Spring Security Filter)

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

 

클라이언트에서 요청을 보내고 스프링 MVC에서 요청을 가장 먼저 받는 것은 DispatcherServlet입니다.

그러나 이 DispatcherServlet이 요청을 받기 전에 다양한 필터들이 존재합니다.

이 필터들은 클라이언트와 서버 사이에서 요청과 응답 정보를 이용해 다양한 처리를 합니다.

스프링 시큐리티는 이러한 필터들을 10개 이상 기본적으로 제공하며 이를 Security Filter Chain(시큐리티 필터 체인)이라고 합니다.

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

 

스프링 시큐리티의 필터들은 다음과 같은 역할을 담당합니다:

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

 

스프링 시큐리티 인증과정 아키텍처

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

해당 필터는 다음과 같이 동작합니다:

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

 

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

'Java > Spring' 카테고리의 다른 글

Spring이란?  (0) 2023.12.09
Spring Boot MySQL연동하기  (0) 2023.11.27
profile

열심히 살아나갈 사람

@쿼리_

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!