개발자 취업준비/springboot

스프링시큐리티

naspeciallist 2025. 3. 11. 20:45

 

 

1. 스프링 시큐리티(Spring Security)란?


 

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

스프링 시큐리티를 이용하면 애플리케이션에 인증 및 기능을 빠르게 부여하며 인증 및 관한 보호 기능을 손쉽게 추가 할 수 있습니다.

 

스프링시큐리티를 이해 할려면 먼저 인증(authentication)과 인가(authorization)에 대해서 알아야합니다.

 

1. 인증(Authentication)

인증은 사용자의 신원을 입증하는 과정입니다. 예를 들어 사용자가 사이트에 로그인을 할 때 누구인지 확인하는 과정을 인증이라고 합니다.

 

2. 인가(Authorization)

인가는 사이트의 특정 부분에 접근 할 수 있는지 권한을 확인하는 작업입니다. 예를 들어 관리자는 관리자페이지에 들어갈 수 있지만 일반 사용자는 관리자 페이지에 들어갈 수 없습니다. 이런 권한을 확인하는 과정을 인가라고 합니다.

 

스프링시큐리티는 credential방식을 이용하여 인증과 인가를 거치게 됩니다.

credential방식이란 username과 password를 이용하여 인증을 처리하는 방식입니다.

 

스프링시큐리티는 필터기반으로 동작합니다. 스프링시큐리티는 아래와 같이 다양한 필터들로 나누어져 있어며 각 필터에서 인증, 인가와 관련된 작업을 처리합니다.

 

 

 

SecurityContextPersistenceFilter부터 시작해서 아래로 내려가며 FilterSecurityInterceptor까지 순서대로 필터를 거칩니다. 필터를 실행할 때는 오른쪽 박스의 클래스를 거치며 시행합니다. 필터를 제거하거나 필터뒤에 커스텀필터를 넣는 등의 설정을 할 수 있습니다. 

 

그럼 주요필터와 그 기능에 대해서 알아보겠습니다.

필터명 설명
SecurityContextPersistenceF ilter SecurityContextRepository에서 SecurityContext(접근 주체와 인증에 대한 정보를 담 고 있는 객체)를 가져오거나 저장하는 역할을 합니다.
LogoutFilter 설정된 로그아웃 URL로 오는 요청을 확인해 해당 사용자를 로그아웃 처리합니다.
UsernamePassword AuthenticationFilter 인증 관리자입니다. 폼 기반 로그인을 할 때 사용되는 필터로 아이디, 패스워드 데이터를 파싱 해 인증 요청을 위임합니다. 인증이 성공하면 AuthenticationSuccessHandler를, 인증에 실패하면 AuthenticationFailureHandler를 실행합니다.
DefaultLoginPageGenerating Filter 사용자가 로그인 페이지를 따로 지정하지 않았을 때 기본으로 설정하는 로그인 페이지 관련 필터입니다.
BasicAuthenticationFilter 요청 헤더에 있는 아이디와 패스워드를 파싱해서 인증 요청을 위임합니다. 인증이 성공하면 AuthenticationSuccessHandler를, 인증에 실패하면 AuthenticationFailureHandler 를 실행합니다.
RequestCacheAwareFilter 로그인 성공 후, 관련 있는 캐시 요청이 있는지 확라고인하고 캐시 요청을 처리해줍니다. 예를 들어 로그인하지 않은 상태로 방문했던 페이지를 기억해두었다가 로그인 이후에 그 페이지로 이동 시켜줍니다.
SecurityContextHolderAware RequestFilter HttpServletRequest 정보를 감쌉니다. 필터 체인 상의 다음 필터들에게 부가 정보를 제공 하기 위해 사용합니다.
AnonymousAuthentication Filter 필터가 호출되는 시점까지 인증되지 않았다면 익명 사용자 전용 객체인 Anonymous Authentication을 만들어 SecurityContext에 넣어줍니다.
SessionManagementFilter 인증된 사용자와 관련된 세션 관련 작업을 진행합니다. 세션 변조 방지 전략을 설정하고, 유효 하지 않은 세션에 대한 처리를 하고, 세션 생성 전략을 세우는 등의 작업을 처리합니다.
ExceptionTranslationFilter 요청을 처리하는 중에 발생할 수 있는 예외를 위임하거나 전달합니다.
FilterSecurityInterceptor 접근 결정 관리자입니다. AccessDecisionManager로 권한 부여 처리를 위임함으로써 접근 제어 결정을 쉽게 해줍니다. 이 과정에서는 이미 사용자가 인증되어 있으므로 유효한 사용자인 지도 알 수 있습니다. 즉, 인가 관련 설정을 할 수 있습니다.

 

 

