본문 바로가기

Spring

Spring Security의 개념과 Spring Security Filter Chain

728x90

 

1. Spring Security

  • api실행 시 마다 사용자를 인증해야 하는데, 이를 구현한 것이 스프링 시큐리티이다.
  • 스프링 기반의 어플리케이션의 보안(인증, 권한, 인가) 등을 담당하는 스프링의 하위 프레임워크이다.
    즉, 인증과 인가를 담당하는 프레임워크!
  • 주로 서블릿 필터와 이로 구성된 필터체인으로 구성된 위임 모델을 사용한다.
  • 보안과 관련해 체계적으로 많은 옵션을 제공하기 때문에 보안 관련 로직을 작성하지 않아도 된다는 장점이 있다.

 

2. 기본 용어

  • 인증(Authentication)
    • 사용자의 신원을 입증하는 과정으로 로그인하는 과정이라고 생각하면 된다.
  • 인가(Authorization)
    • 권한 부여나 허가와 같은 의미로 사용되고 어떤 대상이 특정 목적을 실현하도록 허용하는 것이다.
    • 권한에 따른 상이한 접근이라고 생각하면 된다.
  • 접근 주체(Principal)
    • 보호된 대상에 접근하는 유저
  • 권한
    • 인증된 주체가 어플리케이션의 동작을 수행할 수 있도록 허락되었는지를 결정할 때 사용하는 것이다.
    • 인가 과정에서 해당 리소스에 대한 제한된 최소한의 권한을 가졌는지를 확인하는데, 이 권한을 말하는 것!

 

3. Spring Security의 특징

  • 보안과 관련해 체계적으로 많은 옵션을 제공하기 때문에 편리하게 사용할 수 있다.
  • 필터 기반으로 동작해 MVC와 구분해 관리 및 동작한다.
  • 어노테이션을 통해 간단하게 설정할 수 있다.
  • 기본적으로 세션, 쿠키 방식으로 인증한다.
  • 인증 관리자와 접근 결정 관리자를 통해 사용자의 리소스 접근을 관리한다.
    • 인증 관리자는 UsernamePasswordAuthentacatioFilter, 접근 결정 관리자는 FilterSecurityInterceptor가 수행한다.

 

4. 인증 방식

  • credential 방식 : username, password를 이용하는 방식이다.
  • 이중 인증(twofactor 인증) : 사용자가 입력한 개인 정보를 인증한 후 다른 인증체계를 이용해 두 가지 조합으로
                                                인증하는 방식이다.
  • 하드웨어 인증 : 자동차 키와 같은 방식이다.
  • Spring Security는 이 중 credential 기반의 인증을 취한다.
    • username = Principal, password = Credential, username-password의 인증방식을 취함!!

 

5. Spring Security Filter Chain

  • fiter - servlet container의 필터
    • 서블릿 컨테이너의 filter는 dispatch servlet으로 가기 전에 먼저 적용된다.
    • filter들은 여러 개가 연결되어있어 filter chain이라고 불린다.
    • 모든 request들은 filter chain을 거쳐야 서블릿에 도착하게 된다.

 

  • Security의 filter
    • Spring Security는 DelegatingFilterProxy라는 필터를 만들어 메인 filter chain에 끼워넣고 그 아래 다시 SecurityFilterChain 그룹을 등록한다.
    • url에 따라 적용되는 filter chain을 다르게 하는 방법을 사용하고 , 어떤 경우에는 해당 filter를 무시하고 통과하게 할 수도 있다.
  • WebSecurityConfigureAdapter
    • filter chain을 구성하는 configuratino 클래스로 해당 클래스의 상속을 통해 filter chain을 구성할 수 있다.
    • configure(HttpSecurity http) 함수를 오버라이딩 해서 filter들을 세팅한다.
  • Secutiry filter의 종류
    • HeaderWriterFilter : Request의 Http 해더를 검사하여 header를 추가하거나 빼주는 역할을 한다.
    • CorsFilter : 허가된 사이트나 클라이언트의 요청인지 검사하는 역할을 한다.
    • CsrfFilter : Post나 Put과 같이 리소스를 변경하는 요청의 경우 내가 내보냈던 리소스에서 올라온 요청인지 확인한다.
    • LogoutFilter : Request가 로그아웃하겠다고 하는것인지 체크한다.
    • UsernamePasswordAuthenticationFilter : username / password 로 로그인을 하려고 하는지 체크하여 승인이 되면 Authentication을 부여하고 이동 할 페이지로 이동한다.
    • ConcurrentSessionFilter : 동시 접속을 허용할지 체크한다.
    • BearerTokenAuthenticationFilter : Authorization 해더에 Bearer 토큰을 인증해주는 역할을 한다.
    • BasicAuthenticationFilter : Authorization 해더에 Basic 토큰을 인증해주는 역할을 한다.
    • RequestCacheAwareFilter : request한 내용을 다음에 필요할 수 있어서 Cache에 담아주는 역할을 한다. 다음 Request가 오면 이전의 Cache값을 줄 수 있다.
    • SecurityContextHolderAwareRequestFilter : 보안 관련 Servlet 3 스펙을 지원하기 위한 필터라고 한다.
    • RememberMeAuthenticationFilter : 아직 Authentication 인증이 안된 경우라면 RememberMe 쿠키를 검사해서인증 처리해준다.
    • AnonymousAuthenticationFilter : 앞선 필터를 통해 인증이 아직도 안되었으면 해당 유저는 익명 사용자라고 Authentication을 정해주는 역할을 한다. (Authentication이 Null인 것을 방지!!)
    • SessionManagementFilter : 서버에서 지정한 세션정책에 맞게 사용자가 사용하고 있는지 검사하는 역할을 한다.
    • ExcpetionTranslationFilter : 해당 필터 이후에 인증이나 권한 예외가 발생하면 해당 필터가 처리를 해준다.
    • FilterSecurityInterceptor : 사용자가 요청한 request에 들어가고 결과를 리턴해도 되는 권한(Authorization)이 있는지를 체크한다. 해당 필터에서 권한이 없다는 결과가 나온다면 위의 ExcpetionTranslationFilter필터에서 Exception을 처리해준다.

 

 

 

 

[참고 자료]

https://velog.io/@seongwon97/Spring-Security-Filter%EB%9E%80

https://hello-judy-world.tistory.com/216

https://velog.io/@hope0206/Spring-Security-%EA%B5%AC%EC%A1%B0-%ED%9D%90%EB%A6%84-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EC%97%AD%ED%95%A0-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0#spring-security-architecture%EA%B5%AC%EC%A1%B0

728x90