코드 그라데이션

[사전 지식] 스프링 시큐리티 본문

SpringBoot [예제] 블로그 만들기/시큐리티, JWT 입히기

[사전 지식] 스프링 시큐리티

완벽한 장면 2023. 10. 16. 18:46

스프링 시큐리티

  • 스프링 기반의 애플리케이션 보안(인증,인가,권한)을 담당하는 스프링 하위 프레임워크.
  • 스프링 시큐리티를 이해하려면 인증과 인가에 대한 개념을 알아야 한다.

 

인증과 인가

인증

  • 인증(authentication)은 사용자의 신원을 입증하는 과정.
  • 예를 들어 사용자가 사이트에 로그인을 할 때 누구인지 확인하는 과정.
  • 인가(authchzation)와는 다르다

인가

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

 

스프링 시큐리티

  • 스프링 시큐리티는 스프링 기반 애플리케이션의 보안을 담당하는 스프링 하위 프레임워크. 보안 관련 옵션을
    많이 제공한다.
  • 그리고 애너테이션으로 설정도 매우 쉽다. 
  • CSRF 공격, 세션 고정(session fixation) 공격을 방어해주고, 요청 헤더도 보안 처리를 해주므로 개발자가 보안 관련 개
    발을 해야 하는 부담을 크게 줄여준다.

CSRF 공격

  • 사용자의 권한을 가지고 특정 동작을 수행하도록 유도하는 공격

세션 고정 공격

  • 사용자의 인증 정보를 탈취하거나 변조하는 공격
스프링 시큐리티는 필터 기반으로 동작한다!

 

 

필터 기반으로 동작하는 스프링 시큐리티

<그림>

여러가지 스프링 시큐리티의 필터

 

- SecurityContextPersistenceFilter부터 시작해서 아래로 내려가며 FilterSecuritylnterceptor 까지 순서대로 필터를 거친다. 

- 필터를 실행할 때는 녹색 화살표로 연결된 오른쪽 박스의 클래스를 거치며 실행한다. 

- 원하는 때에는 특정 필터를 제거하거나 필터 뒤에 커스텀 필터를 넣는 등의 설정도 가능하다.

 

여기서 눈여겨볼 필터는 회색으로 색칠한 UsernamePasswordAuthenticationFilter와 FilterSecuritylnterceptor.

- UsernamePasswordAuthenticationFilter는 아이디와 패스워드가 넘어오면 인증 요청을 위임하는 인증 관리자 역할.

- FilterSecuritylnterceptor는 권한 부여 처리를 위임해 접근 제어 결정을 쉽게 하는 접근 결정 관리자 역할.

 

[표로 정리]

필터 이름 설명
SecurityContextPersistenceFilter SecurityContextRepository에서
SecurityContext(접근 주체와 인증에 대한 정보를 담고 있는 객체)를 가져오거나 저장하는 역할.
LogoutFilter 설정된 로그아웃 URL로 오는 요청을 확인해 해당 사용자를 로그아웃 처리
UsernamePassword
AuthenticationFilter
인증 관리자이다.

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

 

[그림]

 

사용자가 폼에 아이디와 패스워드를 입력하면HTTPServletRequest에 아이디와 비밀번호 정보가 전달된다.

이 때, AuthenticationFilter가 넘어온 아이디와 비밀번호의 유효성 검사를 수행한다.

유효성 검사가 끝나면 실제 구현체인 UsernamePasswordAuthenticationToken을 만들어 넘겨준다.

전달받은 인증용 객체인 UsernamePasswordAuthenticationTokenAuthenticationManager에게 보낸다.

UsernamePasswordAuthenticationTokenAuthenticationProvider에 보낸다.

사용자 아이디를 UserDetailService에 보낸다.

UserDetailService는 시용자 아이디로 찾은 사용자의 정보를 UserDetails 객체로 만들어 AuthenticationProvider에게 전달한다.

DB에 있는 사용자 정보를 가져온다

입력 정보와 UserDetails의 정보를 비교해 실제 인증 처리를 수행한다.

 

~ 까지 인증이 완료되면 SecurityContextHolderAuthentication를 저장한다.

- 인증 성공 여부에 따라 성공하면 AuthenticationSuccessHandler,

- 실패하면 AuthenticationFailureHandler 핸들러를 실행한다.

 
728x90
Comments