스프링시큐리티 작동 과정


 

사용자가 로그인 할 시 이 사용자에 대한 확인과정을 거칩니다. 이 과정을 인증이라고 하며 아래의 단계를 통해 이루어집니다.

 

1. HTTP 요청 수신

클라이언트에서 아이디와 비밀번호를 입력해서 로그인 요청을 보냅니다. 이 요청은 서버로 전달 됩니다.

 

2. 인증필터가 요청을 가로챔

사용자의 로그인요청을 AuthenticationFilter가 가로챕니다. 요청에서 아이디와 비밀번호 정보를 추출합니다. 추출한 후 UsernamePasswordAuthentication Token이라는 객체를 만듭니다. 이 객체는 사용자의 아이디, 비밀번호 인정여부 등의 정보를 담고 있습니다.

 

3. AuthenticationManager에서 인증요청을 전달

AuthenticationFilter는 생성한 UsernamePasswordAuthenticationToken을 AuthenticationManager에게 전달합니다. AuthenticationManager는 여러 개의 AuthenticationProvider중 적절한 것을 선택하여 인증을 시도합니다.

 

4. AuthenticationProvider에서 인증 시도

AuthenticationManager는 여러개의 AuthenticationProvider중 적절한 것을 찾아 인증을 시도합니다.

스프링 시큐리티에서는 DaoAuthenticationProvider라는 기본 제공 인증 제공자를 사용합니다.

 

5. UserDetailsService에서 사용자 정보 요청

AuthenticationProvider는 UserDetailsService를 사용하여 실제 데이터베이스에서 사용자의 정보를 가져옵니다.

UserDetailsService의 핵심 역할은 사용자 정보를 불러오는 것 입니다.

UserDetailService는 보통 LoginService(또는 UserService)에서 구현됩니다.

 

6.UserDetails 객체를 생성

UserDetailsService는 데이터베이스에서 사용자의 정보를 찾아 UserDetails객체를 생성합니다. UserDetails는 사용자 아이디, 비밀번호, 권한등의 정보를 포함하는 객체입니다.

 

7. UserDetails를 AuthenticationProvider에게 전달

UserDetailsService가 반환한 UserDetails 객체를 AuthenticationProvider에게 전달합니다. AuthenticationProvider는 사용자가 입력한 비밀번호와 UserDetails에 저장된 비밀번호(해시값)을 비교합니다.

 

8.인증 성공 또는 실패

비밀번호가 일치하면 인증이 성공되고 Authentication 객체를 생성합니다.

비밀번호가 다르면 인증이 실패하고 AuthenticationException 예외가 발생합니다.

 

9. 인증 객체를 SecurityContext에 저장

인증에 성공하면 생성된 Authentication 객체를 SecurityContextHolder에 저장합니다.

SercurityContextHolder는 로그인한 사용자의 정보를 보관하는 역할을 합니다.

기본적으로 세션에 저장되므로 이후 요청에서도 사용자의 정보를 유지할 수 있습니다.

 

10. 로그인 성공 후 사용자 정보 유지

사용자가 로그인한 이후에는 SercurityContextHolder에 저장된 인증정보를 바탕으로 권한 검사를 수행합니다.

로그인한 상태를 유지하면서 보호된 페이지에 접근 할 수 있습니다.